代码片段
日志ip读取
最近服务器总是有一些乱七八糟的请求进来,域名解析到我服务器没修改的,检查服务器漏洞的爬虫,尝试访问爆破wordpress后台的,尝试访问已知的路由器漏洞页面的。如下:
于是我新建了个 vhost 把所有直接请求 ip 地址的和一些恶意的请求全都定向到这个 vhost ,并统一返回状态码 666 (╯‵□′)╯︵┻━┻。然后写了个 php 脚本统计日志中记录的这些请求的 ip 地址。定时每天凌晨运行一次,然后抽时间就统一把这些 ip 加到黑名单里。
以下是源码。
代码
PHP脚本
<?php
/**
* 将日志中的 IP 信息存储到文件中
* @param $log_file_path string 要处理的的文件路径
* @param $save_file_path string 要存储的目标文件路径
* @param $explode_str string 拆分日志中字符串所需参数,默认为' - - '
* @return string 执行结果
*/
function get_log_ip ($log_file_path, $save_file_path, $explode_str = ' - - ') {
// 将日志字符串拆分到数组中
$n0 = fopen($log_file_path, 'r');
$g = explode("\n", fread($n0, filesize($log_file_path)));
fclose($n0);
// 按指定规范将字符串截断(只保留IP)(前提是IP在行首)
foreach($g as $k => $v) {
$g[$k] = substr($v, 0, strpos($v, $explode_str));
}
// 数组去重
$g = array_unique($g);
// 文件操作// 读取文件中的IP
$nr = fopen($save_file_path, 'r');
$yuan_ip = explode("\n", fread($nr, filesize($save_file_path)));
fclose($nr);
// 写入文件末尾
$n = fopen($save_file_path, 'a');
foreach($g as $v) {
// 如果原文件中存在此IP,则跳过
if(in_array($v, $yuan_ip)){
continue;
}else{
fwrite($n, $v."\n");
}
}
fclose($n);
return 'success!';
}
echo get_log_ip($argv[1], $argv[2]);
服务器定时器脚本
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
php 脚本路径 日志文件路径 存放的路径
echo "----------------------------------------------------------------------------"
endDate=`date +"%Y-%m-%d %H:%M:%S"`
echo "[$endDate] 任务执行成功"
echo "----------------------------------------------------------------------------"
以下是最近一周的成果:已经采集了 500 多个不同的 ip 了。只要将这些 ip 添加到黑名单或防火墙即可。
PS
- 脚本默认的认为日志文件中每行开头为 ip 地址。
- nginx 和 apache 的日志文件可以直接用,除非你改过 logFormat 参数。
- 我还没想办法避免自己的 ip 被加到黑名单,自己不去访问就行吧。
本文由 root 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Jul 27, 2017 at 08:36 am
see understand!