我有以下规则禁止组外用户使用界面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
) 只要系统具有此范围内的地址,就可以访问任何内容。发射从如果与源匹配,则该地址始终是允许的,但这似乎不是有意的。