Linux
來自具有多個 IP 的伺服器的傳出連接
我們有一個伺服器,其中一個 /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