你能以非 root 用户身份列出 iptables 吗?为什么?

你能以非 root 用户身份列出 iptables 吗?为什么?

是否可以iptables --list … 在没有root权限的情况下执行该命令?

以非 root 身份运行它会打印以下内容:

$ iptables --list
iptables v1.4.21: can't initialize iptables table `filter': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded.

如果您必须是 root 才能列出 iptables,那么其背后的原因是什么?查看规则是否存在安全问题?是否有iptables --list 需要 root 访问权限使用的资源或服务?

显然,修改iptables防火墙规则需要权限。我想问一下是否可以观看它们。


除了 root 之外,是否有一种功能可以允许列出规则? iptables 是否使用 netlink 与内核交互?因为网络链接(7)提到

仅有效 UID 为 0 或 CAP_NET_ADMIN 能力可以发送或监听netlink多播组。

也许这不适用于 iptables。

我不确定这是否是正确的方法,但添加功能也不 iptables 能让我列出规则:

bash-4.1$ echo $UID
2000
bash-4.1$ getcap /sbin/iptables-multi-1.4.7
/sbin/iptables-multi-1.4.7 = cap_net_admin+ep
bash-4.1$ /sbin/iptables-multi-1.4.7 main --list
FATAL: Could not load /lib/modules/3.10.0-514.21.1.el7.x86_64/modules.dep: No such file or directory
iptables v1.4.7: can't initialize iptables table `filter': Permission denied (you must be root)
Perhaps iptables or your kernel needs to be upgraded. 

以下是一些相关问题:

在我看来,两者都提供了解决方法,但并没有讨论限制背后的根本原因。

答案1

似乎iptables需要 CAP_NET_RAW 和 CAP_NET_ADMIN 才能读取表。我试过

$ cp /usr/sbin/iptables ~/iptables  # note, it may be a symbolic link
$ sudo setcap CAP_NET_RAW,CAP_NET_ADMIN+ep  ~/iptables
$ ~/iptables  -nvL

没关系。

答案2

事实上,iptables使用netlink接口与内核进行通信。它打开一个 netlink 套接字xtables,然后通过该套接字发出命令。访问控制是在套接字打开时执行的,而不是针对单个命令,因此列出和修改规则需要相同的权限。允许用户列出规则但不修改它们的唯一方法是为他们提供精心编写的 setuid(或 setcap)可执行文件。

如果 中有一个 netfilter 的接口就好了/proc,但据我所知,实现它的任务从未完成。

答案3

这就是我所做的:

$ cat iptables-list.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main()
{
    if (setuid(0) != 0)
    {
        perror("setuid");
        return EXIT_FAILURE;
    }
    execl("/sbin/iptables", "iptables", "-L", "-n", NULL);
    perror("execl");
}
$ gcc -Wall -Werror -o iptables-list -s iptables-list.c
$ sudo mv iptables-list /sbin/iptables-list
$ sudo chown 0.0 /sbin/iptables-list
$ sudo chmod 4755 /sbin/iptables-list
$ ls -l /sbin/iptables-list
-rwsr-xr-x 1 root root 5552 Feb 23 08:14 /sbin/iptables-list
$ iptables-list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
...

答案4

在 Ubuntu 20.04.5 LTS Focal 上,我必须设置CAP_DAC_READ_SEARCH,CAP_NET_RAWCAP_NET_ADMIN功能。

如果你只设置CAP_NET_RAWCAP_NET_ADMIN,你会看到这样的错误:

Fatal: can't open lock file /run/xtables.lock: Permission denied

让我们看看它是如何工作的:

$ sudo cp /usr/sbin/ip6tables ~/ip6tables

$ sudo setcap cap_net_admin,cap_net_raw+ep ./ip6tables # not enough caps
$ ./ip6tables -nvL
Fatal: can't open lock file /run/xtables.lock: Permission denied

# CAP_NET_RAW + CAP_NET_ADMIN + CAP_DAC_READ_SEARCH capabilities
$ sudo setcap cap_dac_read_search,cap_net_admin,cap_net_raw+ep ./ip6tables 
$ ./ip6tables -nvL # works fine
Chain INPUT (policy ACCEPT 1813K packets, 4509M bytes)
=== /// ===

另外,请注意,如果您尝试运行程序并作为子进程执行 ip6tables,那么您必须将所需的功能传递给此类子进程。

对于Golang,请参见这个公关这段代码

相关内容