iptables:禁止通过GID访问接口,除非它是本地网络

iptables:禁止通过GID访问接口,除非它是本地网络

我有以下规则禁止组外用户使用界面fullnetwork

iptables -I OUTPUT -o eth+  -m owner \! --gid-owner fullnetwork -j REJECT

如何允许 以外的用户使用本地网络fullnetwork

我已经尝试过这个,但没有成功

ipset create local hash:net
ipset add local 192.168.0.0/16
ipset add local 172.16.0.0/16
ipset add local 10.0.0.0/8
iptables -I OUTPUT -o eth+  -m owner \! --gid-owner fullnetwork -j REJECT
iptables -I OUTPUT -o eth+  -m owner \! --gid-owner fullnetwork -m set --match-set local src -j ACCEPT

答案1

所需的功能已添加到iptables>= 1.8.4内核5.3左右(并且根本不可用nftables): 也匹配补充组,而不仅仅是当前(主要)组:--suppl-groups:

--suppl-groups

导致指定的组--gid-owner也在进程的补充组中进行检查。

如果没有此选项,并且不直接使用该组(例如使用 )sg fullnetwork,甚至可以使用此命令:

iptables -I OUTPUT -o eth+  -m owner \! --gid-owner fullnetwork -j REJECT

无法达到公布的效果:不允许该组fullnetwork仅在补充组列表中的用户使用网络。

因此,要根据需要进行此匹配并拒绝其他用户,应该使用例如:

iptables -I OUTPUT -o eth+  -m owner ! --gid-owner fullnetwork --suppl-groups -j REJECT

为了保持一致,在例外中添加例外不应成为接受规则,否则用户fullnetwork对本地网络的访问权限可能比仅允许访问某些 LAN 的用户少,以防在以后的规则中添加进一步的限制。相反,创建一个用户链将规则组织在一起,并让它们通过 RETURN 判决摆脱拒绝,而无需使用 ACCEPT 判决并以单个 REJECT 判决结束。替换之前的两个iptables规则:

iptables -N reject_non_allowed_on_eth

iptables -A reject_non_allowed_on_eth -m owner --gid-owner fullnetwork --suppl-groups -j RETURN
iptables -A reject_non_allowed_on_eth -m set --match-set local dst -j RETURN
iptables -A reject_non_allowed_on_eth -j REJECT

iptables -I OUTPUT -o eth+ -j reject_non_allowed_on_eth

这可以这样读:

  • 如果使用以太网接口,

    • 如果在fullnetwork团体中,请退出
    • 如果到达专用 LAN,则退出
    • 剩下的任何内容均未授权:拒绝它
  • 稍后可以添加更多规则以进一步过滤剩余的数据包

另请注意另一个变化:比赛在目的地( dst) 而不是来源( src) 只要系统具有此范围内的地址,就可以访问任何内容。发射如果与源匹配,则该地址始终是允许的,但这似乎不是有意的。

相关内容