多個 VLAN - Linux / Debian 如何處理數據包
我找不到關於 linux 如何處理來自不同 VLAN 的傳入數據包的答案,這些數據包不屬於分配給 VLAN 的子網。
想像一下這種情況。在具有以下配置的 Linux 機器上:
- eth0.100 - 從 192.168.100.0/24 子網分配的地址(例如 192.168.100.2)
- eth0.150 - 從 192.168.150.0/24 子網分配的地址(例如 192.168.150.2)
- eth0.200 - 從 192.168.200.0/24 子網分配的地址(例如 192.168.200.2)
預設網關的地址是 192.168.100.1 指向介面 eth0.100
在埠 eth0.150 上帶有源地址 10.0.0.100/24 的數據包,地址為在 192.168.150.2 上偵聽的服務。數據包由服務(ISO/OSI 模型的更高層)處理,並生成新的數據包(響應)到主機 10.0.0.100。此時的問題是如何處理數據包。
Linux是先檢查ARP表,如果有與10.0.0.100主機(MAC地址)相關的條目,則通過eth0.150發回數據包還是先掃描路由表,如果沒有找到匹配的則通過介面發回數據包eth0.100(與預設網關相關聯)?
你能幫忙找到正確的答案嗎?
設置 VLAN 和 IP 後,您的路由表中有 4 條路由:
192.168.100.2/24 directly connected dev eth0.100 192.168.150.2/24 directly connected dev eth0.150 192.168.200.2/24 directly connected dev eth0.200 default via 192.168.100.1 dev eth0.100
無論數據包來自哪裡,在出去的路上,都會匹配到路由表。由於
10.0.0.100
不是路由表中任何網路的一部分,它將通過預設網關(“所有其他網路”)發送出去。ARP 僅在本地乙太網網路中使用,因此來自 10.0.0.100 的數據包實際上將具有來自路由器(在 vlan150 中的某個位置)的 MAC,該 MAC 將其轉發到您的主機。
當您發送 IP 數據包時,您將其打包(封裝)在乙太網數據包中。因此,當您想要訪問 serverfault.com(可能在您的 LAN 之外)時,您首先對其進行封裝,然後發送一個數據包,其中您的 MAC 作為源地址,路由器 LAN 端 MAC 作為目標地址。路由器接收到它,只查看 IP 數據包,檢查路由它的位置,然後將(只是 IP 數據包)封裝在不同的乙太網數據包中,使用自己的 wan 端 MAC 作為源地址,上游路由器 MAC作為目的地址。然後在途中的每個乙太網路由器上重複此操作。
由於來自 10.0.0.100 的數據包來自另一個網路(不是直接連接的網路),它必須通過路由器路由,並且您無法看到 10.0.0.100 的 MAC 地址。
當然,您可以設置路由(使用多個路由表),以便從 eth0.150 進來的數據包通過 eth0.150 上的網關路由出去。
編輯:如評論中所述,如果您在這些介面上啟用了反向路徑過濾,核心將丟棄數據包,因為返回介面與傳入介面不同。