Linux

每個自定義路由表(帶預設網關)是否需要連結範圍路由?

  • August 20, 2017

我的 Centos 機器有一個自定義路由表foo_table,其中只包含一個預設網關路由:

# ip route add default via 10.0.2.1 table foo_table
# ip route show table foo_table  
default via 10.0.2.1 dev bond0.2

策略規則使用下表路由來自 10.0.2.22 的所有流量:

# ip rule show
0:      from all lookup local 
32765:  from 10.0.2.22 lookup foo_table 
32766:  from all lookup main 
32767:  from all lookup default 

當我從 10.0.2.22 Centos 機器跟踪路由到同一本地子網上的另一台機器時,數據包首先被路由到路由器,然後到伺服器:

# traceroute -In 10.0.2.60
traceroute to 10.0.2.60 (10.0.2.60), 30 hops max, 60 byte packets
1  10.0.2.1  3.573 ms  3.972 ms  4.219 ms
2  10.0.2.60  1.461 ms  1.494 ms  1.700 ms

自然,我希望本地流量不要像這樣不必要地涉及路由器。

main路由表中,當然有本地子網的鏈路範圍路由:

10.0.2.0/24 dev bond0.2  proto kernel  scope link  src 10.0.2.22

我的理解是,因為foo_table之前諮詢過main(根據ip rule show),所以使用通過 10.0.2.1 in 的預設路由foo_table,即使目的地是連結本地地址。

這是否意味著我也必須添加一個連結範圍路由foo_table

# ip route add 10.0.2.0/24 dev bond0.2 scope link table foo_table
# ip route show table foo_table  
10.0.2.0/24 dev bond0.2  scope link
default via 10.0.2.1 dev bond0.2

它似乎可以解決問題,但這是正確的方法嗎?

# traceroute -In 10.0.2.60
traceroute to 10.0.2.60 (10.0.2.60), 30 hops max, 60 byte packets
1  10.0.2.60  0.339 ms  0.355 ms  0.399 ms

我對正在發生的事情的理解是否正確?(我對路由的經驗很少。)

你知道這樣做的目的foo_table是什麼嗎?對我來說,它的效果似乎是通過路由器路由來自 10.0.2.22 介面(包括到本地子網)的所有流量,你說這是你不想要的。的內容是/etc/iproute2/rt_tables什麼?您也沒有說明main表中的預設路由是什麼。

為避免這種情況,請foo_table按照您的建議添加子網路由,或者僅刪除規則:

ip rule del from 10.0.2.22 lookup foo_table

據我所知,您不需要指定scope link將子網路由添加到foo_table,只需

ip route add 10.0.2.0/24 dev bond0.2 table foo_table

因為無論如何您都在指定與連結對應的前綴。也許我是誤會了。

((順便說一下,為了簡單起見,我認為default主表中的路由可以移動到default表中,但default按照慣例顯示為空,可能是因為預設路由取決於配置的介面。))

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