禁用所有IPv6必须四层协同:内核参数(ipv6.disable=1)、网络栈(sysctl三参数)、接口配置(IPV6INIT=no等)、服务监听(如sshd AddressFamily inet),否则ss仍显示:::22。

禁用所有 IPv6 协议不能只改 sysctl 或只关网卡配置——必须同时处理内核模块加载、网络协议栈、接口初始化和服务监听四层,否则 ss -tuln 仍会显示 :::22,ip addr 看不到 inet6 但攻击面仍在。
为什么 sysctl net.ipv6.conf.all.disable_ipv6=1 不够
这个设置只是让内核“不给接口分配地址、不响应邻居请求”,但 ipv6 模块依然在内存里运行:lsmod | grep ipv6 仍有输出,/proc/sys/net/ipv6/ 目录也存在。后果包括:
- SSH 默认仍监听
:::22(除非你额外改了/etc/ssh/sshd_config的AddressFamily) -
ss -tuln输出中保留tcp6行 - 某些服务(如
vsftpd)因listen_ipv6=YES启动失败,或 fallback 到奇怪行为
真正禁用:从内核参数开始(ipv6.disable=1)
这是唯一能让 ipv6 模块完全不加载的方法,适用于 CentOS/RHEL 7/8、Ubuntu 18.04+ 等主流发行版:
- 编辑
/etc/default/grub,在GRUB_CMDLINE_LINUX行末尾添加ipv6.disable=1(注意不是GRUB_CMDLINE_LINUX_DEFAULT) - 执行
sudo grub2-mkconfig -o /boot/grub2/grub.cfg(CentOS/RHEL)或sudo update-grub(Ubuntu/Debian) - 重启后验证:
lsmod | grep ipv6应无输出;cat /proc/sys/net/ipv6/conf/all/disable_ipv6 2>/dev/null || echo "目录不存在"应提示“目录不存在”
配套必须清理的三层配置
即使内核已禁用,NetworkManager、systemd-networkd 或传统 network 服务仍可能尝试启用 IPv6,尤其在 DHCP 场景下:
-
网卡配置文件(如
/etc/sysconfig/network-scripts/ifcfg-ens33):设IPV6INIT=no、IPV6_AUTOCONF=no、IPV6_DEFROUTE=no -
SSH 服务:在
/etc/ssh/sshd_config中显式写AddressFamily inet,再sudo systemctl restart sshd -
全局网络开关(RHEL/CentOS):确认
/etc/sysconfig/network中有NETWORKING_IPV6=no
验证是否真禁用成功
别只信 ip -6 addr show ——它显示 fe80:: 是内核 fallback 行为,即使 disable_ipv6=1 也会出现。必须同时检查:
-
lsmod | grep -i ipv6→ 无输出 -
ss -tuln | grep ':22'→ 只有*:22,没有:::22 -
ping6 ::1 2>/dev/null || echo "IPv6 stack unreachable"→ 应报错 -
curl -6 https://ipv6.google.com 2>/dev/null || echo "no IPv6 transport"→ 应失败
漏掉任何一层,都可能让 IPv6 在某个角落悄悄复活——比如 systemd-resolved 自动启用 IPv6 DNS 查询,或容器运行时默认桥接支持 IPv6。真正“禁用所有”,意味着你得主动堵住每个入口,而不是等它出问题再补。


















