之前在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(推荐)
- 直接添加配置(推荐方式)
echo "precedence ::ffff:0:0/96 100
precedence ipv4::/96 50" >> /etc/gai.conf
- 验证配置是否生效
# 测试当前使用的 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 地址进行连接
验证方法
- 检查配置文件:
cat /etc/gai.conf
- 测试网络访问:
# 测试当前IP版本
curl ip.sb
# 对比 IPv4 访问
curl ip.sb -4
# 对比 IPv6 访问
curl ip.sb -6
故障排除
如果设置后不生效,可以尝试:
- 重启网络服务
systemctl restart networking
- 清除 DNS 缓存
systemctl restart systemd-resolved
- 检查配置文件权限
ls -l /etc/gai.conf
注意事项
- 修改配置文件后不需要重启系统,但某些应用可能需要重启才能生效
- 某些应用程序可能会忽略系统配置,使用自己的网络协议栈设置
- 建议在修改配置文件前先备份
cp /etc/gai.conf /etc/gai.conf.backup
参考信息
- gai.conf 是 getaddrinfo 的配置文件,用于控制地址选择策略
- IPv4 和 IPv6 的优先级设置不会影响网络连接的可用性,只影响优先选择顺序
- 在容器环境中,可能需要在宿主机上进行相应设置