Networking

無法弄清楚如何通過多宿主 nic 路由數據包

  • November 7, 2015

環境大部分是 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。

引用自:https://unix.stackexchange.com/questions/241333