自动统计日志文件中IP出现次数并添加iptables规则的实现方法

在网络安全领域,我们经常需要监控服务器的访问日志,并根据IP地址出现的频率来判断是否存在恶意访问。本文将介绍如何使用PHP编写一个脚本,自动统计日志文件中IP出现的次数,并根据设定的阈值自动添加iptables规则来阻止恶意IP的访问。

步骤:

1、首先,我们需要编写一个PHP函数来统计日志文件中IP出现的次数。函数的代码如下:
php 复制代码
function countIPOccurrences($logFile) {
    $ipCounts = array();

    $handle = fopen($logFile, 'r');
    if ($handle) {
        while (($line = fgets($handle)) !== false) {
            preg_match('/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/', $line, $matches);
            if (!empty($matches)) {
                $ip = $matches[0];

                if (array_key_exists($ip, $ipCounts)) {
                    $ipCounts[$ip]++;
                } else {
                    $ipCounts[$ip] = 1;
                }
            }
        }
        fclose($handle);
    }

    return $ipCounts;
}

里面具体正则根据你的log文件的情况来

2、接下来,我们需要获取当前日期,并构建日志文件的路径。代码如下:
php 复制代码
$date = date('Y-m-d');
$logFile = '/home/mydemo/storage/logs/special-'.$date.'.log';
3、然后调用上述函数来统计IP出现的次数,并将结果保存到一个数组中。代码如下:
php 复制代码
$ipOccurrences = countIPOccurrences($logFile);
4、接下来,我们需要读取已添加的iptables规则列表。代码如下:
php 复制代码
$ips = fopen('/home/mydemo/storage/logs/iptables_rules.txt', 'r');
$ipArr = [];
if ($ips) {
    while(($ip = fgets($ips)) !== false) {
        array_push($ipArr, $ip);
    }
    fclose($ips);
}
5、然后,我们遍历IP出现次数的数组,并根据设定的阈值判断是否需要添加iptables规则。如果IP出现次数超过阈值并且该IP不在已添加的规则列表中,则执行添加规则的操作。代码如下:
php 复制代码
foreach ($ipOccurrences as $ip => $count) {
    if ($count > 200 && !in_array($ip, $ips)) {
        $output = shell_exec('sh ' . '/home/mydemo/app/Sh/iptables.sh'. ' '.$ip);
        array_push($ipArr, $ip);

        // 将数组转换为带换行符的文本
        $ipText = implode('', $ipArr);

        // 打开文件追加模式
        $ips = fopen('/home/mydemo/storage/logs/iptables_rules.txt', 'a');

        if ($ips) {
            // 写入文本到文件
            fwrite($ips, $ip);
            fclose($ips);
        }

        echo "IP: $ip | Occurrences: $count" . PHP_EOL;
    }
}
6、最后,你可以将上述代码整理成一个完整的PHP脚本,并在服务器上定期运行该脚本来自动统计IP出现次数并添加iptables规则。

/home/mydemo/app/Sh/iptables.sh

bash 复制代码
echo "<<<<<<<<<<< 参数一:$1 <<<<<<<<"
sudo iptables -A INPUT -s $1 -j DROP >> /home/goodMorningAndNight/api/storage/logs/iptables.log 2>&1 &
相关推荐
半路_出家ren8 分钟前
传输层协议TCP、UDP
网络协议·tcp/ip·udp·tcp
ZeroNews内网穿透26 分钟前
服装零售企业跨区域运营难题破解方案
java·大数据·运维·服务器·数据库·tcp/ip·零售
神的孩子都在歌唱1 小时前
常见的网络攻击方式及防御措施
运维·服务器·网络
深度学习04071 小时前
【Linux服务器】-安装ftp与sftp服务
linux·运维·服务器
岑梓铭2 小时前
计算机网络第九章——数据链路层《局域网》
网络·笔记·计算机网络·考研·408
阿巴~阿巴~3 小时前
Linux 第一个系统程序 - 进度条
linux·服务器·bash
小白爱电脑3 小时前
什么是2.5G交换机?
运维·网络·5g·千兆宽带
游戏开发爱好者84 小时前
iOS 出海 App 安全加固指南:无源码环境下的 IPA 加固与防破解方法
websocket·网络协议·tcp/ip·http·网络安全·https·udp
我科绝伦(Huanhuan Zhou)4 小时前
华为泰山服务器重启后出现 XFS 文件系统磁盘“不识别”(无法挂载或访问),但挂载点目录仍在且无数据
运维·服务器·华为
2501_915921434 小时前
苹果App上架流程:不用Mac也可以上架的方法
websocket·网络协议·tcp/ip·http·网络安全·https·udp