禁用 IPv6

最后更新: 2023-03-26 06:47:41 +0800 +0800
原文以英文撰写。您正在阅读AI翻译版本。

禁用 IPv6 会移除仅 IPv6 的可达性,并可能破坏环回、容器、DNS 和应用程序的假设。在将其视为超时问题的解决方案之前,请先诊断地址选择和连接情况。

先诊断地址选择 #

名称解析可能同时返回 IPv6 和 IPv4 地址。双栈客户端使用地址选择和连接回退逻辑;故障也可能表明存在 DNS、路由、防火墙策略、路径 MTU 发现问题,或者服务仅绑定到 IPv4。

sh
getent ahosts localhost
ip -6 address show
ip -6 route show
curl -6 --connect-timeout 5 https://example.com/

测试目标和服务绑定情况。监听器位于 127.0.0.1 时,无法通过 ::1 访问;请显式配置预期的 IPv4 和 IPv6 监听器。修复故障路径可以保留双栈运行。

在启动时禁用 IPv6 #

内核命令行参数 ipv6.disable=1 会从启动时禁用 IPv6 功能。它会阻止 IPv6 地址和 IPv6 套接字;重新启用需要重启。通过引导加载程序的持久化配置添加该参数,使用发行版文档中记录的命令重新生成已部署的启动项,然后重启。

GRUB 配置可以包含:

properties
GRUB_CMDLINE_LINUX="ipv6.disable=1"

在 Arch 系统上,编辑后重新生成配置:

sh
sudo grub-mkconfig -o /boot/grub/grub.cfg

不同系统的安装路径和引导加载程序各不相同。重启后请验证 /proc/cmdline,不要假设使用了编辑过的文件。当引导加载程序使用 initramfs 或统一内核映像时,也应通过相应的构建流程更新其命令行。

通过 sysctl 控制 IPv6 #

disable_ipv6 sysctl 会为某个接口禁用地址和 IPv6 操作,同时保留已加载的 IPv6 内核支持。在 sysctl 配置文件中保存持久化默认值:

conf
# /etc/sysctl.d/99-disable-ipv6.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1

使用 sudo sysctl --system 应用更改,或重启。all 会影响现有接口;default 为之后创建的接口提供该值。使用 net.ipv6.conf.<interface>.disable_ipv6 控制特定接口,例如:

sh
sudo sysctl -w net.ipv6.conf.wlan0.disable_ipv6=1

网络管理器、容器和 VPN 软件可能会在启动后创建接口,因此这两个设置都很重要。在此方法下,后续的 sysctl 写入可能会重新启用 IPv6。

验证生效状态及其影响 #

sh
cat /proc/cmdline
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
ip -6 address show
ss -lnt6

使用 ipv6.disable=1 时,IPv6 proc 层级结构可能不存在,并且无法打开 IPv6 套接字。使用 sysctl 方法时,值为 1 表示所选接口的行为已确认。更改任一设置后,请测试相关应用程序:localhost 解析、绑定到 ::1 的服务、仅 IPv6 的 DNS 记录、容器网络、VPN 和监控代理都可能依赖 IPv6 支持。

评论

在 GitHub 上阅读或评论(发表评论需要登录)