我的 ISP 阻止了出站 udp 端口 123,这导致我的路由器无法通过 NTPD 更新时间。
对于这种情况,我获得了一些有关通过 iptables 更改 NTP 默认端口 123 的信息,但无法使其工作。
我的情况是这样的:
发送请求:我的路由器(src_port:123)->我的路由器(iptables 将 123 更改为 1077)-> ISP -> NTP 服务器(1077 用于 NTP 服务)
接收响应:我的路由器(src_port:123)<-我的路由器(iptables 将 1077 更改为 123)<- ISP <- NTP 服务器(1077 用于 NTP 服务)
谢谢。
答案1
如果只需要更改本地端口,则可以使用基本的 SNAT 规则:
iptables -t nat -A POSTROUTING -o wan -p udp --sport 123 -j SNAT --to :2345
iptables -t nat -A POSTROUTING -o wan -p udp --sport 123 -j SNAT --random
iptables -t nat -A POSTROUTING -o wan -p udp --sport 123 -j MASQUERADE --to-ports 2345-6789
iptables -t nat -A POSTROUTING -o wan -p udp --sport 123 -j MASQUERADE --random
请注意,iptables NAT 是有状态的(即使对于 UDP)– 第一个数据包通过表nat
并导致在 conntrack 数据库中创建“流”条目,并且与该条目匹配的所有其他数据包都会立即使用缓存的信息,而无需重新检查规则。(这也是允许 iptables 自动取消 SNAT/取消 MASQUERADE 传入回复数据包的原因。)
对于 UDP,conntrack 条目不会持续很长时间 - 默认情况下,它们会在 180 秒不活动后过期。您还可以使用conntrack -D -p udp --orig-port-src 123
手动删除所有与 NTP 相关的流条目并强制重新检查 NAT 规则。
或者,使用已经动态选择本地端口的 (S)NTP 客户端。我认为 Chrony 和 systemd-timesyncd 都可以这样做,不会造成任何问题。