同一網路上的多個 IPv6 路由器
我的家庭網路有兩個 ISP。它們連接到兩個獨立的路由器。如果我同時在兩個路由器上執行 radvd 和 dhcpd,我將無法獲得 IPv6 連接。我的 IPv6 連接僅在只有一個路由器執行 radvd 和 dhcpd 時才有效。為什麼會這樣?
相比之下,對於 IPv4,我在兩台路由器上執行 dhcpd,而網路上的其他電腦會根據哪個路由器首先響應來機會性地獲取 IP 和網關設置。
IPv4
IPv4 表現出您所觀察到的方式的原因是,它最初並不打算在一個介面上支持多個 IP 地址。因此,DHCP 客戶端將等待第一個 DHCP 伺服器發送一個報價,並且客戶端幾乎會假設這是唯一的 DHCP 伺服器。
IPv6
然而,IPv6 旨在支持介面上的多個地址,因此機器可以接受來自多個路由器的路由器通告並為介面分配多個 IP 地址。
但是,除非您開始使用策略路由等花哨的設置,否則您將擁有一個路由表,它只考慮路由決策的目標地址,並且只有一個預設路由指向兩個路由器之一。
因此,無論客戶端使用哪個源地址,您都可以期望數據包被路由到兩個路由器中的同一個。源地址的選擇將考慮許多因素,包括源地址是否是分配給數據包最終路由的介面的地址之一。然而,這在這裡沒有幫助,因為客戶端將使用相同的介面來訪問兩個路由器。
因此,客戶端電腦最終可能會在一個路由器分配的範圍內選擇一個源 IP 地址,但會將數據包發送到另一個路由器。如果不是在途中的數據包過濾器,這將起作用。即使您能以某種方式找到這些數據包過濾器的解決方案,它仍然不是一個理想的設置,因為當傳出流量通過一個路由器而傳入流量通過另一個路由器時,您不會真正獲得冗餘設置。
您的問題中沒有足夠的資訊可以肯定地說這就是它對您失敗的原因。但是,鑑於您提供的資訊,這聽起來確實是最有可能的解釋。
簡單的解決方案
在短期內,我可以建議您如何使此設置正常工作並為您提供冗餘的最簡單的解決方案是將其中一個路由器配置為僅 IPv4,而將另一個路由器配置為僅 IPv6。
實現 RFC 6555 的客戶端將自動在 IPv4 和 IPv6 之間進行故障轉移,因此當 IPv4 和 IPv6 通過不同的路由器時,它將在這兩個路由器之間進行故障轉移。
這將適用於達到雙堆棧的服務。您可以使用 DNS64+NAT64 為純 IPv4 服務實現相同的故障轉移。如果您的 ISP 沒有為您提供 NAT64,您可以在您選擇用於 IPv6 連接的路由器上配置 NAT64。
長期解決方案
從長遠來看,即使在訪問僅限 IPv6 的服務時,您也可能需要冗餘。實現這一點的最佳方法是客戶端機器將自動在兩個路由器之間進行選擇。這意味著類似於 RFC 6555 的邏輯需要在兩個 IPv6 連接之間進行選擇。
我今天還沒有看到支持它的軟體。它的某些部分可以通過策略路由來完成,但這意味著您需要覆蓋路由表,否則這些路由表是由每台客戶端電腦上的自動配置生成的。一個更簡單但稍差的解決方案是只在路由器上配置策略路由,代價是經常將傳出流量從客戶端發送到錯誤的路由器,然後在兩個路由器之間進行額外的一跳。
但是要獲得全部好處,您需要能夠完成所有這些工作的軟體:
- 當從兩個路由器接收路由器通告時,配置策略路由(或等效的),以諮詢源 IP 地址來決定將兩個路由器中的哪一個用作預設路由的網關。
- 當應用程序進行 DNS 查找時,會將請求發送到兩個 DNS 遞歸器(每個路由器通告一個),並確保每個 DNS 請求的源 IP 來自與目標 IP 相同的路由器通告。
- 當接收到 DNS 響應綁定到相同的本地 IP 時,響應被發送到並嘗試連接到響應中的地址之一。
- 使用 RFC 6555 等效邏輯在使用不同源和目標 IPv6 地址對打開的兩個連接之間進行選擇。