linux中关闭IPv6
2010-07-25 18:49:28 阿炯


所有现代Linux发行版默认都自动启用IPv6。为了能看到IPv6在你的Linux中是否被激活,可以使用ifconfig或ip命令。如果你在输入这些命令之后看到"inet6"字样的输出,那就意味着你的Linux系统启用了IPv6。

---------------------------------
1、检测IPV6是否启用


1.1、使用ifconfig查看自己的IP地址是否含有IPv6地址
eth0      Link encap:Ethernet  HWaddr 08:00:27:7a:71:1c
inet addr:192.168.0.8  Bcast:192.168.0.255  Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe7a:711c/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:15118 errors:0 dropped:0 overruns:0 frame:0
TX packets:3421 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:21033879 (20.0 MiB)  TX bytes:325980 (318.3 KiB)

或使用ip指令:
ip a | grep inet6

1.2、查看服务监听的IP中是否有IPv6格式的地址
[root@centos ~]# netstat -tuln
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:389             0.0.0.0:*               LISTEN      2524/slapd     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      1687/sshd      
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      1744/0         
tcp        0      0 127.0.0.1:6011          0.0.0.0:*               LISTEN      1812/1         
tcp6       0      0 :::389                  :::*                    LISTEN      2524/slapd     
tcp6       0      0 :::22                   :::*                    LISTEN      1687/sshd      
tcp6       0      0 ::1:6010                :::*                    LISTEN      1744/0         
tcp6       0      0 ::1:6011                :::*                    LISTEN      1812/1

1.3、使用lsmod|grep ipv6查看ipv6的模块是否被加载
[root@centos ~]# lsmod|grep ipv6
ipv6                  243425  19

1.4、查看系统虚拟文件系统的参数
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
 
显示0说明ipv6开启,1说明关闭

-----------------------------
2、关闭IPV6


2.1、通用的关闭IPV6(redhat)
#vim /etc/modprobe.conf
添加下面两行内容
alias net-pf-10 off
alias ipv6 off

保存退出,并且重新启动系统。重启之后可以使用上面的三种方法去验证IPv6支持是否已经被关闭,当然还有其它方法来实现。

2.1.1、修改/etc/sysconfig/network,追加:
NETWORKING_IPV6=no

2.1.2、修改/etc/hosts,把ipv6的那句本地主机名解析的也注释掉:
#::1   localhost localhost6 localhost6.localdomain6

2.1.3、让系统不加载ipv6相关模块,这需要修改modprobe相关设定文件,为了管理方便,我们新建设定文件/etc/modprobe.d/closeipv6.conf(RHEL6.0之后没有了/etc/modprobe.conf这个文件),内容如下,三种方式可心实现:

alias net-pf-10 off
options ipv6 disable=1

或者
install ipv6 /bin/true

或者
install ipv6 /sbin/modprobe -n -i ipv6
注意:如果你使用了网卡绑定(bond)技术,而且不希望用ipv6,那么你使用第一种,否则系统启动时,bonding模块可能会加载失败。

2.2、关闭IPV6(debian)
You should also make changes to /etc/modprobe.d/aliases.conf (lenny just calls it aliases):
# alias net-pf-10 ipv6
alias net-pf-10 off
alias ipv6 off

2.3、通用的方法
在/etc/sysctl.conf 增加下面几行,并重启。
#disable IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

/etc/modprobe.d/aliases
alias net-pf-10 ipv6

/etc/modprobe.d/blacklist
blacklist ipv6

保存文件&重启电脑,必须重启电脑才生效。

以上方法不适用于较新的系统,新的版本想要禁止 IPV6 需要在启动内核后面加入"disable_ipv6=1"做内核参数直接传递。

方法如下:
vim /etc/default/grub

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
变为
GRUB_CMDLINE_LINUX_DEFAULT="ipv6.disable=1 quiet splash"

执行'update-grub',重启后生效。


-----------------------------
3、新版本Linux关闭IPV6(内核3.x以上)

临时禁用IPv6


如果你想要在你的Linux系统上临时关闭IPv6,你可以用 /proc 文件系统。"临时"的意思是我们所做的禁用IPv6的更改在系统重启后将不被保存。IPv6会在你的Linux机器重启后再次被启用。

