我将我的默认iptables OUTPUT链设置为DROP数据包。 然后,我创build了一个防火墙规则,只允许ntp用户发送ntp数据包:
iptables -A OUTPUT -m owner --uid-owner ntp -p udp --dport 123 -j ACCEPT
但是,每隔10-20分钟我就会看到:
ntpd[27769]: sendto(<snip>) (fd=22): Operation not permitted
然后,我删除规则的-m owner --uid-owner ntp部分,并在其之前添加了一条日志规则:
iptables -A OUTPUT -p udp --dport 123 -j LOG --log-level debug \ --log-prefix "Spotted a NTP packet: " --log-uid
ntpd再次开始工作,并在内核环缓冲区,我看到:
Spotted a NTP packet: <snip> PROTO=UDP SPT=123 DPT=123 LEN=56 UID=0
我正在使用--log-uid切换到LOG目标,并且ntpd作为ntp用户(uid = 38)运行:
# ps auxf | grep ntpd ntp 27769 0.0 1.0 4512 4508 ? SLs Jan04 0:00 ntpd -u ntp:ntp -p /var/run/ntpd.pid
然而日志显示UID=0 。 我没有任何其他的系统发送ntp数据包,因为我不再得到Operation not permitted的Operation not permitted ,我敢肯定这是事实上ntpd发送数据包。
我想我没有与这些数据包的ntp用户匹配很好; 然而, 有人可以解释为什么iptables没有显示 这些数据包的 UID=38 ?
对于使用小于1024的端口的程序,它必须是root。 许多应用程序(如NTP)将启动,以root用户身份打开端口,然后将权限下放到某个已定义的帐户。
你的iptables规则有错误:
iptables -A OUTPUT -m owner --uid-owner ntp -p udp --dport 123 -j ACCEPT
如果您使用–uid-owner ,则需要定义uid – 数字值。
对于程序名称您需要另一个选项:– cmd-owner 。 正确的规则是:
iptables -A OUTPUT -m owner --cmd-owner ntp -p udp --dport 123 -j
详细的解释您可以阅读Oskar Andreasson的精彩书籍 。