2017-09-29 95 views
0

我有一个应用程序,其中一个设备发送UDP流量到一个Linux机器,它使用UDP samplicator复制并发送到多个其他设备进行分析。 UDP samplicator配置为在复制时保留原始传入数据包的源地址。那部分工作完美。使用iptables重写某些传入数据包的源地址?

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

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

由于这是UDP,并且分析目标没有直接响应从设备接收到的UDP数据包,所以我不需要担心双向翻译流量。

  • 10.1.2.3,该设备的UDP流量从
  • 10.4.5.6 =,我们需要看到它从
  • 未来
  • 10.7.8.9 =分析目标之一的IP地址即将= IP地址

我想这对我的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通信未来通过与源码e地址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

POSTROUTING意为:发生路由。未满足(也不希望)两个条件:您收到交通tcpdump的之前(所以你永远不会捕捉该工具这一变化)并没有路由,因为在所有的samplicator 本地进程涉及是目的地。如果你路由它们(在PREROUTING中,只允许DNAT,而不是SNAT),则放样器将被绕过,而不是你想要的。

不要绝望,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 

如果您在详细模式,而不是samplificator(nc -n -v -u -l -p 6343)就使用netcat可以很容易地调试和测试,它会告诉你看到的来源。