Linux

來自具有多個 IP 的伺服器的傳出連接

  • July 4, 2019

我們有一個伺服器,其中一個 /31 和一個 /24 在不同的 /8s 中靜態路由到它。我們在 /31 所在的 /24 中有一個網關。

/24 中 IP 的傳入連接按預期工作,但我們無法啟動傳出連接。我們的“黃金標準”測試是(此時使用 IP 來避免 dns 問題):

curl --interface SOME_IP_IN_THE_24 -v -H 'Host: httpbin.org' 34.230.136.58/ip

我們使用的是 Ubuntu 16.04,並且我們已將 eno1 配置為 /31 之一,eno1:1 配置為另一個 /31,並將 eno1:2 配置為 /24 中的一個 IP。當我們執行上面的命令時,我們仍然得到了 eno1 的 IP。

故障排除

  • ip route get <dst> from <SOME_IP_IN_THE_24>使用命令檢查路由。如果命令返回了意外的路由,請修復它。
  • 使用 . 檢查防火牆iptables-save -c。源地址可以被 NAT 規則覆蓋。

答案

您的問題由 MASQUERADE 規則引起。任何源地址都會被重寫為一個 IP 地址,您可以在路由的源屬性中看到該地址已通過ip route get <dst>命令獲取。tcpdump您可以通過使用andconntrack -E命令來確保這一點。您可能還會看到此規則計數器的增量。

nat/PREROUTING避免這種行為的簡單方法是在鏈的頂部插入 ACCEPT 規則。更改防火牆規則集的更好方法是使用iptables-save/iptables-apply命令。您的nat/PREROUTING鏈應如下所示 ( iptables-save -t nat):

# Generated by iptables-save v1.6.2 on Thu Jul  4 19:05:27 2019
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING --src <LOCAL-IP-1> -j ACCEPT
-A POSTROUTING --src <LOCAL-IP-2> -j ACCEPT
...
-A POSTROUTING --src <LOCAL-IP-N> -j ACCEPT
-A POSTROUTING -j MASQUERADE
COMMIT
# Completed on Thu Jul  4 19:05:27 2019

引用自:https://serverfault.com/questions/973970