Iptables

使用 iptables 重寫 TCP 回復中的源 IP

  • September 23, 2019

我想重寫離開 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 轉發的數據包。該地址可以分配給任何內部介面,例如lodummy0

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_announceon是沒有用的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

引用自:https://unix.stackexchange.com/questions/224130