ntpd 以非 root 身份运行,但传出数据包匹配为 uid 0

Cor*_*son 4 iptables ntpd

我将默认的 iptables OUTPUT 链设置为 DROP 数据包。然后我创建了一个防火墙规则,只允许 ntp 用户发送 ntp 数据包:

iptables -A OUTPUT -m owner --uid-owner ntp -p udp --dport 123 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

但是,每 10-20 分钟我就会看到:

ntpd[27769]: sendto(<snip>) (fd=22): Operation not permitted
Run Code Online (Sandbox Code Playgroud)

然后我删除了-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
Run Code Online (Sandbox Code Playgroud)

ntpd 再次开始工作,在内核环形缓冲区中,我看到:

Spotted a NTP packet: <snip> PROTO=UDP SPT=123 DPT=123 LEN=56 UID=0
Run Code Online (Sandbox Code Playgroud)

我正在使用--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
Run Code Online (Sandbox Code Playgroud)

然而日志显示UID=0。我的系统上的其他正面没有被发出NTP报文,并且因为我不再得到Operation not permitted,我敢肯定它是,实际上ntpd多数民众赞成在发送数据包。

我想我可以不匹配这些数据包的 ntp 用户;但是,有人可以解释为什么 这些数据包没有显示 iptablesUID=38 吗?

Zor*_*che 6

对于使用小于 1024 端口的程序,它必须是 root。许多应用程序(如 NTP)将启动,以 root 用户身份打开端口,然后将权限授予某些已定义帐户的其他所有内容。