如何在Linux發行版下禁用IPv6?
譯文互聯網協議版本6(IPv6)是互聯網協議(IP)的最新版本;而IP是一種通信協議,它為眾多網絡上的計算機提供了一種識別和定位系統,并且跨互聯網路由轉發流量。IPv6當初由互聯網工程任務組(IETF)開發,旨在處理期待已久的IPv4地址耗盡問題。IPv6的初衷是取代IPv4。IPv6比較新,有時會出現行為異常,這取決于配置方式。本文將介紹如何在Ubuntu、Debian、Kali和Linux Mint等Linux發行版下禁用IPv6。
互聯網上的每一個設備都被分配了一個IP地址,以識別身份和確定位置。由于互聯網在上世紀90年代迎來商業化浪潮后發展迅猛,很顯然需要比IPv4地址空間多得多的地址,以連接將來的眾多新設備。到1998年,互聯網工程任務組(IETF)敲定了后續協議:IPv6。IPv6使用128位地址,允許2128個(相當于約3.4×1038個)地址,也就是比IPv4多7.9×1028倍,后者使用32位地址,提供約43億個地址。這兩種協議并不是被設計成協同運行的,這增添了向IPv6遷移的復雜性。然而,幸好已設想出了幾種IPv6遷移機制,以便IPv4主機和IPv6主機之間能夠通信。
除了提供更大的地址空間外,IPv6還具有其他的技術優點。尤其是,它允許分層地址分配方法,這些方法便于跨互聯網的路由聚集,因而限制了路由表的不斷擴大。多播地址的使用得到了擴展和簡化,并為服務交付提供了額外的優化。該協議在設計當初就已經考慮到了設備移動性、安全性和配置等方面。
IPv6地址由8組四個十六進制位表示,組與組之間由分號隔開,比如2001:0db8:85a3:0042:1000:8a2e:0370:7334,但是有一些方法可以縮短這種全面標記法。不過,IPv6還沒有得到廣泛的支持,采用率仍在逐漸提高。
你的系統支持IPv6嗎?
為了讓IPv6正常工作,你就需要一款支持IPv6的操作系統。Ubuntu、Debian、Linux Mint和大多數現代發行版支持它。你可以查看ipconfig的輸出結果,看看IPv6是否正常工作,它是否被分配給了網絡接口:
- $ ifconfig
- eth0 Link encap:Ethernet HWaddr 00:1c:c0:f8:79:ee
- inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
- inet6 addr: fe80::21c:c0ff:fef8:79ee/64 Scope:Link
- UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
- RX packets:110880 errors:0 dropped:0 overruns:0 frame:0
- TX packets:111960 errors:0 dropped:0 overruns:0 carrier:0
- collisions:0 txqueuelen:1000
- RX bytes:62289395 (62.2 MB) TX bytes:25169458 (25.1 MB)
- Interrupt:20 Memory:e3200000-e3220000
- lo Link encap:Local Loopback
- inet addr:127.0.0.1 Mask:255.0.0.0
- inet6 addr: ::1/128 Scope:Host
- UP LOOPBACK RUNNING MTU:65536 Metric:1
- RX packets:45258 errors:0 dropped:0 overruns:0 frame:0
- TX packets:45258 errors:0 dropped:0 overruns:0 carrier:0
- collisions:0 txqueuelen:0
- RX bytes:4900560 (4.9 MB) TX bytes:4900560 (4.9 MB)
查看inet6 addr這一行。
接下來你需要同樣支持IPv6的路由器/調制解調器。除此之外,你的互聯網服務提供商(ISP)也得支持IPv6。
不用檢查網絡基礎設施的每一個部分,更好的辦法就是只要查明你能不能通過IPv6連接到網站。有許多網站可以對你的連接測試IPv6支持。比如說,試著連接到http://testmyipv6.com/。
啟用IPv6的內核參數如下所示:
- $ sysctl net.ipv6.conf.all.disable_ipv6
- net.ipv6.conf.all.disable_ipv6 = 0
- $ sysctl net.ipv6.conf.default.disable_ipv6
- net.ipv6.conf.default.disable_ipv6 = 0
- $ sysctl net.ipv6.conf.lo.disable_ipv6
- net.ipv6.conf.lo.disable_ipv6 = 0
通過proc文件同樣能查看:
- $ cat /proc/sys/net/ipv6/conf/all/disable_ipv6
- 0
注意:變量控制著IPv6的disabling。于是將它們設成1,就可以禁用IPv6。
如果IPv6不受支持,就禁用它
所以,如果IPv6在你的網絡基礎設施上不受支持,完全禁用它可能很有用。原因何在?因為IPv6在不支持它的網絡上會引起一些問題,比如域名查詢延遲,比如不必要地試圖連接到IPv6地址,導致網絡連接延遲,等等。
我確實遇到過諸如此類的一些問題。apt-get命令偶爾會試圖連接到IPv6地址,連接失敗后,會重新試著連接到IPv4地址。不妨看看這個輸出結果:
- $ sudo apt-get update
- Ign http://archive.canonical.com trusty InRelease
- Ign http://archive.canonical.com raring InRelease
- Err http://archive.canonical.com trusty Release.gpg
- Cannot initiate the connection to archive.canonical.com:80 (2001:67c:1360:8c01::1b). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::1b 80]
- Err http://archive.canonical.com raring Release.gpg
- Cannot initiate the connection to archive.canonical.com:80 (2001:67c:1360:8c01::1b). - connect (101: Network is unreachable) [IP: 2001:67c:1360:8c01::1b 80]
- .....
諸如此類的錯誤在最新的Ubuntu版本中比較常見,可能是由于這些版本試圖比以往更頻繁地使用IPv6。
我注意到了類似的問題出現在Hexchat等其他的應用程序中,在Google Chrome中也出現過,有時要花比平常更長的時間來查詢域名。
所以最好的解決辦法就是完全禁用IPv6,以此杜絕那些問題。這只需要一處小小的配置,就能幫助你解決系統上的許多網絡問題。用戶甚至反映,改動配置后,互聯網速度有所提升。
#p#
第一種方法:禁用IPv6
編輯文件/etc/sysctl.conf:
- $ sudo gedit /etc/sysctl.conf
然后在該文件的末尾處填寫下列幾行:
- # IPv6 disabled
- net.ipv6.conf.all.disable_ipv6 = 1
- net.ipv6.conf.default.disable_ipv6 = 1
- net.ipv6.conf.lo.disable_ipv6 = 1
保存文件,關閉文件。
使用下列命令重啟sysctl
- $ sudo sysctl -p
再次查看ifconfig的輸出結果,現在應該沒有ipv6地址了。
- $ ifconfig
- eth0 Link encap:Ethernet HWaddr 08:00:27:5f:28:8b
- inet addr:192.168.1.3 Bcast:192.168.1.255 Mask:255.255.255.0
- UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
- RX packets:1346 errors:0 dropped:0 overruns:0 frame:0
- TX packets:965 errors:0 dropped:0 overruns:0 carrier:0
- collisions:0 txqueuelen:1000
- RX bytes:1501691 (1.5 MB) TX bytes:104883 (104.8 KB)
要是這一招不管用,那么試試重啟系統,再次查看ifconfig。
第二種方法:禁用IPv6,使用GRUB方法
還可以編輯grub配置文件,以此禁用IPv6。
- $ sudo gedit /etc/default/grub
找到含有GRUB_CMDLINE_LINUX的這一行,編輯該行,如下所示。
- GRUB_CMDLINE_LINUX="ipv6.disable=1"
同樣還可以添加到名為GRUB_CMDLINE_LINUX_DEFAULT的變量的值,任何一種方法都管用。保存文件,關閉文件,重新生成grub配置。
- $ sudo update-grub2
重啟?,F在,IPv6應該已被禁用了。
第三種方法:不禁用IPv6,設置IPv4的優先級高于IPv6
找到getaddrinfo(3)配置文件,也就是/etc/gai.conf,并去掉相應行的注釋,讓IPv4的優先級高于IPv6。
- $ sudo gedit /etc/gai.conf
找到這一行,去掉其注釋:
- #precedence ::ffff:0:0/96 100
那樣一來,它看起來就像這樣:
- precedence ::ffff:0:0/96 100
保存并退出文件。重啟后一切都搞定了,因為現在優先處理的是IPv4。如果你要啟用IPv6,但是在執行DNS查詢之類的操作時優先處理IPv4,這是最佳方法。
結束語
禁用IPv6會帶來問題。如果你的互聯網連接和路由器已經遷移到了IPv6,你就會失去合理使用它的能力。一些家庭網絡功能可能也需要IPv6,比如說,Windows 7和Linux等操作系統中引入的易于使用的家庭組(Homegroup)家庭網絡功能就需要啟用你家庭網絡上的計算機中的IPv6,才能使用它。
整個世界正在向IPv6遷移,不過進展過于緩慢。IPv6是取代IPv4的必要技術,因為我們快用盡IPv6,IPv6才是解決之道。在這種大環境下,最后一種設置優先級的方法(不禁用IPv6,設置IPv4的優先級高于IPv6)是更好的方法。你很有可能實際上在自己的網絡上不需要IPv6,除非依賴Windows家庭組或類似的功能,所以如果你明確知道自己在干嘛,禁用它可能危害不會特別大。然而,除非互聯網服務提供商的網絡或你的家庭網絡存在嚴重問題,否則如果你繼續堅持使用IPv4,不會看到速度有所提升的情況。
總之一句話,如果你注意到IPv6需要修復,那么今天就修復,而不是拖到明天才修復。我們置身于大規模部署IPv6的早期時代,我們需要協同工作,才能化解出現的部署難題。上述的這些解決辦法只是代表一小部分的潛在問題。你總是可以上網尋求幫助,有許多靠譜的IPv6討論論壇可以幫你答疑解惑。要把網絡行為異常當成是了解和改善IPv6互聯狀態的機會,要忍住禁用這種協議的任何沖動。
原文標題:How to disable IPv6 in Linux?