
環境大部分是 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.3
LAN 端的請求(但這並不重要)。當它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 的預設閘道。