linux默认启用ipv6但需四层同步关闭:①内核参数ipv6.disable=1;②sysctl禁用协议栈;③网卡配置ipv6init=no等五项;④sshd设addressfamily inet。验证须满足lsmod无ipv6、/proc/sys/net无ipv6目录、ip -6 addr为空、ss无:::22监听。

Linux系统默认启用IPv6协议栈,但很多服务器环境并不需要它——反而会导致SSH连接延迟、服务监听混乱、DNS解析异常等问题。必须从内核加载、网络栈、接口配置、关键服务四个层面同步关闭,缺一不可。
确认当前IPv6真实启用状态
别只看ip -6 addr show有没有fe80::地址,那是内核强制fallback行为,即使IPv6已禁用也会出现。真正有效的验证必须同时满足三项:
执行lsmod | grep ipv6,有输出说明模块已加载;
执行sysctl net.ipv6.conf.all.disable_ipv6,返回值为0才表示协议栈开启;
执行cat /proc/sys/net/ipv6/conf/all/disable_ipv6,也必须是0;三者任一为1或无输出,IPv6就未完全启用。
永久关闭IPv6(四层同步法)
第一步:禁止内核加载IPv6模块(最彻底)
编辑/etc/default/grub,在GRUB_CMDLINE_LINUX行末尾添加ipv6.disable=1(注意不是GRUB_CMDLINE_LINUX_DEFAULT);
第二步:刷新GRUB配置
【sudo grub2-mkconfig -o /boot/grub2/grub.cfg】——这一步漏掉,重启后参数不生效;
第三步:关闭网络栈开关
向/etc/sysctl.conf追加三行:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
然后运行sudo sysctl -p立即应用;
第四步:关闭网卡级IPv6初始化
编辑对应网卡配置文件(如/etc/sysconfig/network-scripts/ifcfg-ens33),确保含以下五项:
IPV6INIT=no
IPV6_AUTOCONF=no
IPV6_DEFROUTE=no
IPV6_PEERDNS=no
IPV6_FAILURE_FATAL=no
第五步:显式约束关键服务只用IPv4
编辑/etc/ssh/sshd_config,加入或修改AddressFamily inet——否则即使系统没IPv6地址,sshd仍会监听:::22,导致ss -tuln里持续出现tcp6行。
临时关闭IPv6(仅用于测试或紧急规避)
方法一:单接口快速禁用
执行echo 1 | sudo tee /proc/sys/net/ipv6/conf/ens33/disable_ipv6,把ens33换成你的实际网卡名;
方法二:全局临时关闭(重启即失效)
依次执行: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模块,lsmod | grep ipv6仍有输出,且某些服务(如vsftpd)可能因监听IPv6失败而启动报错。
验证是否真正关闭
重启系统后执行:
lsmod | grep ipv6——应无任何输出;
ls /proc/sys/net/——输出中不应含ipv6目录;
ip -6 addr show——应为空;
ss -tuln | grep ':22'——只显示*:22,不出现*:::22;
若以上全部满足,IPv6协议栈已彻底关闭。











