允许 apache 使用 iptables 进行写入

允许 apache 使用 iptables 进行写入

从几天前开始,我的服务器就一直受到 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)。

相关内容