本文整理本次操作中的关闭方法、验证步骤和参数含义。用户已确认:在 GRUB 中添加 ipv6.disable=1,执行 update-grub 并重启后,IPv6 已关闭。

1. 适用范围

下文的永久关闭方法适用于使用 GRUB 启动的 Ubuntu。WSL、容器及使用其他引导器的系统不能直接套用此方法。

ipv6.disable=1 会禁用 IPv6 功能,包括网卡 IPv6 地址、本地回环地址 ::1 和 IPv6 socket。远程操作时应使用 IPv4 SSH 连接,重启后也通过 IPv4 重新连接。[1]

2. 永久关闭 IPv6

2.1 备份并编辑 GRUB 配置

在 Ubuntu 终端执行:

sudo cp -a /etc/default/grub "/etc/default/grub.bak.$(date +%Y%m%d-%H%M%S)"
sudo nano /etc/default/grub

备份文件名带有时间,便于区分不同次备份。

找到 GRUB_CMDLINE_LINUX= 这一行,在已有引号内追加 ipv6.disable=1,与其他参数之间用空格隔开。

例如,原配置为:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

修改为:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="ipv6.disable=1"

如果引号内已有其他参数,必须保留;以上是示例,不要直接覆盖原有参数。 如果该参数已经存在,无需再次追加。

在 nano 中按 Ctrl+O、回车保存,再按 Ctrl+X 退出。

2.2 更新配置并重启

保存工作后执行:

sudo update-grub && sudo reboot

update-grub 会重新生成 GRUB 启动配置;&& 表示只有前一条命令成功,才执行重启。[3]

如果配置文件不存在,或命令找不到、执行报错,应先检查实际使用的引导器,不要直接安装或替换 GRUB。

2.3 重启后验证

cat /proc/cmdline
ip -6 addr show

预期结果:

  • /proc/cmdline 中包含 ipv6.disable=1,说明本次启动已传入该参数。
  • ip -6 addr show 没有输出,说明当前没有 IPv6 地址,包括 ::1

如果 /proc/cmdline 中没有该参数,说明修改没有进入本次启动参数。需要检查 update-grub 的执行结果、实际启动的系统和引导器,以及 /etc/default/grub.d/ 中是否存在覆盖配置。

3. 为什么两行都添加会重复

GRUB 对两项配置的处理规则是:[2]

  • GRUB_CMDLINE_LINUX:应用于正常启动和恢复模式的 Linux 启动项。
  • GRUB_CMDLINE_LINUX_DEFAULT:额外追加到正常启动项,不应用于恢复模式。

用户本次实际使用了下面的配置,并确认重启后生效:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash ipv6.disable=1"
GRUB_CMDLINE_LINUX="ipv6.disable=1"

按照上述规则,正常启动时,由这两行产生的参数片段为:

ipv6.disable=1 quiet splash ipv6.disable=1

同一个 ipv6.disable=1 出现两次,禁用效果与传入一次相同。

参数添加位置正常启动恢复模式
GRUB_CMDLINE_LINUX_DEFAULT关闭 IPv6不通过此参数关闭 IPv6
GRUB_CMDLINE_LINUX关闭 IPv6关闭 IPv6
两处同时添加关闭 IPv6,参数重复关闭 IPv6

所以,在 GRUB_CMDLINE_LINUX 中添加一次即可。当前两处都添加且已经正常工作的配置,也可以保留。

这里的结论针对相同的 ipv6.disable=1,不能推广为所有启动参数重复时都没有影响。

4. quiet splash 是什么

这是两个控制开机显示效果的参数:[4][5]

参数作用
quiet减少启动时屏幕上的日志输出
splash显示图形启动画面,例如 Ubuntu 标志和加载动画
ipv6.disable=1禁用 IPv6 功能

quiet splash 与是否关闭 IPv6 无关,可以保留原有设置。

5. 临时关闭与持久配置的区别

如果只想临时关闭,可以在 IPv4 SSH 连接或本机终端中执行:

sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
ip -6 addr show

这些命令修改当前运行中的设置,没有写入启动配置,因此不能保证重启后仍然禁用。all 会影响当前接口,default 用于新接口;实际检查应查看接口状态,不能只根据 all.disable_ipv6 的读数下结论。[6]

此前提到的 /etc/sysctl.d/99-disable-ipv6.conf 属于另一种持久化方式:系统会在启动时加载该目录中的配置,但后续网络管理服务或其他配置可能重新调整接口设置。[7]

本次已通过 GRUB 方法达到永久关闭的目的,不需要再叠加上述临时命令。

6. 恢复 IPv6

6.1 移除 GRUB 禁用参数

sudo nano /etc/default/grub

GRUB_CMDLINE_LINUXGRUB_CMDLINE_LINUX_DEFAULT 中移除所有 ipv6.disable=1,保留其他参数。

例如:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX=""

6.2 清理此前添加的 sysctl 禁用配置

如果此前创建过 /etc/sysctl.d/99-disable-ipv6.conf,先检查内容:

cat /etc/sysctl.d/99-disable-ipv6.conf

如果文件仅包含本次添加的 IPv6 禁用配置,可以删除:

sudo rm /etc/sysctl.d/99-disable-ipv6.conf

如果文件还包含其他设置,仅编辑删除其中 disable_ipv6 = 1 的相关配置。若曾在其他 sysctl 文件中添加同类设置,也需要清理。没有创建过此文件则跳过这一步。

6.3 更新、重启并检查

sudo update-grub && sudo reboot

重启后执行:

cat /proc/cmdline
ip -6 addr show

启动参数中不应再有 ipv6.disable=1。重新启用 IPv6 后,网卡能否获得 IPv6 地址仍取决于本机网络配置及上游网络支持,不能以是否立即获得公网 IPv6 地址作为唯一判断依据。

参考资料

  1. Linux 内核:IPv6 参数说明
  2. GNU GRUB:启动配置项说明
  3. Ubuntu:update-grub 手册
  4. Linux 内核:启动参数说明
  5. Ubuntu:启动画面说明
  6. Linux 内核:IPv6 sysctl 参数说明
  7. Ubuntu:sysctl.d 启动配置说明