使用 iptables 重寫 TCP 回復中的源 IP
我想重寫離開 Redhat 機器的 TCP/514 流量的源 IP,用於未從機器啟動的連接。
機器在介面上接收 TCP/514 流量,例如 10.10.0.20,然後我想返回流量,就好像回復來自 10.10.0.15(未分配給機器)一樣。
如果我正在啟動連接,那麼我可以使用 nat 表,並且:
iptables -A POSTROUTING -t nat -p tcp --sport 514 -j SNAT --to=10.10.0.15
..但由於我正在回复傳入的流量,所以我無法讓它到達 nat 表(據我所知)。忽略我需要以這種方式做事的原因,我怎樣才能做到這一點*?*
更多背景:
這是一台位於 Netscaler VIP 後面的 redhat 7 機器,它通過 TCP(不是 UDP)接收系統日誌流量。我在 VIP 上使用客戶端 IP 直通。由於防火牆看到來自 syslog 伺服器 IP 的返回流量,而不是 VIP 的 IP,防火牆正在丟棄流量,因此我想重寫來自 syslog 伺服器的 TCP 回复,以便它們來自 VIP 的 IP 地址。由於流量不是來自後端伺服器,我似乎無法使用 nat 表(因此沒有
-j SNAT
)。我現在看到的是:
13:13:45.439683 IP 10.10.0.8.31854 > 10.10.0.20.514: Flags [S], seq 544116376, win 8190, options [mss 1460], length 0 13:13:45.439743 IP 10.10.0.20.514 > 10.10.0.8.31854: Flags [S.], seq 4163333198, ack 544116377, win 14600, options [mss 1460], length 0
我想看到的是:
13:13:45.439683 IP 10.10.0.8.31854 > 10.10.0.20.514: Flags [S], seq 544116376, win 8190, options [mss 1460], length 0 13:13:45.439743 IP 10.10.0.15.514 > 10.10.0.8.31854: Flags [S.], seq 4163333198, ack 544116377, win 14600, options [mss 1460], length 0
DSR法
最有效的方法是在 Netscaler 上正確配置 Direct Server Return 模式,其中 Netscaler 將基於 MAC 的轉發到目標 VIP 地址不變的 syslog 伺服器 (10.10.0.15)。
syslog 伺服器還需要具有該 VIP 地址才能接收從 Netscaler 轉發的數據包。該地址可以分配給任何內部介面,例如
lo
或dummy0
。ip addr add 10.10.0.15/32 dev lo
您必須在傳入介面(這裡我假設
eth0
)上設置一些 sysctls 以避免VIP 的 ARP 問題(參見6.7. The Cure: 2.6.x kernels - arp_ignore/arp_announce)。添加以下內容/etc/sysctl.conf
並執行sysctl -p
.net.ipv4.conf.eth0.arp_ignore = 1 net.ipv4.conf.eth0.arp_announce = 2 net.ipv4.conf.all.arp_ignore = 1 net.ipv4.conf.all.arp_announce = 2
請注意,設置
arp_ignore
/arp_announce
on是沒有用的lo
。DNAT法
如果 Netscaler 對傳入流量執行 DNAT,那麼 syslog 伺服器肯定也應該將返回流量轉發給 Netscaler,以便它可以釋放連接跟踪資源。這是完成地址轉換最自然的方式。
在這種情況下,您可能希望利用 syslog 伺服器上的策略路由。有了這個,您可以將特殊的路由表應用於特定條件下的數據包,例如“來自埠 514 的傳出 TCP 數據包”。
像這樣的 Linux 高級路由有 HOWTO 文件。我建議你仔細閱讀後面的 mini HOWTO 以了解以下說明。
VIP
首先,定義以任何 ID命名的特殊路由表/etc/iproute2/rt_tables
:1 VIP
將到 VIP (10.10.0.15) 的預設路由添加到此
VIP
表:ip route add default via 10.10.0.15 table VIP
在 iptables 表中添加一個條目以
mangle
標記1
來自埠 514 的傳出 TCP 數據包:iptables -t mangle -A OUTPUT -p tcp --sport 514 -j MARK --set-mark 1
添加規則以查找
VIP
帶有標記的數據包的路由表1
:ip rule add from all fwmark 1 table VIP
您可以看到到目前為止定義的規則
ip rule list
。規則按優先級值的升序處理(0 為最高優先級)。# ip rule list 0: from all lookup local 32765: from all fwmark 0x1 lookup VIP 32766: from all lookup main 32767: from all lookup default
您可以像這樣檢查每個路由表的內容:
# ip route ls table local # ip route ls table VIP # ip route ls table main