使用 iptables 更改路由器上 NTP 请求的源端口

使用 iptables 更改路由器上 NTP 请求的源端口

我的 ISP 阻止了出站 udp 端口​​ 123。这阻止了 ntpd 获取 ntp 更新。如何让我的路由器(运行 Asuswrt Merlin 的华硕路由器)自动将端口号从 123 更改为其他端口号?我尝试使用以下 iptables 规则,但它似乎在路由器上不起作用。当我将它放在单个 Linux 机器上时,该规则有效,但我想避免在所有机器上都这样做。

iptables -t nat -I POSTROUTING 1 -p udp --sport 123 -j SNAT --to-source :12512

我认为在我的路由器上我需要同时进行端口更改和 MASQUERADE 但我不知道这是否可行。

这是我路由器上的 POSTROUTING nat 表条目。我尝试将 ntp 规则放在第一位和第二位。

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    SNAT       udp  --  anywhere             anywhere             udp spt:ntp to::12512
2    MASQUERADE  all  -- !<my external IP>    anywhere

答案1

我来晚了,但今天必须自己解决同样的问题。这个超级用户页面是我在研究这个问题时遇到的第一个谷歌结果之一,我想我会在这里添加一个解决方法,以节省未来搜索者的一些精力。

为 NTP 流量添加专门的伪装规则,并将--to-ports参数传递给 MASQUERADE 目标,您的正常伪装规则将强制进行源端口转换:

iptables -t nat -I POSTROUTING -p udp -m udp --sport 123 -j MASQUERADE --to-ports 60000-61000

AT&T 阻止源端口为 123 的出站 UDP 流量,以缓解来自客户网络上受感染机器的常见 NTP 反射攻击。允许使用目标端口 123,但大多数 NTP 客户端也使用 123 作为源端口。

您可以通过运行来验证它们的过滤是否对您有影响ntpdate。如果源端口 123 被过滤,ntpdate pool.ntp.org则会失败,而ntpdate -u pool.ntp.org则会成功。(-untpdate 的选项强制它使用非特权(>1024)源端口号。)如果两个测试都失败,或者两个测试都成功,那么其他问题就出现了,这种解决方法不太可能对您有帮助。

答案2

使用源 NAT 将源端口号从 123 重写不会改变您仍然连接到远程 NTP 服务器聆听目的地端口 123。当您的 ISP 阻止传出 NTP 流量时,他们可能会阻止到 dport 123 的 UDP 数据包,并且更改源端口不会产生任何影响。

只需询问您的 ISP,他们提供哪些 NTP 服务器供您使用。

答案3

为了使它在您的路由器上工作,您需要专门将您的外部接口(面向公共互联网)地址添加到规则中。否则,您将使用您的私有 IP 地址作为源将数据包发送到互联网上。您的特定内核、netfilter 版本的行为可能有所不同。您可以使用 tcpdump 验证发生了什么。

iptables -t nat -I POSTROUTING 1 -p udp --sport 123 -j SNAT --to-source {PUBLIC_IP}:12512

然后(假设 eth1 是面向互联网的接口):

tcpdump -ni eth1 port 123

这是我在 OpenWRT 上的 /etc/firewall.user 中的内容:

P_IP=`/sbin/ifconfig eth1 | awk '/inet addr/{print substr($2,6)}'`
/usr/sbin/iptables -t nat -I postrouting_rule -p udp -o eth1 --sport 123 --dport 123 -j SNAT --to $P_IP:12300

如果您想立即看到结果,请不要忘记在 OpenWRT 上对防火墙进行更改后刷新 conntrack 表:

echo f > /proc/net/nf_conntrack

否则,发生的事情真的会令人困惑。

相关内容