问题背景

服务器遇到IPv6相关问题,常见场景包括:

  1. 服务器没有IPv6:DNS解析却返回IPv6地址,导致无法访问网站
  2. 服务器有IPv6但解析异常:网络连接不稳定、访问超时、解析结果时好时坏
  3. IPv6路由问题:虽然配置了IPv6,但路由或网络配置不完整

这些问题会导致服务访问失败、网络连接不稳定等故障。

解决方案

方案一:设置IPv4优先(推荐)

保留IPv6功能,仅在DNS解析时优先使用IPv4,适合大多数场景。

配置方法

编辑 /etc/gai.conf

1
vim /etc/gai.conf

简单配置:取消注释或添加:

1
precedence ::ffff:0:0/96  100

完整配置

1
2
3
4
# IPv4优先
precedence ::1/128 50
precedence ::/0 40
precedence ::ffff:0:0/96 100

保存后立即生效,无需重启。

验证设置

1
2
3
4
5
# 测试域名解析,IPv4地址应排在前面
getent ahosts www.google.com

# 查看解析配置
grep hosts /etc/nsswitch.conf

恢复IPv6优先

编辑 /etc/gai.conf

1
vim /etc/gai.conf

方法一:删除或注释优先级配置

1
# precedence ::ffff:0:0/96  100

方法二:恢复默认IPv6优先

1
2
3
4
# IPv6优先(默认行为)
precedence ::1/128 50
precedence ::/0 40
precedence ::ffff:0:0/96 35

保存后立即生效。

方案二:禁用IPv6

彻底禁用IPv6功能,适用于不需要IPv6的环境。

临时禁用(重启后失效)

1
2
3
sysctl -w net.ipv6.conf.all.disable_ipv6=1
sysctl -w net.ipv6.conf.default.disable_ipv6=1
sysctl -w net.ipv6.conf.lo.disable_ipv6=1

永久禁用

编辑 /etc/sysctl.conf

1
vim /etc/sysctl.conf

添加以下内容:

1
2
3
net.ipv6.conf.all.disable_ipv6=1
net.ipv6.conf.default.disable_ipv6=1
net.ipv6.conf.lo.disable_ipv6=1

应用配置:

1
sysctl -p

验证:

1
2
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
# 输出 1 表示已禁用

恢复启用IPv6

临时恢复

1
2
3
sysctl -w net.ipv6.conf.all.disable_ipv6=0
sysctl -w net.ipv6.conf.default.disable_ipv6=0
sysctl -w net.ipv6.conf.lo.disable_ipv6=0

永久恢复

编辑 /etc/sysctl.conf,删除或注释:

1
2
3
# net.ipv6.conf.all.disable_ipv6=1
# net.ipv6.conf.default.disable_ipv6=1
# net.ipv6.conf.lo.disable_ipv6=1

应用配置:

1
sysctl -p

验证:

1
2
cat /proc/sys/net/ipv6/conf/all/disable_ipv6
# 输出 0 表示已启用

方案三:网络接口配置禁用IPv6

通过网络接口配置文件禁用IPv6,适用于特定网络接口。

编辑网络配置文件:

1
nano /etc/network/interfaces

添加以下配置:

1
2
iface eth0 inet6 static
disable-ipv6 yes

重启后生效。

方案对比

方案 优点 缺点 适用场景
设置IPv4优先 保留IPv6能力,仅调整优先级 配置稍复杂 推荐方案,适合大多数场景
禁用IPv6(sysctl) 彻底解决IPv6问题,配置简单 无法使用IPv6资源 不需要IPv6的环境
网络接口配置 针对特定接口控制 需要重启生效 特定网络接口管理

选择建议

  1. 首选方案一:设置IPv4优先,既解决问题又保留IPv6能力
  2. 方案二:服务器确实不需要IPv6时使用
  3. 方案三:需要针对特定接口控制时使用

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看当前IPv6配置
ip -6 addr show

# 查看网络连接情况
ss -tuln

# 测试IPv6连通性
ping6 -c 4 ipv6.google.com

# 测试IPv4连通性
ping -c 4 www.google.com

# 测试域名解析
getent ahosts www.google.com

注意事项

  • 修改配置后建议重启相关网络服务或应用程序
  • 如果使用Docker等容器服务,可能需要额外配置
  • 部分应用可能需要单独配置IPv4优先设置