使用没有root权限的iptables

当以用户ec2-user身份运行以下脚本时,出现iptables v1.4.18: can't initialize iptables table filter: Permission denied (you must be root)错误消息iptables v1.4.18: can't initialize iptables table filter: Permission denied (you must be root)

脚本:

 #!/bin/sh # Offending IP as detected by mod_evasive # Add the following firewall rule (block IP) $IPTABLES -I INPUT -s $IP -j DROP 

我怎样才能运行iptables作为一个非root用户来阻止一个IP地址?

注意:这个脚本通常由mod_evasive调用

在脚本上设置setuid位,以便它始终以root身份运行。

 chown root myscript chmod u+s myscript 

基于你在这里提出的另一个评论,你遇到的问题是bash无法find你正在尝试运行的脚本。

当您运行的脚本或命令不在$PATH环境设置中定义的path之一时,您需要为其提供绝对path或相对path。 例如:

  • 如果脚本在/usr/local/bin ,则需要运行/usr/local/bin/scriptname.sh
  • 如果脚本位于主目录中,则需要运行/home/username/scriptname.sh~/scriptname.sh
  • 或者,您可以更改到该目录并使用./调用它: ./ ./scriptname.sh

另外,您可以通过修改.bash_profile.bashrc.profile来更新您的$PATH环境设置和脚本的path,具体取决于您使用的是什么env文件。

只需在命令之前添加sudo即可:

 #!/bin/sh # Offending IP as detected by mod_evasive # Add the following firewall rule (block IP) sudo $IPTABLES -I INPUT -s $IP -j DROP 

如果您的脚本是:

 /drop.sh 

看起来像这样:

 #!/bin/sh exec /sbin/iptables -I INPUT -s "$1" -j DROP 

然后在/etc/sudoers文件中添加一行,如下所示:

 www-data ALL=(root) NOPASSWD: /drop.sh 

注意,如果Apache作为除www-data之外的用户运行,则需要在此处使用该用户名。 这让Apache用户运行你的drop.sh

然后,最后一个mod_evasive的包装:

 #!/bin/sh exec sudo /drop.sh "$@"