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,关闭前请确认不会影响服务器管理。

‍