![在没有 root 权限的情况下使用 iptables](https://linux22.com/image/643676/%E5%9C%A8%E6%B2%A1%E6%9C%89%20root%20%E6%9D%83%E9%99%90%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E4%BD%BF%E7%94%A8%20iptables%20.png)
以用户身份运行以下脚本时ec2-user
,我收到错误消息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 调用
答案1
在脚本上设置 setuid 位,以便它始终以 root 身份运行。
chown root myscript
chmod u+s myscript
答案2
根据您在此处发表的另一条评论,您遇到的问题是 bash 找不到您尝试运行的脚本。
当您运行的脚本或命令不在$PATH
环境设置中定义的路径中时,您需要为其提供绝对路径或相对路径。例如:
- 如果脚本在,
/usr/local/bin
您需要运行/usr/local/bin/scriptname.sh
。 - 如果脚本位于您的主目录中,您需要运行
/home/username/scriptname.sh
或~/scriptname.sh
。 - 或者,您可以切换到该目录并
./
像这样调用它:./scriptname.sh
您还可以通过修改、或$PATH
来使用脚本路径更新环境设置,具体取决于您所使用的环境文件。.bash_profile
.bashrc
.profile
答案3
只需在命令前添加 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
答案4
如果你的脚本是:
/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 "$@"