
這是我關於超級用戶的第一個問題,如果沒有達到標準,我深表歉意。
我正在運行 pop!_OS 19.10(基於 Ubuntu 19.10),並試圖了解其網路行為。給定網路接口eth0
,我添加了以下子網:
ip addr add dev eth0 192.168.2.18/24
ip addr add dev eth0 192.168.3.18/24
介面現在如下所示(MAC 位址已更改)
1: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.18/24 scope global enp0s31f6
valid_lft forever preferred_lft forever
inet 192.168.3.18/24 scope global enp0s31f6
valid_lft forever preferred_lft forever
使用nc
,我可以在 IP 位址192.168.2.18
和之間發送資料192.168.3.18
。
##################################################################################
# nc -v -l 192.168.2.18 8080
Listening on [pop-os] (family 2, port 8080)
Listening on pop-os 8080
Connection received on pop-os 55361
Hello World!
##################################################################################
# nc -v -s 192.168.3.18 192.168.2.18 8080
Connection to 192.168.2.18 8080 port [tcp/http-alt] succeeded!
Hello World!
##################################################################################
# ss -4 -n
tcp ESTAB 0 0 192.168.3.18:55361 192.168.2.18:8080
tcp ESTAB 0 0 192.168.2.18:8080 192.168.3.18:55361
問題#1:我是否正確地假設地址內單獨的子網於相同的介面總是可以相互通訊(除非被防火牆阻止)?這是因為核心查看路由表並發現它可以簡單地在本地連接兩個網路嗎? IE:
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
現在我對此進行了測試,因為我正在研究內核 IP 轉送並閱讀這裡:
但是,如果轉送被關閉,核心將首先檢查資料包來自哪個介面。如果它不是來自同一個接口,核心將丟棄它。
但是,我也可以使用該位址192.168.2.18
透過其他介面進行連接。我禁用了 IP 轉送。wlan0
192.168.1.73
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 0 192.168.2.18:8080 192.168.1.73:40405
tcp ESTAB 0 0 192.168.1.73:40405 192.168.2.18:8080
問題2:為什麼不同子網路、不同介面的IP位址在不啟用IP轉送的情況下可以互通?是因為它們屬於同一個主機嗎?這種行為是在哪裡定義的?即,IP 轉送規則是否僅在封包開始離開主機時才生效?
答案1
問題#1:我是否可以假設同一介面上不同子網路內的位址始終可以相互通訊(除非被防火牆阻止)?這是因為核心查看路由表並發現它可以簡單地在本地連接兩個網路嗎? IE:
是的。這不是由您找到的“子網路”條目引起的,而是由單獨的路由表(“本地”表)中的“本地地址”條目引起的。舊的「路由」工具很可能故意隱藏這些條目,但它也已經過時,無法完全顯示現代 Linux 核心保存的路由資訊,因此使用:
ip -4 route show table local
ip -6 ro ls tab local
(注意:這是特定於 Linux 的。在 BSD 中,通常只有一個路由表,並且netstat -rn
會向您顯示帶有標誌集的特殊路由l
。在其他作業系統中,它甚至可能只是內建行為,不一定會作為路由公開全部。
此外,位址甚至不必位於同一介面上,因為封包從未實際使用過實體接口。相反,內核的行為就好像它自己的位址只是透過環回接口“lo”。
問題#2:為什麼不同子網路和介面上的 IP 位址可以在不啟用 IP 轉送的情況下進行通訊?是因為它們屬於同一個主機嗎?這種行為是在哪裡定義的?即,IP 轉送規則是否僅在封包開始離開主機時才生效?
是的,這是因為它們屬於同一台主機。 (在 Linux 上,它們還需要位於相同的網路命名空間中,例如相同的容器。)
當封包被傳送時,IP 轉送規則就會生效已收到透過非環回介面(例如,它透過乙太網路到達本機 MAC 位址),但其目標 IP 不被識別為屬於主機。
根據定義,本地產生的封包不會被“轉送”(它們是“輸出”,因為它們具有本機來源 IP 位址),因此轉送規則不適用。