尽管有规则,iptables 仍以不同方式处理来自不同主机的流量

尽管有规则,iptables 仍以不同方式处理来自不同主机的流量

这里发生了一些奇怪的事情,我不知道如何解决它。摘要:与 tcpdump 相同的流量被 iptables 以不同的方式处理。详情如下。

测试设置:

  • 设备 0 - IP 为 192.168.0.121 的 Linux 机器

  • 设备 1 - 一个哑设备,只向 192.168.0.121 上的端口 4000 发送数据包。此设备的 IP 地址使用以下命令设置:sudo arp -s 192.168.0.27 MAC_ADDRESS,因为它不会发出 DHCP 请求,并且除了其工作之外无法执行任何其他操作。

  • 设备 2 – 一台 Linux 机器,使用以下命令向 192.168.121 上的端口 4000 发送数据包:

    watch -n 1 “日期 | nc -4u -w1 -v 192.168.0.121 4000”

tcpdump输出的情况:

22:00:01.845359 IP 192.168.3.30.50705 > 192.168.0.121.4000: UDP, length 1
22:00:01.845391 IP 192.168.3.30.50705 > 192.168.0.121.4000: UDP, length 29
22:00:02.022257 IP 192.168.0.27.27 > 192.168.0.121.4000: UDP, length 12
22:00:03.022797 IP 192.168.0.27.27 > 192.168.0.121.4000: UDP, length 12
...

在这种情况下,输出为socat udp-l:4000,fork stdout

�����XX@�XWed Sep  2 22:02:18 PDT 2015
������XX��XWed Sep  2 22:02:22 PDT 201
...

并且的输出socat udp-l:2700,fork stdout为空。

奇怪的垃圾信息来自传感器,日期来自上述命令。请注意,根据 tcpdump,此流量的目标 IP/端口完全相同。现在,如果我将所有流量从 UDP 端口 4000 转发到 2700:

sudo iptables -t nat -A PREROUTING -p udp --dst 192.168.0.121 --dport 4000 -j DNAT --to-destination 192.168.0.121:2700

tcpdump 看起来完全相同,但是现在,输出socat udp-l:4000,fork stdout是:

���@�@�@�������@�@�@�������@������������@�@@����@��� ...

输出为 socat udp-l:2700,fork stdout

XXXWed Sep  2 22:05:42 PDT 2015
XXXWed Sep  2 22:05:46 PDT 2015
XXXWed Sep  2 22:05:50 PDT 2015
...

如您所见,来自设备 1 的流量被 iptables 忽略并继续通过端口 4000 传输到主机,但来自设备 2 的流量被规则捕获并转发到端口 2700。我可以清除 iptables 并重新发布规则,它只会在这两种状态之间切换。

有人知道可能会发生什么吗?

答案1

事实证明,两个设备都从 192.168.0.27 发送位于 192.168.0.121 的 Linux 主机,只是 MAC 地址不同。显然,这不是合规行为,不应期望 iptables 能够应对这种情况。

我想听听一些建议,如何让这两个设备在同一网络上共存,而无需供应商为我们编写固件升级。所以如果有人有想法,请告诉我。

相关内容