2017-09-29 41 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可以很容易地調試和測試,它會告訴你看到的來源。