ntpd以非root用户身份运行,但传出的数据包与uid 0匹配

我将我的默认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 permittedOperation 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的精彩书籍 。