Skip to content

Linux IPv4-IPv6 双栈网络如何设置IPv4优先出网

1. 检查当前网络配置

bash
# 查看系统支持的 IP 协议版本
ip a

2. 通过内核关闭 IPv6

这种方法会完全禁用系统的 IPv6 功能,强制所有网络连接使用 IPv4。

2.1. 临时关闭 IPv6(重启后失效)

  1. 检查当前 IPv6 状态:
bash
ip a

如果看到类似 inet6 的条目,说明 IPv6 正在启用。

  1. 临时关闭 IPv6:
bash
sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1     #net.ipv6.conf.all.disable_ipv6=1 关闭所有网络接口的 IPv6
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1  #net.ipv6.conf.default.disable_ipv6=1 为新创建的网络接口默认关闭 IPv6
  1. 验证是否关闭成功:
bash
ip a

此时应该看不到任何 inet6 的条目。

2.2. 永久关闭 IPv6(重启后依然有效)

  1. 编辑 sysctl 配置文件:
bash
sudo nano /etc/sysctl.conf
  1. 在文件末尾添加以下内容:
plaintext
# 关闭所有接口的 IPv6                    
net.ipv6.conf.all.disable_ipv6 = 1              #net.ipv6.conf.all.disable_ipv6 = 1:关闭所有现有网络接口的 IPv6   
# 为新接口默认关闭 IPv6
net.ipv6.conf.default.disable_ipv6 = 1         #net.ipv6.conf.default.disable_ipv6 = 1:对未来新增的网络接口默认关闭 IPv6
# 关闭回环接口的 IPv6
net.ipv6.conf.lo.disable_ipv6 = 1             #net.ipv6.conf.lo.disable_ipv6 = 1:关闭本地回环接口的 IPv6
  1. 使配置生效:
bash
sudo sysctl -p
  1. 验证配置:
bash
ip a

确认没有 inet6 条目,或者使用以下命令检查:

bash
cat /proc/sys/net/ipv6/conf/all/disable_ipv6

如果返回 1,表示 IPv6 已成功关闭。

3. 调整网络协议优先级

这种方法不会完全禁用 IPv6,而是让系统优先选择 IPv4 协议。

3.1. 检查当前优先级

  1. 查看当前的网络协议优先级:
bash
cat /etc/gai.conf

这个文件控制着 getaddrinfo () 函数的行为,该函数用于将域名解析为 IP 地址。

3.2. 临时调整优先级

  1. 备份原始配置文件:
bash
sudo cp /etc/gai.conf /etc/gai.conf.bak
  1. 编辑 gai.conf 文件:
bash
sudo nano /etc/gai.conf
  1. 找到以下行并修改:
plaintext
# precedence ::ffff:0:0/96  100

修改为:

plaintext
precedence ::ffff:0:0/96  100
  1. 保存文件并退出。

4. 验证方法

使用 ping 命令

bash
ping  www.baidu.com

查看输出中的 IP 地址,如果是 IPv4 地址(如 172.217.168.142),则表示 IPv4 优先。

5. 注意事项

  1. 方法一(关闭 IPv6) 更彻底,但可能会影响某些依赖 IPv6 的应用程序。
  2. 方法二(调整优先级) 更灵活,允许系统在需要时仍可使用 IPv6。
  3. 如果使用方法一,某些现代应用程序可能会出现警告或功能受限。
  4. 在云服务器环境中,某些管理工具可能依赖 IPv6,关闭前请确认不会影响服务器管理。