我可以从仅具有功能的 C Linux 程序内部添加 iptables 规则吗?或者我是否需要 root?

我可以从仅具有功能的 C Linux 程序内部添加 iptables 规则吗?或者我是否需要 root?

我需要从 C Linux 程序内部添加 iptables 规则。

我应该怎么做?我是否需要 root 权限,或者我可以只授予一些功能吗?

我尝试授予 CAP_NET_RAW+iep 并使用 popen()、system() 和 execve() 来设置 iptables,但它不起作用。

当我 sudo 时它显然有效,但我不想授予 root 权限。

谢谢。

答案1

您不需要向用户授予 root 权限。您可以编辑 sudoers 文件,并且可以限制用户可以通过 sudo 运行哪些命令。另外,您可以在 sudoers 文件中提供 NOPASSWD 选项。

MY_USER_NAME  ALL = NOPASSWD: /sbin/iptables

编辑 sudoers 文件后,MY_USER_NAME 可以运行“sudo iptables”命令。并且无法运行任何其他需要权限的命令。

使用“visudo”命令编辑 sudoers 文件。

答案2

对于 iptables v1.8.4(旧版),以下功能应允许您运行iptablesiptables-save/restore命令:

setcap cap_dac_read_search,cap_net_admin,cap_net_raw+ep /path/to/your/bin

您可以通过复制xtables-legacy-multi二进制文件并手动添加上述功能来测试这一点:

sudo cp /usr/sbin/xtables-legacy-multi ipt
chown ipt user:user # Some non root user
# Test a command
./ipt iptables -I INPUT -m state --state INVALID -j DROP
# Should see errors here...
# Update caps
sudo setcap cap_dac_read_search,cap_net_admin,cap_net_raw+ep ipt
# Now test a rule
./ipt iptables -I INPUT -m state --state INVALID -j DROP
echo $?
# Should see a successful exit code of 0 for valid rules

另一种方法是使用libnftnl netfilter 的 netlink 库,但是上述功能仍然适用(可能有例外cap_dac_read_search)。

相关内容