方法一、通过内核参数彻底禁用 IPv6(系统级)
这是最彻底、兼容性最好的方式,适用于所有网络管理工具(包括 network、NetworkManager、systemd-networkd)。
步骤 1:编辑 GRUB 配置
bash
sudo vi /etc/default/grub
在 GRUB_CMDLINE_LINUX 行末尾添加:
bash
ipv6.disable=1
步骤 2:更新 GRUB 配置
-
BIOS 系统:
bashsudo grub2-mkconfig -o /boot/grub2/grub.cfg -
UEFI 系统:
bashsudo grub2-mkconfig -o /boot/efi/EFI/almalinux/grub.cfg
步骤 3:重启生效
bash
sudo reboot
验证是否禁用成功:
bash
# 检查内核参数
cat /proc/cmdline | grep ipv6.disable
# 检查 IPv6 模块是否加载(应无输出)
lsmod | grep ipv6
# 检查网络接口(不应有 inet6 地址)
ip a
方法二:仅在网络配置中禁用(不推荐,可能残留)
如果你不想重启 ,或只想在 network 服务层面禁用(但内核仍加载 IPv6),可修改网络脚本:
步骤 1:编辑全局网络配置
bash
sudo vi /etc/sysconfig/network
添加以下两行:
bash
NETWORKING_IPV6=no
IPV6_AUTOCONF=no
步骤 2:在每个网卡配置中禁用 IPv6
例如编辑 /etc/sysconfig/network-scripts/ifcfg-eth0(或你的网卡名):
bash
# 确保包含以下行
IPV6INIT=no
IPV6_AUTOCONF=no
步骤 3:重启网络服务
bash
sudo systemctl restart network
此方法的局限性:
- 内核仍加载 IPv6 模块
- 某些服务(如 sshd、docker)可能仍监听 IPv6
- 不如方法一彻底
补充:禁用 IPv6 相关服务监听(可选)
即使禁用 IPv6,某些服务默认仍绑定 ::(IPv6)。建议检查:
1. SSHD
编辑 /etc/ssh/sshd_config:
bash
AddressFamily inet
然后重启:
bash
sudo systemctl restart sshd
2. 其他服务(如 httpd, nginx)
确保配置中只监听 IPv4 地址,例如:
nginx
listen 80; # 而不是 listen [::]:80;
验证:IPv6 是否完全禁用
bash
# 1. 检查内核参数
cat /proc/cmdline | grep -q "ipv6.disable=1" && echo "OK"
# 2. 检查模块
lsmod | grep ipv6 # 应无输出
# 3. 检查网络接口
ip -6 addr show # 应只显示 lo 的 ::1(如果未完全禁用)或无输出
# 4. 检查监听端口
ss -tuln | grep ::: # 应无 IPv6 监听
💡 如果使用 方法一(内核禁用) ,
ip -6 addr show将完全无输出 (连lo都没有)。