禁用 IPv6 必须分层处理:内核加载(GRUB 加 ipv6.disable=1)、网络栈(sysctl 三参数)、接口配置(IPV6INIT=no 等)、服务依赖(如 sshd 的 AddressFamily inet),缺一不可,否则会出现 ip addr 无 inet6 但 ss -tuln 仍监听 :::22 的现象。

直接说结论:禁用 IPv6 不能只改一个地方,必须分层处理——内核加载、网络栈、接口配置、服务依赖这四层都得对齐,否则会出现 ip addr 看不到 inet6 却仍有 ss -tuln 监听 :::22 的诡异现象。
sysctl 配置只禁用网络栈,不卸载内核模块
这是最常用也最容易误判的方法。写入 /etc/sysctl.conf 的三行参数:
net.ipv6.conf.all.disable_ipv6 = 1net.ipv6.conf.default.disable_ipv6 = 1net.ipv6.conf.lo.disable_ipv6 = 1
执行 sudo sysctl -p 后,/proc/sys/net/ipv6/conf/all/disable_ipv6 会变成 1,但 lsmod | grep ipv6 仍能看到 ipv6 模块加载着。这意味着内核仍在运行 IPv6 协议栈,只是不给接口分配地址、不响应邻居请求。
常见错误现象:
- SSH 仍监听 :::22(除非你额外改了 /etc/ssh/sshd_config 中的 AddressFamily inet)
- ss -tuln 输出里还有 tcp6 行
- 某些服务(如 vsftpd)启动失败,因为默认启用了 listen_ipv6=YES
GRUB 参数才能真正阻止 IPv6 模块加载
要让内核启动时就不加载 IPv6,必须在 /etc/default/grub 的 GRUB_CMDLINE_LINUX 里加 ipv6.disable=1:
GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet ipv6.disable=1"
注意:
- 不是 GRUB_CMDLINE_LINUX_DEFAULT(CentOS 7/8 用的是 GRUB_CMDLINE_LINUX)
- 修改后必须运行 sudo grub2-mkconfig -o /boot/grub2/grub.cfg,否则无效
- 重启后验证:执行 lsmod | grep ipv6 应该完全无输出,cat /proc/sys/net/ipv6/conf/all/disable_ipv6 也会是 0(因为模块压根没加载,这个 sysctl 值就不存在了)
网卡配置文件要同步关闭 IPv6 初始化
即使内核和 sysctl 都关了,NetworkManager 或传统 network service 仍可能尝试启用 IPv6,尤其在 DHCP 场景下。编辑对应接口配置文件(如 /etc/sysconfig/network-scripts/ifcfg-ens33):
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离
IPV6INIT=noIPV6_AUTOCONF=noIPV6_DEFROUTE=noIPV6_PEERDNS=noIPV6_FAILURE_FATAL=no
如果用的是 NetworkManager(CentOS 8+ 默认),还要检查 /etc/NetworkManager/system-connections/*.nmconnection 文件,确保里面有:
[ipv6]method=ignore
改完记得重启网络服务:sudo systemctl restart NetworkManager 或 sudo systemctl restart network,取决于你用哪个管理器。
别忘了检查依赖 IPv6 的服务配置
禁用 IPv6 后,很多服务会出问题,不是因为协议本身,而是它们默认开启了 IPv6 支持:
-
sshd:必须在/etc/ssh/sshd_config中显式设置AddressFamily inet,否则仍会监听:::22 -
vsftpd:需设listen_ipv6=NO,否则服务启动失败 -
httpd:检查Listen指令是否含[::]:80,建议改为Listen 0.0.0.0:80 -
named(BIND):若配置了listen-on-v6,需注释或删掉
这些服务重启前不改配置,就会出现“IPv6 看似关了,但服务连不上”的典型故障。
真正可靠的禁用,不是靠单一命令或一行参数,而是让内核、网络栈、接口层、服务层全部达成一致。最容易被忽略的是服务配置项——它们不会报错,只是默默监听你已禁用的地址族,导致排查时绕一大圈。

















