正常獲取IPV6地址卻無法使用的解決方案
WinXP無法連接 IPv6 站點,但是 IPv6地址的獲取是正常的,同一臺電腦上的 Ubuntu IPv6工作也正常。經過一些摸索發現可能是以下兩個原因造成的:
1. 分配到 2002 開頭的 IPv6地址并使用了它。2002::/16格式的地址是 6to4 的地址,不是 native 的 IPv6地址,所以在 IPV4+V6 雙棧網絡中不應該使用 2002::/16 格式的地址。執行 ping6 IPv6.google.com 可以看到自己使用的是什么 IPv6地址。
之所以會產生 2002::/16 格式的地址,一個很可能的原因是網絡中的 Windows Vista 操作系統默認會發送 IPv6 的路由器公告。使用
netsh interface IPv6 show interface "本地連接"
命令可以查看本地連接的參數,其中有一條:“發送路由器公告”,一定要設置為“否”。如果您的這個選項是“是”,那么您可以使用這個命令關閉它:
netsh interface IPv6 set interface “本地連接” advertise=disabled
如果獲得的全部是 2002 開頭的地址,可以使用下面命令進行重分配:
netsh interface IPv6 reset
2. IPv6 的路由表(網關)不對。tracert6 IPv6.google.com 就能看到本機是經過什么路由到 IPv6.google.com 的。如果從***跳就顯示連接超時,應該就是路由表出了問題。
兩個問題的解決方案如下:
netsh interface IPv6 set prefixpolicy 2001::/16 1 1 persistent
上面這條命令的意思是設置 Windows 更偏好使用 2001 開頭的 IPv6地址,避免使用 2002 開頭的地址。如果您 ping IPv6.google.com 使用的是 2001 開頭的地址,那么您不必執行上面這條命令。
netsh interface IPv6 add route 2001::/16 "本地連接" fe80::21a:30ff:fe4f:7000 persistent
上面這條命令的意思是為 2001 開頭的 IPv6地址使用正確的網關 fe80::21a:30ff:fe4f:7000(中科院某公寓)。這個網關可能隨著用戶所在網絡的不同而不同,簡單點兒的方法可以去看正常用戶的 ifconfig 網關地址。
之后執行 ping6 IPv6.google.com 看能否 ping 通,如果能 ping 通就說明 IPv6 工作正常了。
如果您經過以上兩步之后仍然無法解決問題的話,您可以使用 netsh interface IPv6 reset 命令來重置所有修改。
PS:
1. 如何確定網絡中哪些主機在發送路由器公告?
2002 后面的兩個字段就是該主機的 IPV4 地址,比如 2002:3b41:177e:8:18fc:7649:9e1d:2880,其中 3b41:177e 從 16 進制顯示換算成 IPV4 的 10 進制顯示地址就是 59.65.23.126。一般來說,V4 地址的分配更有規律,您可以從 V4 地址大致確定該主機的位置。
2. 如何確定虛假的路由記錄?
一般來說,IPv6 地址的*** 4 個域應該從網卡的物理地址中獲得,假設網卡物理地址是:00-17-31-94-99-EA,在 3,4 字節之間插入 FFFE 換成 EUI-64 格式是:00-17-31-FF-FE-94-99-EA,再對***個字節的第二位取反,就變成 02-17-31-FF-FE-94-99-EA,然后裝載到 IPv6 的本地地址中,就變成本地地址 fe80::217:31ff:fe94:99ea。根據網段的不同,在前面加上 4 個網絡域,就是主機的公網地址 2001:xxxx:xxxx:xxxx:217:31ff:fe94:99ea。
由于雙棧路由器是使用同一個網卡提供 V4 和 V6 的路由,那么路由器的 V4 地址和 V6 地址的物理地址是一樣的。通過 ping gateway_ipaddress_v4,然后 arp -a 看 V4 的網關地址對應的物理地址,與上面 V6 網關本地地址中獲得的物理地址相對照,就可以確定某路由記錄是否為可用的記錄。