解決錯誤的IPv6路由廣播的方法
IPv6路由廣播是IPv6的新特性之一——無狀態(tài)自動配置的實(shí)現(xiàn)途徑。IPv6協(xié)議規(guī)定了兩種設(shè)備自動配置方案,一種由DHCPv6實(shí)現(xiàn),另一種就是無狀態(tài)自動配置。
路由器廣播本地子網(wǎng)的前綴和對應(yīng)的路由器地址,新入網(wǎng)的設(shè)備根據(jù)這些信息自動配置網(wǎng)絡(luò)。無狀態(tài)自動配置的缺點(diǎn)是無法自動配置DNS。與在IPv4網(wǎng)絡(luò)上隨意發(fā)布DHCP信息相對應(yīng),在IPv6網(wǎng)絡(luò)上發(fā)布錯誤的前綴也會干擾本地子網(wǎng)的使用者,而由于IPv6用戶較少,不容易得到網(wǎng)絡(luò)管理員的關(guān)注,故自己掌握如何解決這樣的錯誤的IPv6路由廣播是必要的。
首先必須描述一些基本知識。與IPv4地址由網(wǎng)路號和主機(jī)號構(gòu)成相似,IPv6地址由前綴和主機(jī)號構(gòu)成,且大多數(shù)場合下,前綴和主機(jī)號各有64位。可以理解為一個本地子網(wǎng)有的地址空間,故隨意構(gòu)造主機(jī)號造成撞車的概率很小。而通常IPv6無狀態(tài)自動配置會給出這樣的地址:2001:da8:d800:75:204:7dff:feb3:16f4
其中,黑體部分是IPv6路由廣播出來的前綴,藍(lán)色部分是你的MAC地址(前2位可能跟你看到的MAC地址不同,因?yàn)檫@里有編址模式的問題,但后面的幾位一定相同),紅色的ff:fe是固定值。一臺主機(jī)可能會自己構(gòu)造或者被分配多個IPv6地址,主機(jī)發(fā)送IP包時,應(yīng)該在路由表上按最長前綴匹配原則選擇特定的地址作為源地址——如果真的這么做,就不需要下面那么麻煩的解決方案了。問題是似乎沒有人這么做。
Windows XP SP2 / Windows XP SP3
Windows XP的IPv6無狀態(tài)自動配置關(guān)不掉,自動配置出來的***地址刪不掉。
如果得到的錯誤廣播是2002::開頭的,那么相對容易解決一些——用prefix policy指定優(yōu)先選擇2001::開頭的地址就可以了。
netsh int ipv6 set p 2001::/16 1 1 persistent
而如果錯誤廣播是2001::開頭的,那么就麻煩一些,prefix policy在這種情況下不管用,而且是直接把***配置的地址當(dāng)作源地址。所以解決辦法是首先關(guān)掉每5分鐘自動生成一次臨時地址的功能,然后手動配置一個正確的IPv6地址和網(wǎng)關(guān)。在命令行中執(zhí)行netsh,進(jìn)入netsh,以下將是在netsh中操作:
int ipv6
set pri dis
show int #看清楚自己的網(wǎng)卡對應(yīng)的Idx是什么,下面Idx的位置填這個號碼,Address的位置填一個自己編的IPv6地址,比如我喜歡把ff:fe改成ff:ff后的地址填在這
add addr Idx Address
add r ::0/0 Idx 網(wǎng)關(guān)地址
quit #退出
Windows Vista / Windows 7 / Windows Server 2008
Windows Vista之后的版本中的IPv6無狀態(tài)自動配置終于可以關(guān)掉了。
netsh interface ipv6 set interface "你的本地連接的名稱,比如’本地連接1‘" routerdiscovery=disable
Linux
Linux下有三種辦法,前兩種思路類似,一是拒絕IPv6路由廣播,二是禁止自動配置。兩個都是runtime kernel parameter,前者在net.ipv6.conf.
再有一種辦法是用ip6tables丟棄錯誤廣播的路由器送來的包。下面的命令將該規(guī)則添加到ip6tables。需要知道發(fā)送錯誤的廣播的路由器的MAC地址,用tcpdump、wireshark等工具都可以輕易取得(注意觀察Advertisement的發(fā)送者就是了)。
ip6tables -A INPUT -p icmpv6 -m mac --mac-source "路由器MAC地址" -j DROP
有些發(fā)行版有/etc/network/if-pre-up.d/icmpv6-routerfilt文件,可以直接在這個文件中配置。