linux设置ipv4优先访问

之前在nodeseek站点习得设置ipv4优先访问的命令:

sed -i 's/#precedence ::ffff:0:0\/96  100/precedence ::ffff:0:0\/96  100/' /etc/gai.conf
curl ip.sb

设置ipv6命令优先的命令为:

sed -i 's/precedence ::ffff:0:0\/96  100/#precedence ::ffff:0:0\/96  100/' /etc/gai.conf
curl ip.sb

今天准备给过年前买的dmit eb intro vps设置ipv4优先访问,但发现该命令失效,询问了o3-mini-high、claude sonnet 3.5、qwen max、gemini 2.0 pro exp、deepseek r1,最后只有claude能debug。不由得佩服claude。编程能力是真tm强!

claude在artifact中写的学习笔记:

Linux 系统中设置 IPv4 优先访问的方法

概述

在 Linux 系统中,当同时存在 IPv4 和 IPv6 网络时,系统默认会优先使用 IPv6 进行网络访问。有时我们需要更改这个默认行为,使系统优先使用 IPv4 网络。本文档介绍如何在 Linux 系统中配置 IPv4 优先访问。

配置方法

方法一:修改 gai.conf(推荐)

  1. 直接添加配置(推荐方式)
echo "precedence ::ffff:0:0/96  100
precedence ipv4::/96      50" >> /etc/gai.conf
  1. 验证配置是否生效
# 测试当前使用的 IP 版本
curl ip.sb

# 强制使用 IPv4 测试对比
curl ip.sb -4

方法二:使用 sysctl(临时生效)

# 临时禁用 IPv6
sysctl -w net.ipv6.conf.all.disable_ipv6=1
sysctl -w net.ipv6.conf.default.disable_ipv6=1

注意:这种方法会完全禁用 IPv6,而不是仅仅调整优先级。系统重启后需要重新设置。

常见错误示例

以下命令可能无法正确修改配置:

# 错误示例
sed -i 's/#precedence ::ffff:0:0\/96  100/precedence ::ffff:0:0\/96  100/' /etc/gai.conf

这个命令的问题在于它只会替换已经取消注释的行,如果原始行是被注释的,则不会生效。

工作原理

  • precedence ::ffff:0:0/96 100:设置 IPv6 映射到 IPv4 的地址优先级为 100
  • precedence ipv4::/96 50:设置 IPv4 兼容的 IPv6 地址优先级为 50
  • 数字越大,优先级越高
  • 这个配置会让系统优先使用 IPv4 地址进行连接

验证方法

  1. 检查配置文件:
cat /etc/gai.conf
  1. 测试网络访问:
# 测试当前IP版本
curl ip.sb

# 对比 IPv4 访问
curl ip.sb -4

# 对比 IPv6 访问
curl ip.sb -6

故障排除

如果设置后不生效,可以尝试:

  1. 重启网络服务
systemctl restart networking
  1. 清除 DNS 缓存
systemctl restart systemd-resolved
  1. 检查配置文件权限
ls -l /etc/gai.conf

注意事项

  1. 修改配置文件后不需要重启系统,但某些应用可能需要重启才能生效
  2. 某些应用程序可能会忽略系统配置,使用自己的网络协议栈设置
  3. 建议在修改配置文件前先备份
cp /etc/gai.conf /etc/gai.conf.backup

参考信息

  • gai.conf 是 getaddrinfo 的配置文件,用于控制地址选择策略
  • IPv4 和 IPv6 的优先级设置不会影响网络连接的可用性,只影响优先选择顺序
  • 在容器环境中,可能需要在宿主机上进行相应设置