我将默认的 iptables OUTPUT 链设置为 DROP 数据包。然后我创建了一条防火墙规则,只允许 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
,我确信事实上是ntpd
它发送了数据包。
我想我可以不匹配这些数据包的 ntp 用户;然而,有人能解释一下为什么 iptables 没有显示 UID=38
这些数据包?
答案1
如果某个程序要使用小于 1024 的端口,则必须以 root 身份运行。许多应用程序(如 NTP)将启动并以 root 身份打开端口,然后将其他所有权限移交给某个已定义的帐户。
答案2
您的 iptables 规则有错误:
iptables -A OUTPUT -m owner --uid-owner ntp -p udp --dport 123 -j ACCEPT
如果你使用--uid 所有者有必要定义用户ID- 数字值。
对于程序名称,您需要另一个选项:--cmd 所有者。正确的规则是:
iptables -A OUTPUT -m owner --cmd-owner ntp -p udp --dport 123 -j
详细解释您可以阅读书经过奥斯卡·安德烈森。