现在很多站长都会遇到黑客对服务器进行扫描、注入,我们下面就使用Fail2ban来自动封禁这些IP,能够匹配的规则包含如下:
常见扫描路径
SQL 注入特征
XSS 特征
PHP 敏感文件/后门探测
大量 4xx/5xx 状态码请求
一、创建自定义过滤规则(Filter)
宝塔 → 软件商店 → 找到 Fail2ban → 设置 → 配置修改(或直接用文件管理)
进入目录:/etc/fail2ban/filter.d/
新建文件:nginx-attack.conf,内容如下:
[Definition] failregex = ^<HOST> .* "(GET|POST|HEAD|PUT|DELETE).*HTTP.*" (400|401|403|404|444|499|500|502|503).* ^<HOST> .* "(GET|POST).*(\.php\?|\.asp|\.aspx|\.jsp|/admin|/manage|/phpmyadmin|/wp-login|/xmlrpc\.php|/shell|/eval|/base64|/union.*select|/select.*from|/insert.*into|/update.*set|/delete.*from|/drop.*table|/script>|<script|/onerror=|/onload=|/javascript:).*HTTP.*" ^<HOST> .* "(GET|POST).*(union.*select|select.*from|insert.*into|update.*set|delete.*from|drop.*table|sleep\(|benchmark\(|load_file\(|into\s+outfile|into\s+dumpfile).*HTTP.*" ^<HOST> .* "(GET|POST).*(xss|onmouseover|onerror|onload|javascript:|alert\(|document\.cookie|<script).*HTTP.*" ^<HOST> .* "(GET|POST).*(/\.env|/\.git|/config\.php|/phpinfo|/actuator|/solr|/console|/invoker|/manager/html).*HTTP.*" ignoreregex =
保存。设置权限为644
二、创建 Jail(监狱规则)
编辑文件:/etc/fail2ban/jail.local (如果没有就新建,或者编辑 jail.d/ 下的文件)
在文件末尾添加以下内容:
[nginx-attack] enabled = true port = http,https filter = nginx-attack logpath = /www/wwwlogs/*.log maxretry = 8 findtime = 300 bantime = 3600 action = iptables-multiport[name=nginx-attack, port="http,https"]
我这里logpath使用的是通配符,也可以更精准一些,如下:
logpath = /www/wwwlogs/*yourweb.com.log /www/wwwlogs/www.yourweb.com.log
参数说明:
| 参数 | 含义 | 建议值 |
|---|---|---|
| maxretry | 多少次违规后封禁 | 8(可调低到 5) |
| findtime | 统计时间窗口(秒) | 300(5分钟) |
| bantime | 封禁时长(秒) | 3600(1小时),可改成 86400(1天) |
| logpath | 监控的日志文件 | 按你实际日志路径填写 |
三、重启 Fail2ban 使配置生效
在宝塔终端或 SSH 执行:
fail2ban-client reload # 或者 systemctl restart fail2ban
查看是否加载成功:
fail2ban-client status fail2ban-client status nginx-attack
四、常用管理命令
# 查看当前被封禁的 IP fail2ban-client status nginx-attack # 手动解封某个 IP fail2ban-client set nginx-attack unbanip 攻击IP # 手动封禁某个 IP fail2ban-client set nginx-attack banip 攻击IP # 查看 Fail2ban 日志 tail -f /var/log/fail2ban.log
五、建议调整
先观察 1 天:把 bantime 设短一点(比如 1800 秒),确认没有误封正常用户。
如果扫描特别猛,可以把 maxretry 降到 5,findtime 降到 180。
宝塔面板端口、SSH 端口建议也一起保护(可以另外写 jail)。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
相关文章