Linux

在單獨的路由表中沒有路由的情況下不同介面的可訪問性

  • January 27, 2020

我們目前正在嘗試通過wireguard 隧道將來自guest vlan (eth1.251) 子網的所有數據包路由到網際網路。為了實現這一點,我們使用基於策略的路由,並在流量來自我們的訪客子網時使用路由表 10 的規則:

32765:  from 10.251.0.0/16 lookup 10

在路由表 10 中,我們創建了一條通向隧道介面的預設路由:

default dev wg1  scope link

我們訪客網路中的所有客戶端都能夠通過預期的wireguard隧道訪問網際網路,但是客戶端無法到達訪客網路的網關(10.251.0.1)。TCPDump 顯示 ICMP 回顯回复通過wg1介面路由回我們的隧道端點,這顯然不是故意的。一個快速的解決方案是將eth1.251訪客 vlan 介面的範圍連結路由添加到路由table 10

default dev wg1  scope link 
10.251.0.0/16 dev eth1.251  proto kernel  scope link 

現在客戶端可以訪問路由器介面並為其服務。


在這個路由器上有另一個介面 eth1 與子網192.168.0.1/16。當我們現在刪除新添加的10.251.0.0/16路由時,table 10我們無法再訪問路由器介面10.251.0.1,但是我們仍然能夠192.168.0.1從子網上的客戶端訪問介面10.251.0.0/16192.168.0.2子網中路由器後面的客戶端(例如)192.168.0.0/16無法從10.251.0.0/16.

主要問題:為什麼我們可以在192.168.0.1沒有顯式路由表條目的情況下訪問路由器上的介面 ip,但不能10.251.0.1訪問來賓10.251.0.0/16子網中客戶端的介面 ip?

這是網路結構的概述。我認為這有助於理解我們的設置。

路由器介面概述

沒有一般的解釋,只是遵循路由設置中發生的事情。

10.251.0.1 既是本地路由器地址,也是 10.251.0.0/16 的一部分。

當接收到本地地址的數據包時,路由器使用第一個具有最低優先級的本地表匹配本地ip rule表:0,在表 10 的規則之前,並匹配。請記住,路由表匹配目標,而自定義規則通常配置為匹配

當路由器回复時,這一次本地表不匹配: 10.251.0.2 is not a local destination。檢查下一條規則並匹配from 10.251.0.0/16,查找表 10,數據包通過wg1

對於 192.168.0.1,接收數據包與之前使用本地表完全一樣。現在答案與附加規則不匹配,並且主路由表適用:它照常工作:Linux 系統將從其任何 IP 應答。

同樣,對於 192.168.0.2:它不是本地IP,因此與本地表不匹配,但查詢與添加的規則匹配:數據包通過wg1失去。

因此,將主路由表的一部分複製到額外的表以避免副作用會有所幫助。

ip route get只要不涉及任何標記,就可以使用正確的語法來測試其中的許多內容:

沒有表 10 中的附加條目:

# ip route get from 10.251.0.2 iif eth1.251 10.251.0.1
RTNETLINK answers: Invalid cross-device link
# sysctl -w net.ipv4.conf.eth1/251.rp_filter=2 #relax reverse path filtering
# ip route get from 10.251.0.2 iif eth1.251 10.251.0.1
local 10.251.0.1 from 10.251.0.2 dev lo table local 
   cache <local> iif eth1.251 

# ip route get from 10.251.0.2 iif eth1.251 192.168.0.1
local 192.168.0.1 from 10.251.0.2 dev lo table local 
   cache <local> iif eth1.251 
# ip route get from 10.251.0.2 iif eth1.251 192.168.0.2
192.168.0.2 from 10.251.0.2 dev wg1 table 10 
   cache iif eth1.251 

回复路線:

# ip route get from 10.251.0.1 10.251.0.2
10.251.0.2 from 10.251.0.1 dev wg1 table 10 uid 0 
   cache 
# ip route get from 192.168.0.1 10.251.0.2
10.251.0.2 from 192.168.0.1 dev eth1.251 uid 0 
   cache 

添加表 10 中的條目時:

# ip route get from 10.251.0.2 iif eth1.251 10.251.0.1 #even with strict reverse path filtering, since the reverse route is correct
local 10.251.0.1 from 10.251.0.2 dev lo table local 
   cache <local> iif eth1.251 
# ip route get from 10.251.0.1 10.251.0.2
10.251.0.2 from 10.251.0.1 dev eth1.251 table 10 uid 0 
   cache 

引用自:https://serverfault.com/questions/1000461