iptables:如何結合DNAT和SNAT來使用輔助IP位址?

iptables:如何結合DNAT和SNAT來使用輔助IP位址?

這裡有很多關於 iptables DNAT/SNAT 設定的問題,但我還沒有找到可以解決我目前問題的問題。
我的服務綁定到 eth0 的 IP 位址(例如 192.168.0.20),我在 eth0:0 (192.168.0.40) 上也有一個與另一台伺服器共用的 IP 位址。只有一台伺服器處於活動狀態,因此該別名介面的出現和消失取決於哪台伺服器處於活動狀態。為了使服務接受流量,使用 DNAT 規則來更改目標 IP。

iptables -t nat -A PREROUTING -d 192.168.0.40 -p udp --dport 7100 -j DNAT --to-destination 192.168.0.20

我還希望來自該服務的所有出站流量都顯示為來自共用 IP,以便在發生主動-備用故障轉移時回傳回應能夠正常運作。

iptables -t nat -A POSTROUTING -p udp --sport 7100 -j SNAT --to-source 192.168.0.40

我的問題是 SNAT 規則並不總是運行。入站流量會產生這樣的連線追蹤條目。

[root]# conntrack -L -p udp
udp      17 170 src=192.168.0.185 dst=192.168.0.40 sport=7100 dport=7100 src=192.168.0.20 dst=192.168.0.185 sport=7100 dport=7100 [ASSURED] mark=0 secmark=0 use=2

這表示 POSTROUTING 鏈未運行,出站流量以真實 IP 位址作為來源離開。

我想我可以在原始表中設定 NOTRACK 規則來防止對該連接埠號碼進行連接跟踪,但是有沒有更好或更有效的方法來實現此目的?

編輯-替代問題:是否有一種方法(在 CentOS/Linux 中)擁有一個可以綁定但不使用的接口,以便在伺服器之間交換共享 IP 地址時可以將其連接到網絡或分離?

答案1

我找到了解決我的問題的方法。
透過使用核心參數net.ipv4.ip_nonlocal_bind=1,我可以讓我的服務綁定到尚不存在的地址。
當 eth0:0 介面啟動時,服務將接受流量。 ARP 等由 ucarp/networking 處理。有了這個,就根本不需要 DNAT/SNAT 規則了。

答案2

我可以建議兩個選擇,你可以選擇其中一個或你自己的。

您可以將服務設定為偵聽通配符位址,從而完全避免 DNAT 規則。然後,SNAT 規則將應用於傳出資料包。

或者,根據您使用的 HA 解決方案,您可以將其設定為在遷移時啟動服務偵聽浮動 IP (192.168.0.40)。

沒有那麼相關的註釋,但是這種滋擾不存在於OpenBSD CARP。使用 CARP,您可以在所有節點上設定虛擬 IP,但它僅在一個節點上處於活動狀態。這當然意味著您可以讓您的服務偵聽所有節點上的虛擬 IP。

這不是那麼漂亮,但您可以在所有節點上配置虛擬 IP(甚至將其啟動)並用於arptables停用該 IP 的 ARP 回應或公告。然後,當節點成為主節點或從節點時,您可以讓 ucarp 啟用或停用 ARP 規則。

相關內容