無法弄清楚如何透過多宿主網路卡路由資料包

無法弄清楚如何透過多宿主網路卡路由資料包

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

監視兩個網卡上的活動。

從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

有什麼想法如何找到回應嗎?

答案1

LOKI和HOST_A在同一子網路時,為什麼要透過路由器連接?它真的是一個路由器,還是只是一個交換器? (從您後來的評論來看,雖然該設備是路由器,但它只是充當 LOKI 和 HOST_A 之間的交換器)。

HOST_A 和 ROUTER 上的路由表是什麼?如果它要嘗試到達 192.168.200.1,為什麼要使用 LOKI 作為目的地?

除非這些裝置上的路由表知道對 192 子網路使用 LOKI,否則它們只會轉送到預設閘道。

作為替代方案,您可能想研究在 LOKI 上安裝 NAT。對於許多服務,它可以將來自 HOST_B 的流量封裝為來自 LOKI 的流量。由於其他機器可以到達那裡,因此它可以接收流量並將其轉發回 HOST_B。

答案2

在我看來,洛基所做的正是你所期望的。它ping在 上收到請求資料包ue0並將其轉發到em0。如果收到ping回复em0,則會將其轉發至ue0

問題出在路由器。它接收ping來自192.168.200.3LAN 端的請求(但這並不重要)。當它ping向 發送回應時192.168.200.3,它會查看其路由表。 LAN 端是10.0.0.0/24(或類似),因此回覆封包被傳送到路由器的預設網關,也就是公共網際網路上的 WAN 端。

路由器使用網路位址轉換 (NAT)10.0.0.0/24在您的一個真實公用 IP 位址(由您的 ISP 指派給路由器的 WAN 端)後面偽造一個網路。 RFC1918 位址是私有的,不能暴露於公用 Internet,並且將永遠位於 NAT 後面。

您可以將靜態路由放置到 ROUTER 中以使您的ping實驗成功,但這仍然與公共 Internet 隔離。您可以在 LOKI 上啟用 NAT,在這種情況下,您可以使用雙 NAT 連接到 Internet(效果很好,但毫無意義)。如果您只需要第二級防火牆,您可以考慮將 LOKI 設為橋接防火牆並10.0.0.0/24在兩個 NIC 上運行。如果您想要託管網路導向的服務,並且您只有一個公用 IP 位址,則您必須在 ROUTER 上使用連接埠轉送規則。

答案3

必須進行一些設定才能將封包從網路 A 轉發到網路 B。這樣做時,您將 Loki 設定為路由器,並應使用 Loki 作為主機 B 的預設閘道。

相關內容