要将一个特定的网络接口禁用IPv6,使用以下命令:
echo 1 > /proc/sys/net/ipv6/conf/<interface-name>/disable_ipv6

举个例子,将eth0接口禁用IPv6:
echo 1 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6

重新启用eth0接口的IPv6:
echo 0 > /proc/sys/net/ipv6/conf/eth0/disable_ipv6

如果你想要将整个系统所有接口包括回环接口禁用IPv6,使用以下命令:
echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6

永久禁用IPv6

以上方法是不能永久禁用IPv6的,你一旦重启系统IPv6还是会被启用。如果你想要永久关闭它,有几个方法你可以试试。

方法一

第一种方法是通过 /etc/sysctl.conf 文件对 /proc 进行永久修改。换言之,就是用文本编辑器打开 /etc/sysctl.conf 然后添加以下内容:
# 禁用整个系统所有接口的IPv6
net.ipv6.conf.all.disable_ipv6 = 1
# 禁用某一个指定接口的IPv6(例如:eth0, lo)
net.ipv6.conf.lo.disable_ipv6 = 1
net.ipv6.conf.eth0.disable_ipv6 = 1

在 /etc/sysctl.conf 使这些更改生效,运行以下命令:
sysctl -p /etc/sysctl.conf

或者直接重启。

方法二

另一个永久禁用IPv6的方法是在开机的时候传递一个必要的内核参数。用编辑器打开 /etc/default/grub 并给GRUBCMDLINELINUX变量添加"ipv6.disable=1"。
GRUB_CMDLINE_LINUX="xxxxx ipv6.disable=1"

上面的"xxxxx"代表任何已有的内核参数,在它后面添加"ipv6.disable=1"。不要忘记用以下方法保存对GRUB(2)的修改:

Deb或Linux Mint系统:
update-grub

Rpm系统:
grub2-mkconfig -o /boot/grub2/grub.cfg

现在只要你重启你的Linux系统,IPv6就会完全被禁用。

禁用IPv6之后的其它可选步骤

这里有一些在你禁用IPv6后需要考虑的可选步骤,这是因为当你在内核里禁用IPv6后,其它程序也许仍然会尝试使用IPv6。在大多数情况下,应用程序的这种行为不太会影响到什么,但是出于效率或安全方面的原因,你可以为他们禁用IPv6。
/etc/hosts

根据你的设置, /etc/hosts 会包含一条或多条IPv6的hosts和它们的地址。用文本编辑器打开 /etc/hosts 并注释掉包含IPv6 hosts的脚本行。
# comment these IPv6 hosts
# ::1     ip6-localhost ip6-loopback
# fe00::0 ip6-localnet
# ff00::0 ip6-mcastprefix
# ff02::1 ip6-allnodes
# ff02::2 ip6-allrouters

Network Manager

如果你在用NetworkManager来管理你的网络设置,你可以在NetworkManager里禁用IPv6。在NetworkManager打开wired connection,点击"IPv6 Settings"选项并在"Method"一栏选择"Ignore",保存退出。

SSH服务

默认情况下,OpenSSH服务(sshd)会去尝试捆绑IPv4和IPv6的地址。要强制sshd只捆绑IPv4地址,用文本编辑器打开 /etc/ssh/sshd_config 并添加以下行。inet只适用于IPv4,而inet6是适用于IPv6的。
AddressFamily inet

然后重启sshd服务。

-----------------------------
4、开启IPV6


IPv6是默认支持的,所以当你要重新开起IPv6支持时,将上面的操作回转一下既可。


在CentOS 7上启用IPv6

IPv6 Gateway

In your network file add IPV6INIT and IPV6_DEFAULTGW
$ vi /etc/sysconfig/network
IPV6INIT=yes
IPV6_DEFAULTGW=2607:fc30:100:1000::1

Set IPv6 Static Interface Address

Add IPV6INIT and IPv6ADDR to your interface settings.

$ cat /etc/sysconfig/network-scripts/ifcfg-em1
IPV6INIT=yes
IPV6_AUTOCONF=no
IPV6ADDR=2607:fc30:100:1000::2/64

重启网络接口
systemctl restart network

验证一下
ping6 www.freeoa.net



该文章最后由 阿炯 于 2019-04-09 11:08:17 更新,目前是第 2 版。