通过 iptables 防火墙允许 systemd-timesyncd 的正确方法是什么?

What's the right way to allow systemd-timesyncd through iptables firewall?

首先,我这样设置防火墙以允许一切:

sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables --flush

然后,我检查 NTP 是否正常工作:

sudo systemctl daemon-reload
sudo systemctl restart systemd-timesyncd
timedatectl

我可以看到上面写着 System clock synchronized: yes

但是如果我重新启动并像这样设置我的防火墙(拒绝除 NTP 之外的所有内容):

sudo iptables -P INPUT REJECT
sudo iptables -P OUTPUT REJECT
sudo iptables -P FORWARD REJECT
sudo iptables -A INPUT -p udp --dport 123 -j ACCEPT
sudo iptables -A OUTPUT -p udp --sport 123 -j ACCEPT

然后我得到 System clock synchronized: no 并且时钟不同步。

根据上述步骤,我确信是防火墙阻止了 timesyncd。我读过(例如,here),这可能与服务打开的额外端口有关,或者使用 SNTP 而不是 NTP。我尝试了不同的规则组合,但没有成功,因为我不是 iptables 专家。

但必须有一种方法来设置它,使其在不完全禁用防火墙的情况下工作。

总结

--dport--sport互换了。

说明

对于我允许通过防火墙的其他服务,我的机器是服务器。对于 NTP,我的机器是 client。因为我原来的其余配置实际上看起来更像这样:

...
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 5353 -j ACCEPT
...
sudo iptables -A OUTPUT -p tcp --sport 443 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
sudo iptables -A OUTPUT -p udp --sport 5353 -j ACCEPT
...

我假设 --dportINPUT 一起使用,而 --sportOUTPUT 一起使用。但是,您必须考虑这意味着什么。要将 NTP 用作客户端,我需要允许来自 source 端口 123 的 INPUT 数据包,而不是输入数据包目标端口 123。同样,我需要允许 OUTPUT 数据包具有 destination 端口 123,而不是源 123 输出。

所以我的问题的答案是使用这个:

sudo iptables -P INPUT REJECT
sudo iptables -P OUTPUT REJECT
sudo iptables -P FORWARD REJECT
sudo iptables -A INPUT -p udp --sport 123 -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 123 -j ACCEPT