我的普通网络 (192.168.1.0/24) 和 IoT 网络 (192.168.2.0/24) 位于不同的 VLAN(分别为设备 switch0 和 switch0.30)。我的防火墙设置为普通网络的客户端可以访问 IoT 网络上的设备,但反过来不行。所有这些都是在 Ubiquity edgerouter X 上设置的。
现在我有了一个新的 IoT 设备,它有一个配套的 Android 应用程序。当我将 Android 设备连接到 IoT 网络时,该应用程序运行良好。
为了进行发现,应用程序会将一个空的 UDP 包发送到端口 9987 上的 255.255.255.255。然后,设备会向源 IP 发送一个空的单播包。这样,应用程序就知道了设备的 IP,并可以通过另一个端口直接进行通信。
当我的 Android 设备连接到我的普通网络时,我也想使用此应用程序。这种发现机制显然在此设置中不起作用,因为这两个网络是不同的广播域。路由器永远不会将广播路由到另一个网络。
我通过 iptables 添加了以下规则:
iptables -t nat -I PREROUTING -i switch0 -p udp --dport 9987 -j DNAT --to-destination 192.168.2.183:9987
当我启动应用程序时,我可以看到符合规则的包:
iptables -t nat -L PREROUTING -v
当我使用 监控传入流量时,tcpdump -i switch0 port 9987
我可以看到传入的数据包。但我永远看不到通过 switch0.30 传出的数据包tcpdump -i switch0.30 port 9987
。
正如cat /proc/sys/net/ipv4/conf/*/rp_filter
所有显示的那样0
,我认为包(经过 NAT 后)接下来将进入表FORWARD
中的链filter
。因此我在那里添加了一个 LOG:
iptables -t filter -I FORWARD -p UDP --dport 9987 -j LOG
但该规则下的包裹计数仍为 0。
有人能告诉我我错过了什么吗?