我尝试使用此命令阻止用户sandbox
访问网络:
$ iptables -A OUTPUT -m owner --uid-owner sandbox -j DROP
然而,此后我仍然可以 ping 外部主机:
$ sudo -u sandbox ping 206.190.36.45
PING 206.190.36.45 (206.190.36.45) 56(84) bytes of data.
64 bytes from 206.190.36.45: icmp_req=1 ttl=49 time=802 ms
64 bytes from 206.190.36.45: icmp_req=2 ttl=49 time=791 ms
我究竟做错了什么?
更新
我的配置如下:
$ /sbin/iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DROP all -- anywhere anywhere owner UID match sandbox
更新
显然ping
已经setuid root
设置了。我只需要将其删除:
chmod u-s /bin/ping
答案1
如果ping
您的系统上的 setuid 是 root,则它将root
打开套接字并从中ping
发送其 ICMP 回显请求。因此规则永远不会匹配。
(请注意,这在 EL6、Debian squeeze 等上是正确的。较新的发行版已删除 ping 的 setuid 位并将其替换为功能。在这些情况下,规则可能会匹配。)
答案2
您是否已确定已加载必要的 iptable 模块?
尝试
modprobe ipt_owner
在控制台上。