ubuntu#002#Ubuntu禁用IPv6的方法

IPv6很香,但当前的普及情况下,不是说一定不会给我们的使用和开发带来问题。我现在正基于Ubuntu开发调试TCP/IP协议栈,发现Ubuntu会默认给每块网卡配置一个IPv6的地址,有了IPv6地址之后,相应的协议数据就会发给这个网卡,导致数据混乱,不利于开发。所以为了开发的便捷,先将IPv6机制禁止掉。

方法1:使用GRUB永久禁用IPv6

配置GRUB,使其在系统启动时向内核传递参数,禁用IPv6。
该方法主要是修改 /etc/default/grub 中的相关启动参数。这种方法是最简单的方法,但需要你重启系统。

第一步:修改 /etc/default/grub 启动参数

下图是我们修改之前的启动参数配置:

修改方法如下:

1
$ sudo vi /etc/default/grub

找到下面这行:

1
GRUB_CMDLINE_LINUX=""

然后修改参数:

1
GRUB_CMDLINE_LINUX="ipv6.disable=1"

修改后的文件如下图所示:

第二步:更新GRUB,然后重启系统

使用如下命令:

1
2
3
$ sudo update-grub
$
$ sudo shutdown -r now

第三步:重启之后,我们看下网卡是否还有IPv6地址

配置之前:

配置之后:

可见,网卡上已经没有了IPv6的地址。

方法2:使用sysctl临时禁用IPv6

我们使用如下命令来临时禁用IPv6:

1
2
3
$ sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
$ sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
$ sudo sysctl -w net.ipv6.conf.lo.disable_ipv6=1

使用效果如下图所示:

这种方法不需要我们重启操作系统,也达到了禁用IPv6的效果。但注意:这种方法只是临时禁用,系统重启之后,IPv6会重新启用。

方法3:使用sysctl永久禁用IPv6

如果要使用sysctl达到永久禁用IPv6的效果,那我们需要修改配置文件 /etc/sysctl.conf ,从而使内核参数持久化。

这里我们按照别人的经验,不直接修改 /etc/sysctl.conf ,而是创建一个 /etc/sysctl.d/60-custom.conf 自定义配置文件。

第一步:使用如下命令,创建并打开 /etc/sysctl.d/60-custom.conf :

1
sudo vi /etc/sysctl.d/60-custom.conf

第二步:然后将如下三行内容拷贝到该文件中:

1
2
3
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

第三步:使用如下命令,使得新配置文件生效

1
2
$ sudo sysctl -p
$ sudo systemctl restart procps

最终文件如下所示:

然后我们查看下结果,确实不再有IPv6地址了。

注意!注意!注意! 使用该方法不一定保证重启后,马上可以起效,所以为了保证重启有效,请一定要进行第四步。

第四步:创建启动加载文件 /etc/rc.local

我们使用如下命令,创建并打开 /etc/rc.local :

1
$ sudo vi /etc/rc.local

然后将如下内容拷贝到该文件中:

1
2
3
4
5
6
7
#!/bin/bash
# /etc/rc.local

/etc/sysctl.d
/etc/init.d/procps restart

exit 0

最终文件如下所示:

然后修改 /etc/rc.local 的文件权限,使其具有可执行属性:

1
$ sudo chmod 0755 /etc/rc.local

至此,我们再次重启之后,将会发现网卡已经不再有IPv6地址了,从而达到了我们永久禁用IPv6的目的。

方法4:使用netplan永久禁用IPv6

Ubuntu使用netplan来配置网络,我们可以在其配置文件,给特定的某张网卡指定 link-local: [ ipv4 ] 属性,从而只启用IPv4,而不启用IPv6的效果。该方法也可以做到永久起效。

使用方法如下图所示,在ens33的配置项中,添加 link-local: [ ipv4 ]:

修改配置文件之后,使用如下命令,使其生效:

1
$ sudo netplan apply

参考资料