無法弄清楚如何通過多宿主 nic 路由數據包
環境大部分是 FreeBSD,看起來像這樣:
HOST_A <-> ROUTER <-> LOKI <-> HOST_B
至少,我希望能夠從 HOST_B ping ROUTER。
- ROUTER 分配了 IP 10.0.0.1
- LOKI 是一台分配有 IP 10.0.0.2 和 192.168.200.1 的多宿主電腦
- HOST_B 分配了 IP 192.168.200.3
- HOST_A 分配了 IP 10.0.0.3
我已經如上所述設置了網路,並將 gateway_enable=“YES” 添加到 loki 的 rc.conf
LOKI 上的 netstat -r 產生:
Routing tables Internet: Destination Gateway Flags Netif Expire default 10.0.0.1 UGS em0 10.0.0.0 link#1 U em0 10.0.0.2 link#1 UHS lo0 loki link#2 UH lo0 192.168.200.0 link#3 U ue0 192.168.200.1 link#3 UHS lo0
它看起來像一個很好的路由表,似乎可以在各個方向工作。
HOST_B 上的 netstat -r 產生:
Routing tables Internet: Destination Gateway Flags Netif Expire default 192.168.200.1 UGS em0 hostb link#2 UH lo0 192.168.200.0 link#1 U em0 192.168.200.3 link#1 UHS lo0
它看起來像另一個很好的路由表,但只能看到 LOKI。
總之:
- LOKI 能夠 ping HOST_A、HOST_B 和 ROUTER
- HOST_B 能夠 ping LOKI,但不能 ping ROUTER 或 HOST_A
一些附加說明:來自 HOST_B
ping 10.0.0.1 100% packet loss
在 LOKI 上的 wireshark 中,從 HOST_B ping 10.0.0.1 時:
120 40.549564000 192.168.200.3 10.0.0.1 ICMP 98 Echo (ping) request id=0x5a0e, seq=92/23552, ttl=63 (no response found!)
在我看來,沒有任何東西從 LOKI 路由到 ROUTER。我錯過了什麼?
我通過在 /etc/rc.conf 中註釋掉 gateway_enable=“YES” 並重新啟動來確認 IP 轉發正在發生。
然後,我在 loki 上執行了以下命令:
sudo tcpdump -i em0 -nS sudo tcpdump -i ue0 -nS
監視兩個 nic 上的活動。
從hostb,我跑了:
ping 10.0.0.1
192.168.200.1上的ue0介面報告:
14:44:21.870865 IP 192.168.200.3 > 10.0.0.1: ICMP echo request, id 21509, seq 0, length 64
10.0.0.2 上的 em0 介面上沒有任何報告。
然後我跑了:
sudo sysctl -w net.inet.ip.forwarding=1
果然,em0 報告:
14:58:14.745369 IP 192.168.200.3 > 10.0.0.1: ICMP echo request, id 25861, seq 0, length 64
但是不,回复例如我從 hostb 得到的 ping loki:
14:44:15.724200 IP 192.168.200.3 > 192.168.200.1: ICMP echo request, id 21253, seq 4, length 64 14:44:15.724207 IP 192.168.200.1 > 192.168.200.3: ICMP echo reply, id 21253, seq 4, length 64
如果我從 loki ping 路由器,一切都很好:
15:04:55.637839 IP 10.0.0.2 > 10.0.0.1: ICMP echo request, id 46852, seq 3, length 64 15:04:55.638324 IP 10.0.0.1 > 10.0.0.2: ICMP echo reply, id 46852, seq 3, length 64
任何想法如何找到答复?
為什麼 LOKI 和 HOST_A 在同一子網上時通過路由器連接?它真的是一個路由器,還是只是一個交換機?(根據您後來的評論,雖然該設備是路由器,但它只是充當 LOKI 和 HOST_A 之間的開關)。
HOST_A 和 ROUTER 上的路由表是什麼?如果要嘗試到達 192.168.200.1,為什麼要使用 LOKI 作為目的地?
除非這些設備上的路由表知道將 LOKI 用於 192 子網,否則它們只會轉發到預設網關。
作為替代方案,您可能想研究在 LOKI 上安裝 NAT。對於許多服務,它可以將來自 HOST_B 的流量封裝為來自 LOKI 的流量。由於其他機器可以到達那裡,它可以接收流量並轉發回 HOST_B。