通过 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
...
我假设 --dport
与 INPUT
一起使用,而 --sport
与 OUTPUT
一起使用。但是,您必须考虑这意味着什么。要将 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
首先,我这样设置防火墙以允许一切:
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
...
我假设 --dport
与 INPUT
一起使用,而 --sport
与 OUTPUT
一起使用。但是,您必须考虑这意味着什么。要将 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