首页 文章

使用iptables重写某些传入数据包的源地址?

提问于
浏览
0

我有一个应用程序,其中设备将UDP流量发送到Linux机箱,在那里使用UDP samplicator进行复制并发送到多个其他设备进行分析 . UDP samplicator配置为在复制时保留原始传入数据包的源地址 . 那部分完美无缺 .

我今天在samplicator盒子上使用iptables有选择地不将UDP流量从某些来源转发到特定的分析目标,因为一些分析目标只需要查看来自某些设备的数据,这也很有效 .

我遇到麻烦的地方是,有一些设备需要在其传入的UDP流量上重写源地址,以克服某个特定设备供应商的一些限制 . 克服这个限制的最简单方法是在samplicator上使用iptables重新编写来自设备10.1.2.3的传入UDP数据包的源地址,然后将这些数据包复制到分析目标,这样他们就能看到流量到来另一个地址,如10.4.5.6 .

由于这是UDP并且分析目标不直接响应它们从设备接收的UDP数据包,因此我不需要担心双向转换流量 .

  • 10.1.2.3 =设备的UDP流量来自的IP地址

  • 10.4.5.6 =我们需要看到它的IP地址

  • 10.7.8.9 =分析目标之一

我在我的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正常工作的任何见解将不胜感激 .

1 回答

  • 0

    POSTROUTING意味着:路由后发生 . 两个未满足的条件(也不需要):您之前使用tcpdump接收流量(因此您永远不会使用此工具捕获此更改)并且由于samplicator本地进程是目标,因此根本没有路由 . 如果您将它们路由(在PREROUTING中,仅允许DNAT,而不是SNAT),则会绕过简化器,而不是您想要的 .

    不要绝望,NAT不仅用于路由 . 您仍然可以将源指向本地进程的NAT . tcpdump之前仍然会发生(因为它没有使用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 ),它很容易调试和测试,它会告诉你看到的源代码 .

相关问题