如何為 linux ipv6 路由器設定 radvd 到上游 dsl 網關

如何為 linux ipv6 路由器設定 radvd 到上游 dsl 網關

我正在嘗試讓我的家庭 Linux 路由器也支援家庭網路上的 ipv6。

我有一個 NVG599 DSL 路由器,充當公共互聯網的 GW,然後是具有兩個介面的 Linux 路由器:面向家庭網路的 eth0 和麵向 DSL 路由器的 eth1。

家庭網路 <----eth0-----> LinuxRouter <--------eth1----->DSLrouter -->>>>>

DSL 路由器配置有來自我的 ISP 的 /64 網路前綴(假設為 2001:0:0:1234::/64),且 DSL 路由器的 ipv6 全域位址為 2001:0:0:1234::1 。我已經使用 radvd 設定了 Linux 路由器,以向家庭 LAN 向 eth0 通告相同的 /64 網路前綴,事實上,我看到 LAN 上的主機能夠自動配置其 IP 位址。該通告還將 Linux 路由器列為 ::/0 的預設路由器,並且設定了轉發,以便它將封包發送到 DSL 路由器。

我遇到的問題是,當 DSL 路由器從互聯網獲取入站資料包時,它會在 eth1 上發送鄰居請求資料包,而這些鄰居請求不會從 Linux 路由器上的 eth1 -> eth0 傳遞。我認為發生這種情況是因為 DSL 路由器認為它直接連接到家庭網路(99% 的家庭網路通常都是這樣,中間沒有 Linux 路由器)。

在花了兩天時間試圖弄清楚之後,到目前為止我還沒有找到答案。我希望有某種方法可以使用 radvd 向 DSL 路由器發送路由器通告,告訴它透過 Linux 路由器路由 /64 前綴的所有資料包。目前,Linux 路由器傳送的路由器通告配置有 /64 前綴,並透過以下方式傳送至 DSL 路由器:

interface eth1
{
    AdvSendAdvert on;
    MinRtrAdvInterval 3;
    MaxRtrAdvInterval 10;
    route 2001:0:0:1234::/64 {
    };

};

我認為這應該足以讓 DSL 路由器將所有資料包轉發到網絡,但我仍然看到鄰居請求。

我看到 DSL 路由器具有 IP 直通設置,能夠設置“預設伺服器”,但這些似乎僅適用於 IPv4。假設 DSL 路由器不尊重我的 RA,我想我可以在 Linux 路由器上使用“xorb”設定 ipv6 多播轉發,但想知道是否還有其他選項。

答案1

我遇到的問題是,當 DSL 路由器從互聯網獲取入站資料包時,它會在 eth1 上發送鄰居請求資料包,而這些鄰居請求不會從 Linux 路由器上的 eth1 -> eth0 傳遞。

這很正常。鄰居請求的工作方式與 ARP 查詢類似,它們將 IP 位址轉換為 MAC 位址,因此它們僅在同一廣播網域內有意義。它使沒有意義讓路由器轉發它們。

(儘管在某些情況下路由器可以代理人他們,如最後所述,但是...將其留給計劃 C。

我認為發生這種情況是因為 DSL 路由器認為它直接連接到家庭網路(99% 的家庭網路通常都是這樣,中間沒有 Linux 路由器)。

是的,而你從來沒有告訴否則。

所以你目前的狀況是相同的IP 子網路被兩個不同的網路使用,您期望 Linux 路由器充當橋樑...這幾乎與路由器完全相反。

(如果令人困惑的部分是 IPv6,請考慮 IPv4 術語中的整個設置,因為兩者的路由或多或少相同,並且 ND 主要相當於 ARP。因此,如果您不使用相同的 192.168.1.0 子網路v4...)


你最好的行動方針是獲得一個第二/64,並使用適用於 Linux 路由器的 eth1 網路。 (如果 DSL 路由器透過 DHCPv6-PD 取得其前綴,則可能會欺騙它請求第二個前綴。)但不同之處在於,第二個 /64 不會直接在介面上使用,而是路由的指向 Linux 路由器的位址。

例如:

  • DSL 路由器的 WAN 介面上有 2001:db8:0:0:a:b:c:d。
  • DSL 路由器從 ISP 取得 2001:db8:10:0::/64,在 LAN 介面上自行指派 2001:db8:10:0::1/64,並為其傳送路由器通告。
  • Linux 路由器根據 RA 在 eth1 上自動設定 2001:db8:10:0:x:y:z:t。
  • Linux 路由器從 ISP 取得 2001:db8:10:1::/64(以某種方式),在 eth0 介面上自行指派 2001:db8:10:1::1/64,radvd 為此傳送路由器通告 –不是對於第一個子網路。
  • DSL 路由器需要類似「2001:db8:10:1::/64 via 2001:db8:10:0:x:y:z:t」的路由,以便第二個子網路的所有流量都會轉送到 Linux 路由器。

(對於不太清楚的例子表示歉意。)

有時,ISP 會將整個 /60 甚至 /56 委託給您,並將其全部路由到 DSL 路由器。在這種情況下,您只需設定第二個子網,無需任何 DHCPV6-PD 魔法。實際上,我無法在這裡提供一個好的「通用」答案,因為它既依賴 ISP,又依賴 CPE。


如果不可能獲得第二個 /64 前綴,其他可能的選項是:

  • 將Linux系統變成一個純粹的網橋,沒有任何路由功能。

  • 使用其他來源取得額外的 /64,例如隧道提供者(或 6to4)。現有的隧道服務將比下面描述的駭客更可靠地工作(除了一些額外的延遲)。

  • 使 DSL 路由器僅取得 /64,但不設定為 LAN。 (取決於路由器的彈性。)相反,再次透過 Linux 系統的 eth0 連結本地位址為 /64 設定路由,同樣透過 DSL 路由器的 Linux 系統為 ::/0 設定路由LAN 連結本地位址。因此,/64 將僅在第二個子網路中使用,第一個子網路根本沒有任何公共前綴。

  • 繼續目前設置,但安裝“ndppd”以執行鄰居發現代理。 (不,多播轉送不起作用,因為 ND 資料包通常具有鏈路本地來源位址。)請小心這一點,它會使事情變得非常混亂。

  • 對第二個 LAN 使用私有 (ULA) 位址,並在 Linux 路由器上啟用一對多 NAT(偽裝)...在此過程中失去 IPv6 的大部分用處。 (是的,正式的 NAT 在 IPv6 中並不存在,但這並沒有阻止 Linux netfilter/iptables 屈服並實現它。)

相關內容