Debian/Ubuntu 中的靜態 IPv6 地址廣告和 IPv6 自動配置
我有一個通過 IPv6 自動配置通告 IPv6 地址的網路。為了允許 DNS 查找並擁有精美的 IP 地址,我們通過 /etc/network/interfaces 設置“靜態” IPv6 地址:
auto eth0 iface eth0 inet dhcp iface eth0 inet6 static address a:b:c:d:e::f netmask 64
每當我們現在通過 IPv6 連接時,Linux 都會使用 IPv6 自動配置地址:
a:b:c:d:21d:60ff:fe4a:479
而不是靜態 IPv6 地址:
a:b:c:d:e::f
另一端的伺服器只能看到自動配置地址。
有沒有辦法強制 linux (Debian/Ubuntu) 將靜態地址用於傳出數據包?這對於反向 DNS 和防火牆設置特別有趣。
我不想禁用 IPv6 自動配置,因為我無法控制路由器通告的設置。
當然,防止使用 autoconf 地址的最簡單方法是通過執行以下操作來防止核心創建它們:
echo 0 >/proc/sys/net/ipv6/conf/eth0/autoconf
請注意,這不需要您重新配置路由器,以便它停止為前綴發出廣告。
注意在評論中,您談論的是
/etc/gai.conf
,但這不適用。這是 glibc 的配置文件,而不是核心,它影響目標地址的選擇,而不是源地址的選擇。如果您仍然希望存在 autoconf 地址,但又不想使用它們,請繼續閱讀…
用於同一網路上的主機之間的通信
我找不到一種強制地址選擇更喜歡靜態地址而不是自動配置地址的好方法。通過查看RFC 3484的所有規則,沒有一個是真正有用的。
您可以嘗試更改連接子網的路由表中的 /64 路由,使其具有“src”屬性,但是當子網中的任何地址添加到介面時,核心會自動生成它,我是事後編輯不成功。
用於與 Internet 其餘部分上的主機通信
您可以通過多種方式影響出站連接的地址選擇。最明顯的是
src
在路由上使用屬性。例如:ip route add ::/0 via <gateway> src <desired-source-IP-address>
但也許您的預設路由來自路由器廣告消息,並由核心自動插入。在這種情況下,您不可能為路線提供“src”屬性。所以這裡有另一種方法,基於配置地址標籤。
預設情況下,在 Linux 中,核心的地址標籤表如下所示:
prefix ::1/128 label 0 prefix ::/96 label 3 prefix ::ffff:0.0.0.0/96 label 4 prefix 2001::/32 label 6 prefix 2001:10::/28 label 7 prefix 2002::/16 label 2 prefix fc00::/7 label 5 prefix ::/0 label 1
這個想法是,當向帶有標籤的目標地址發起數據包時
x
,核心更喜歡使用具有相同標籤的源地址x
。因此,例如,如果您將數據包發送到具有 6to4 地址(即 2002::/16 中的地址)的主機,則其標籤為 2,核心將更願意為傳出數據包選擇 6to4 源地址,如果有的話。一般 IPv6 目的地獲得標籤 1(::/0,它匹配所有內容)。這是您想要執行的操作:
- 覆蓋本地子網的標籤分配,以便本地子網上的地址獲得“火星”標籤(其他任何東西都不使用的標籤)。此規則將匹配整個子網,因此它將是 /64。
- 重新覆蓋所需靜態地址的標籤分配,將其設置回 1(即,與其餘 Internet 地址獲得的標籤相同)。此規則將僅匹配特定的所需地址,因此它將是 /128。
這樣,本地子網上的所有這些 autoconf 地址都將獲得一個火星標籤,該標籤與網際網路上其他任何東西的標籤都不匹配,因此它們不會被首選,而所需源地址的標籤將是1,因此它將與目標地址匹配並被選中。
如果您的前綴是 2001:db8::/64 並且您選擇的靜態地址是 2001:db8::aaaa/128 那麼:
ip addrlabel add prefix 2001:db8::/64 label 99 ip addrlabel add prefix 2001:db8::aaaa/128 label 1
您可以將這兩個命令添加為
up
命令,/etc/network/interfaces
以便在每次界面出現時執行它們。