从几天前开始,我的服务器就一直受到 DDOS 攻击。我在 apache 中安装了 mod_evasive,它运行正常!它会写入日志并发送带有 IP 的电子邮件。
但有一个问题:Apache 没有在 iptables 中添加 DROP 规则(或者至少没有出现)
我在 Plesk 中使用 apache,配置文件如下:
DOSHashTableSize 3097
DOSPageCount 1
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 1
DOSBlockingPeriod 600
DOSSystemCommand "sudo /sbin/iptables -A INPUT -s %s -j DROP"
DOSEmailNotify "[email protected]"
DOSLogDir "/var/log/evasive/"
这是我的“sudoers”文件:
apache ALL=(ALL) NOPASSWD: /sbin/iptables -A INPUT -s [0-9.]* -j DROP
但这没有帮助。
提前致谢。
答案1
允许 apache 以 root 权限运行 iptables 听起来是个很糟糕的主意 - 我假设您有 root 访问权限。如果是我,我会使用代理程序(如 fail2ban)来筛选日志并编写规则。
我在 visudo 中写道:
您是否检查过已部署到 /etc/sudoers 的内容?
从手册页中:
如果 Cmnd 具有关联的命令行参数,则 Cmnd 中的参数必须与用户在命令行上给出的参数完全匹配(或匹配通配符,如果有)
您使用了正则表达式而不是通配符。请尝试:
apache ALL=(ALL) NOPASSWD: /sbin/iptables -A INPUT --dport 80 -s * -j DROP
虽然更好的想法是将功能包装在脚本中而不是直接调用 iptables。(请注意,我已明确设置端口以避免您将自己锁定 - 我假设您有 ssh 访问权限)。
答案2
在“ visudo
”中,将 ALL 更改为 root,并跳过 iptables 的参数:
apache ALL=(root) NOPASSWD: /sbin/iptables
确保开头apache
是运行 Web 服务器的用户的名称。(使用ps -ef|egrep -e 'apache|http'
然后将您DOSSystemCommand
的
DOSSystemCommand "sudo -u root /sbin/iptables -A INPUT -s %s -j DROP"
更好的解决方案:创建一个由 root 拥有的、其他任何人都无法修改的脚本,让该脚本运行 iptables,并让 apache 调用该脚本(在 sudo 中启用该脚本而不是 iptables)。