互联网协议版本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
重启。现在,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?