跳转至

IPv6

一、disable

0) 先确认当前状态

cat /proc/sys/net/ipv6/conf/all/disable_ipv6
# 0 = 启用, 1 = 禁用

ip -6 addr
lsmod | grep ipv6

1) 推荐:用 sysctl 禁用(最通用、最干净)

A. 立即生效(临时)

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

可再加一条让路由也别尝试:

sudo sysctl -w net.ipv6.conf.all.accept_ra=0
sudo sysctl -w net.ipv6.conf.all.autoconf=0

B. 写入配置(重启仍生效)

创建 /etc/sysctl.d/99-disable-ipv6.conf

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

应用:

sudo sysctl --system

缺点:lo(localhost)上的 ::1会消失;个别程序若 硬编码 localhost=::1 可能会报错(通常改 /etc/hosts即可)。


2) 更“彻底”:GRUB / kernel boot 参数(适合服务器/云镜像)

编辑 grub 配置(按发行版二选一):

  • Debian/Ubuntu:/etc/default/grub
  • RHEL/Rocky/Alma/CentOS 7+:/etc/default/grub

GRUB_CMDLINE_LINUX里追加:

ipv6.disable=1

例如变成类似:

GRUB_CMDLINE_LINUX="... ipv6.disable=1"

然后更新 grub 并重启:

# Debian/Ubuntu
sudo update-grub

# RHEL/Rocky/Alma(UEFI 常见于 /boot/efi/EFI/…)
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
# 或
sudo grub2-mkconfig -o /boot/efi/EFI/$(ls /boot/efi/EFI)/grub.cfg

重启后验证:

lsmod | grep ipv6   # 通常看不到;ip -6 addr 几乎为空

ipv6.disable=1会把 IPv6 模块都禁掉,比 sysctl 更强;但某些云/容器环境不一定喜欢。


3) 如果你用的是 NetworkManager(桌面/很多服务器也会装)

NetworkManager 有时会“顶着 sysctl”再打开 IPv6,建议顺手关掉:

# 对所有连接(示例:先用 nmcli c 看名字)
nmcli c show

# 假设连接叫 eth0 / Wired\ connection\ 1
nmcli c modify "Wired connection 1" ipv6.method ignore
nmcli c up   "Wired connection 1"

# 或者 system-wide 禁止自动建 IPv6 地址(不保证 100%干掉)
nmcli c modify "Wired connection 1" ipv6.addr-gen-mode stable-privacy

4)常见坑:localhost / ::1 相关报错

如果 lo的 IPv6 被禁用后,有服务启动失败/报 cannot bind ::1 80

  1. 检查 /etc/hosts,确保至少保留:
127.0.0.1   localhost

必要时把 ::1 localhost那一行注释掉(不推荐长期,但能救急)。

  1. 有些服务配置里显式写了监听 ::,改成 0.0.0.0127.0.0.1