Linux

Linux IPv6:為從路由器廣告中學習的預設網關指定策略路由表?

  • December 20, 2018

有沒有辦法告訴核心哪個策略路由表應該接收從 IPv6 路由器通告中學習的預設路由?

我的家庭網路有來自 Spectrum 的本地 IPv6 服務和來自 Hurricane Electric 的隧道,由於其他原因我仍然需要它。他們不會進行路由器重定向,因此我使用策略路由來為每組源地址維護單獨的路由表。

我的策略規則列表首先搜尋“主”路由表,該路由表僅限於可以通過任一組源地址到達的本地目標前綴。我告訴 dhcpcd 告訴核心不要將預設路由放入該表中,因此如果沒有匹配,路由將進入下一條規則。

下一條規則僅針對 HE 源地址呼叫 HE 特定表。該表僅包含指向 HE 的預設路由。

最後一條規則僅針對 Spectrum 源地址呼叫特定於 Spectrum 的表。它僅包含指向 Spectrum 的預設路由。

這一切都適用於靜態腳本,但在我的腳本中使用硬連線地址似乎並不優雅。如果 Spectrum 更改其 IPv6 路由器地址會怎樣?

我想自動維護到 Spectrum 的預設路由,但 Linux 核心只給了我兩個選擇:選擇 Spectrum 的路由器廣告並將其放入“主”表中的預設路由中,或者(如果您設置“accept_ra_def_rtr= 0"),什麼也不做。dhcpcd 不會告訴您 IPv6 網關地址,因為 DHCP6 與 DHCP4 不同,它不分配 IPv6 網關;該功能由核心在接收到路由器廣告消息時完成。

可以讓核心在“主”表中安裝 Spectrum 的預設路由,僅當源地址屬於 Spectrum 時才呼叫該表,然後進入 HE 表。但後來我不得不在 HE 表中複製我所有的本地路由,這又變得一團糟。

我想到了一個簡單而明顯的答案:讓告訴核心哪個路由表用於從 IPv6 路由器通告中學習到的網關的預設路由。甚至還有一個名為“default”的特殊表,它會自動放在策略規則列表的末尾。但是我找不到任何方法來告訴核心這樣做。它要麼是“主”表,要麼什麼都不是。同樣,我寧願將“主”表限制為(部分)由 dhcpcd 管理的本地條目(例如,我從 Spectrum 委託的前綴)。

還有其他人遇到過這個問題嗎?任何解決方法?

使用此抑制器ip rule

抑制前綴長度 NUMBER
 拒絕前綴長度為 NUMBER 或更短的路由決策。

您可以在第一個(較低優先級值)規則中使用未修改的主表,同時通過使用以下內容忽略其預設路由:

ip -6 rule add priority 32000 from all lookup main suppress_prefixlength 0

此規則將忽略主路由表中的任何 /0 前綴,即“預設”預設路由。

如果之前沒有其他匹配項(即:如果 HE 源的規則在中間規則中不匹配),則主表仍然可以稍後使用其預設路由(在優先級為 32766 的通正常則中)重用。

引用自:https://unix.stackexchange.com/questions/477428