在我的网络中,我有一个带有 nftables 的 OpenWRT 路由器。我还有一个位于自己的网络(192.168.36.x)中的游戏服务器和另一个网络(192.168.1.x)中的客户端。在客户端中,我有一个应用程序触发广播数据包(255.255.255.255)以发现服务器应用程序的实例,这当然不会遍历网络。因此,我尝试利用 nftables DNAT 功能将广播数据包从 192.168.1.x 的客户端转发到 192.168.36.x 的服务器,但到目前为止还没有成功。
我设置了这个链:
table ip nat {
chain prerouting {
type nat hook prerouting priority dstnat; policy accept;
iif "br-lan" ip daddr 255.255.255.255 udp dport 10308-10310 dnat to 192.168.36.36
}
}
br-lan
连接 192.168.1.x 主机的路由器上的网桥在哪里,但服务器上似乎没有收到任何信息。我尝试过的其他变体没有成功:
iif br-lan ip daddr 192.168.1.255 udp dport 10308-10310 dnat to 192.168.36.36
iif br-lan meta pkttype broadcast udp dport 10308-10310 dnat to 192.168.36.36
iif br-lan udp dport 10308-10310 dnat to 192.168.36.36
ip daddr 255.255.255.255 udp dport { 10308, 10309, 10310 } dnat to 192.168.36.36
meta pkttype broadcast udp dport 10308-10310 dnat to 192.168.36.36
在所有这些中,特别有趣的是iif br-lan udp dport 10308-10310 dnat to 192.168.36.36
(即我没有在目标地址上放置任何过滤器):在这种情况下,似乎所有数据包实际上都转发到服务器,但不幸的是,这带来了另一个问题,因为应用程序触发本地广播数据包和远程单播发现数据包以从远程服务器获取信息,如果我路由所有这些数据包,我最终会得到无穷无尽的重复列表。所以我只需要将我的规则应用于我的本地广播数据包。
编辑:忽略上面的段落。我刚刚意识到这些数据包被正确转发只是因为它们不是广播数据包。
我是否以正确的方式处理这个问题?我还有什么可以尝试的吗?不幸的socat
是,这并没有帮助,因为这会重写客户端用来实际连接到服务器的源 IP 地址,所以这也不是一个选项。
答案1
我设法解决了我的问题!从中汲取灵感这个答案,这条规则非常有效:
#!/usr/sbin/nft -f
table netdev dcs_broadcast
delete table netdev dcs_broadcast
table netdev dcs_broadcast {
chain dcs_lan { type filter hook ingress device br-lan priority 0;
pkttype broadcast ether type ip udp dport 10308-10310 counter fwd to br-36
}
}