iptables - 非以 root 身份添加规则

iptables - 非以 root 身份添加规则

我们的一台服务器每天都会受到大量垃圾邮件机器人的攻击。它们无法发布任何垃圾邮件,但仍会尝试降低真实用户的服务器速度。

为了解决这个问题,我在网站上运行了一个 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.shrootsudoers

sudo被认为比suid在脚本上设置位更安全,但我认为有充分的理由使用此替代方法,例如当没有sudo可用时。

您还可以查看这个答案我放弃了姐妹 SE 网站 askubuntu.com。

答案4

CAP_DAC_READ_SEARCH您可以尝试使用、CAP_NET_RAW和功能运行您的流程CAP_NET_ADMIN

我在 Ubuntu 20.04.5 LTS Focal 上尝试过。

请参见这个答案

相关内容