我们的一台服务器每天都会受到大量垃圾邮件机器人的攻击。它们无法发布任何垃圾邮件,但仍会尝试降低真实用户的服务器速度。
为了解决这个问题,我在网站上运行了一个 PHP 脚本,用于检测他们的 IP 地址。但是,我希望此脚本自动将这些 IP 地址添加到防火墙(而不是我必须手动执行此操作)。运行如下内容:
iptables -I INPUT -j DROP -s 123.123.123.123
但是,命令似乎iptables
只能以 root 身份运行。有什么办法吗?我想我可以将命令添加到root
通过 cron 运行的文件中,但我并不希望在 php 脚本决定禁止 IP 和添加禁止之间有任何延迟。
答案1
让您的 PHP 脚本将有问题的 IP 地址写入日志文件。接下来,安装失败禁止并将其配置为读取您的日志文件。
答案2
最简单的方法是,正如您所建议的那样,让您的脚本将有问题的 IP 写入日志文件。然后,您可以让另一个脚本(以 root 身份)循环运行,读取文件并发送命令iptables
。例如:
#!/bin/bash
while true
do
while read IP
do
## Check if this IP is already banned
if ! iptables -L INPUT -v -n | grep $IP >/dev/null
then
## If it is not banned, ban it
iptables -I INPUT -j DROP -s $IP
fi
done < $1
## Sleeping to avoid spamming, if even a one second
## delay is too slow for you(!) adjust as needed.
sleep 1
done
然后,您可以让这个脚本在启动时以 root 身份运行,可以作为服务运行,也可以为 root 创建此 crontab:
@reboot /path/to/banips.sh logfile.txt
我假设您担心的延迟是 cron 的一分钟间隔最小值。由于脚本将无限循环运行,因此您不需要使用 cron 每分钟运行它,延迟由您决定。就目前情况而言,脚本将每秒读取一次日志文件。
答案3
作为现有答案的替代方案并添加sshguard
(名字不太好,但其范围远远超出了名称所暗示的范围)对于上面提到的 Fail2Ban,我想向您推荐它sudo
。
该文件/etc/sudoers
可以配置为严格控制谁可以以谁的身份在哪台机器上运行什么。因此,你可以编写一个小包装器,就像特登回答,然后chown root:
检查它,并确保其权限设置严格。将其放入一个文件夹,/usr/sbin
并允许它以任何用户帐户的身份运行root
您的 PHP 脚本。如果您的脚本在 Web 服务器上下文中运行并且已 chrooted,请确保该脚本位于 chroot 内。请记住,如果您的脚本编写得不好,这可能会被用来破坏 chroot“监狱”。示例行/etc/sudoers
可能是:
www-data ALL= (root) NOPASSWD: /usr/sbin/yourscript.sh
它允许用户在所有机器上无需输入密码即可www-data
运行(可以是网络中所有机器的中心密码,这就是为什么......)。/usr/sbin/yourscript.sh
root
sudoers
sudo
被认为比suid
在脚本上设置位更安全,但我认为有充分的理由使用此替代方法,例如当没有sudo
可用时。
您还可以查看这个答案我放弃了姐妹 SE 网站 askubuntu.com。
答案4
CAP_DAC_READ_SEARCH
您可以尝试使用、CAP_NET_RAW
和功能运行您的流程CAP_NET_ADMIN
。
我在 Ubuntu 20.04.5 LTS Focal 上尝试过。
请参见这个答案