
在堆疊交換的網路工程中詢問了這個問題,並被重定向到這裡。
我有幾台具有以下配置的伺服器
伺服器1:
eno1: 127.15.0.1/16 scope global
eno2: 5.0.0.1/24
伺服器2:
lo: 127.0.0.1/16 (it had /8. I changed the subnet mask using 'ip addr del 127.0.0.1/8 dev lo; ip addr add 127.0.0.1/16 dev lo')
eno2: 5.0.0.2/24
server1的eno1連接到完全不同的二層網絡,完全隔離。
兩台伺服器的eno2介面都連接到同一個二層網路。現在我必須從 server2 存取 127.15.0.1。
Server1 很久以前就部署了,我無權更改任何類型的配置。我不知道為什麼有人使用 127.xxx 子網,範圍為全域。不確定它是否是有效的配置,但我必須忍受它。我對 server2 有完全的控制權,我可以改變任何東西。
兩台伺服器都是基於Linux的。
5.0.0.1 <-> 5.0.0.2 之間的連接良好。
我的第一次嘗試是在 server2 中新增一條路由,如下所示
ip r add 127.15.0.1/32 透過 5.0.0.1 從 server2 ping 127.15.0.1。我在 server2 上的 tcpdump 中看到 ping 請求和回复,但 ping 命令顯示 100% 遺失。
我禁用了 rp_filters
sysctl.cnf:
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.lo.rp_filter=0
net.ipv4.conf.eno2.rp_filter=0
更新 sysctl.conf 後重新啟動
我刷新了 iptables。 (iptables-F)
相同的結果。我想可能是server2不喜歡使用127.xxx系列。所以我在伺服器2上新增了以下規則
iptables -t nat -A OUTPUT -d 5.0.0.1 -j DNAT --to-destination 127.15.0.1
如果封包的目的地是 5.0.0.1,則此規則應該將目標 ip 替換為 127.15.0.1。
從 server2 ping 5.0.0.1。 Iptables 將目標 ip 替換為 127.15.0.1(在 server1 tcpdump 上確認了這一點)。 Server1 已回复,但回復再次被丟棄。
此時我已經沒有想法了。我關閉了 server1 進行維護,並將 127.15.0.1/26 替換為 192.168.1.1/16。在這種情況下,連接工作得很好(有或沒有 iptables)。現在的問題是,問題是因為使用了127.xxx嗎?如果是的話有沒有辦法解決?如果沒有,我還能嘗試什麼?
注意:這個配置之前是有效的。我們最近失去了 server2(其中有舊的 Linux),我正在從頭開始建立它。此外,Windows 不允許將 127.xxx 用於環回以外的介面。不知道為什麼 Linux 允許在非 lo 介面上使用它。也許是有道理的!
總而言之,我有以下問題:
- 當我們嘗試配置 127.xxx 時,Windows 完全拒絕該配置,但 Linux 允許它,並且在全域範圍內也是如此。有這方面的用例嗎?
- 在這種情況下,server2 發出發送至 127.xxx 的請求,而 server1 實際上正在發送回應。如果 127.xxx 僅主機內部,為什麼他們甚至在鏈路上發送資料包?
答案1
Linux sysctl 標誌位於
/sys/net/ipv4/conf/*/route_localnet
允許停用對此類資料包的合理處理。
Route_localnet - 布林值
路由時不要將環回位址視為火星來源或目的地。這使得 127/8 能夠用於本地路由目的。預設為假
由於很少有理智的人會做這樣的事情,所以現在這可能會也可能不會起作用(我上次測試它是在幾年前)。
請分配任意為此目的保留(可能是本地鏈路,但不是主機內部)或擁有的相關介面的 IP 空間。繼續這種奇怪的設定只會造成更多麻煩,尤其是當有簡單的替代方案時。