我有一个应用程序,其中设备将UDP流量发送到Linux机箱,在那里使用UDP samplicator进行复制并发送到多个其他设备进行分析。 UDP samplicator配置为在复制时保留原始传入数据包的源地址。那部分完美无缺。
我今天在samplicator盒子上使用iptables,有选择地不会将UDP流量从某些来源转发到特定的分析目标,因为某些分析目标只需要查看来自某些设备的数据,这也很有效。
我遇到麻烦的地方是,我需要在其传入的UDP流量上重写源地址,以克服某个特定设备供应商的某些限制。克服此限制的最简单方法是在samplicator上使用iptables重新编写来自设备10.1.2.3的传入UDP数据包的源地址,然后将这些数据包复制到分析目标,以便他们看到流量到来另一个地址,例如10.4.5.6。
由于这是UDP并且分析目标没有直接响应他们从设备收到的UDP数据包,因此我不必担心双向转换流量。
我在samplicator盒子上尝试了这个:
sudo iptables -t nat -A POSTROUTING -p udp -s 10.1.2.3 --dport 6343 -j SNAT --to-source 10.4.5.6:6343
然而,在分析目标上,我仍然看到许多UDP流量通过源地址10.1.2.3,而没有10.4.5.6。
$ sudo tcpdump -n -i eth0 host 10.1.2.3 and port 6343
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
19:02:56.443038 IP 10.1.2.3.19147 > 10.7.8.9.6343: sFlowv5, IPv4 agent 10.1.2.3, agent-id 2, length 276
19:02:56.914536 IP 10.1.2.3.55326 > 10.7.8.9.6343: sFlowv5, IPv4 agent 10.1.2.3, agent-id 1, length 1336
我在iptables中尝试了一些其他选项,但似乎都没有。任何人都可以提供有关如何使NAT正常工作的任何见解将不胜感激。
答案 0 :(得分:0)
POSTROUTING意味着:在 路由之后发生。两个未满足的条件(也不需要):您在之前使用tcpdump 接收流量(因此您不会使用此工具捕获此更改)并且没有路由所有涉及的因为samplicator 本地进程是目的地。如果你选择了它们(在PREROUTING中,只允许使用DNAT,而不是SNAT),则会绕过简化器,而不是你想要的。
不要绝望,NAT不仅用于路由。您仍然可以将源指向本地进程的NAT。 tcpdump仍然会在之前发生(因为它使用的是RAW套接字)所以会看到原始的源ip并且没有帮助调试,但是你的应用程序,只要它不使用SOCK_RAW接收流量,会看到更改的来源。我检查了samplificator的源代码,它看起来像是接收像普通应用程序一样的数据包(AF_INET,SOCK_DGRAM)。
所以正确的命令应该使用INPUT,而不是POSTROUTING:
iptables -t nat -A INPUT -p udp -s 10.1.2.3 --dport 6343 -j SNAT --to-source 10.4.5.6:6343
如果你在详细模式下使用netcat而不是使用samplificator(nc -n -v -u -l -p 6343
),它很容易调试和测试,它会告诉你看到的源代码。