iptables --gid-owner 仅适用于用户的主组

use*_*179 6 firewall iptables owner

我试图禁止除“neta”组成员之外的所有用户访问 IP 1.2.3.4。这是我专门为此创建的一个新组。

iptables -I OUTPUT -o eth0 -p tcp -d 1.2.3.4 -m owner ! --gid-owner neta -j REJECT
Run Code Online (Sandbox Code Playgroud)

这将禁止所有用户访问 1.2.3.4,即使他们是“neta”组的成员。

我有一个用户 xx,他是 xx(主组)和 neta 组的成员。如果我将规则更改为:

iptables -I OUTPUT -o eth0 -p tcp -d 1.2.3.4 -m owner \! --gid-owner xx -j REJECT
Run Code Online (Sandbox Code Playgroud)

除了用户 xx 之外的所有人都无法访问 1.2.3.4。

我将 root 添加到这个组 xx:

usermod -a -G xx root
Run Code Online (Sandbox Code Playgroud)

但是 root 仍然无法访问这个 IP。如果我将主用户的组(root,xx)添加到规则中,一切都按预期工作。

我试着把它分成两个规则来确定(并拒绝日志):

iptables -A OUTPUT -o eth0 -p tcp -d 1.2.3.4 -m owner --gid-owner neta -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -d 1.2.3.4 -m limit --limit 2/s --limit-burst 10 -j LOG
iptables -A OUTPUT -o eth0 -p tcp -d 1.2.3.4 -j REJECT
Run Code Online (Sandbox Code Playgroud)

但没有区别。一切都在被拒绝。

没有其他 iptables 规则。

root@vm1:~# iptables -nvL
Chain INPUT (policy ACCEPT 19 packets, 1420 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 10 packets, 1720 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     tcp  --  *      eth0    0.0.0.0/0            1.2.3.4     owner GID match 1001 
    0     0 LOG        tcp  --  *      eth0    0.0.0.0/0            1.2.3.4     limit: avg 2/sec burst 10 LOG flags 0 level 4 
    0     0 REJECT     tcp  --  *      eth0    0.0.0.0/0            1.2.3.4     reject-with icmp-port-unreachable 
Run Code Online (Sandbox Code Playgroud)

我希望能够(禁止)通过从这个“neta”组中添加/删除用户而不是为每个用户添加 iptables 规则来允许访问这个 IP。

小智 5

好吧,老实说,我对 linux 和 iptables 知之甚少,以确保我的理论,但因为我想在这里对 VPN 做同样的事情。

我假设匹配是使用数据包来源的进程完成的,并且 linux 进程不会分配用户的所有组,而是一个进程以一个uid 和一个gid 运行。

这意味着您必须使用此特定组显式执行命令,否则将使用用户的默认组执行命令/进程。


写到这里我有了一个想法,看看是否有这种可能性。我使用组 VPN 限制了对某个 IP 范围的访问。这从来没有奏效。现在我使用以下命令进行了测试,并且可以正常工作:

sg vpn -c "ssh user@10.15.1.1"
Run Code Online (Sandbox Code Playgroud)

所以我希望我的理论是正确的。