IPv6 与 IPv4 网络配置:地址格式、双栈监听与常见排查

IPv6 与 IPv4 网络配置:地址格式、双栈监听与常见排查

IPv6 已经越来越常见,但在实际部署服务时,很多问题并不来自应用本身,而是来自地址格式、系统监听行为、云厂商安全组、客户端网络环境等基础细节。

本文总结 IPv4 / IPv6 服务接入中最容易踩坑的几个知识点。

1. IPv4 与 IPv6 地址格式差异

IPv4 地址通常长这样:

192.168.1.10
127.0.0.1
0.0.0.0

IPv6 地址通常长这样:

2402:4e00:c030:7c00:4438:550a:b49a:0
::1
::
fe80::4319:e582:6b5:cf9c

IPv6 地址本身包含冒号,因此当 IPv6 地址和端口组合使用时,必须用方括号包裹 IPv6 地址。

正确格式:

[2402:4e00:c030:7c00:4438:550a:b49a:0]:20007
[::1]:8080
[::]:443

错误格式:

2402:4e00:c030:7c00:4438:550a:b49a:0:20007
::1:8080
:::443

原因很简单:系统无法可靠判断最后一个冒号前后到底是 IPv6 地址的一部分,还是端口分隔符。

2. 常见监听地址含义

服务端启动时通常需要指定监听地址和端口,不同地址含义不同。

IPv4 常见示例:

127.0.0.1:8080

只监听本机 IPv4 回环地址,外部机器无法访问。

0.0.0.0:8080

监听所有 IPv4 网卡地址。

192.168.1.10:8080

只监听指定 IPv4 网卡地址。

IPv6 常见示例:

[::1]:8080

只监听本机 IPv6 回环地址。

[::]:8080

监听所有 IPv6 地址。

[2402:4e00:c030:7c00:4438:550a:b49a:0]:8080

只监听指定 IPv6 地址。

3. 为什么监听 IPv6 后 IPv4 也能访问?

在 Linux 上,如果服务监听:

[::]:8080

它可能不仅接受 IPv6 连接,也接受 IPv4 连接。这叫双栈监听。

关键系统参数是:

sysctl net.ipv6.bindv6only

如果输出:

net.ipv6.bindv6only = 0

表示 IPv6 socket 默认也接受 IPv4-mapped IPv6 连接。

IPv4 客户端连接进来后,服务端可能看到类似这样的地址:

::ffff:192.168.1.100

这表示一个 IPv4-mapped IPv6 地址。

如果输出:

net.ipv6.bindv6only = 1

则 IPv6 socket 只接受 IPv6 连接,不接受 IPv4。

4. 如何确认服务监听状态?

可以使用 ss 查看监听端口。

查看所有 TCP 监听:

ss -ltnp | grep 8080

只看 IPv4:

ss -ltnp -4 | grep 8080

只看 IPv6:

ss -ltnp -6 | grep 8080

如果:

ss -ltnp -4 | grep 8080

没有输出,而:

ss -ltnp -6 | grep 8080

有输出,例如:

LISTEN 0 4096 *:8080 *:*

说明服务监听的是 IPv6 socket。若 net.ipv6.bindv6only = 0,IPv4 仍可能访问成功。

5. 客户端没有 IPv6 出口时的典型错误

如果客户端执行:

ping6 2402:4e00:c030:7c00:4438:550a:b49a:0

或:

nc -6 -vz 2402:4e00:c030:7c00:4438:550a:b49a:0 8080

报错:

Network is unreachable

通常说明客户端机器没有 IPv6 出口或默认 IPv6 路由。

检查 IPv6 地址:

ip -6 addr

如果只看到:

inet6 fe80::xxxx prefixlen 64 scope link

这只是链路本地地址,不能访问公网 IPv6。

继续检查路由:

ip -6 route

正常情况下应该有类似:

default via xxxx:xxxx::1 dev eth0

如果没有 default IPv6 路由,就无法访问公网 IPv6。

6. fe80:: 地址为什么不能访问公网?

fe80::/10 是 IPv6 的链路本地地址,只在同一个二层网络内有效。它不会被路由器转发到公网。

例如:

fe80::4319:e582:6b5:cf9c

这个地址只能用于本地链路通信,不能拿来访问公网 IPv6 服务,也不能作为公网服务地址暴露给其他网络访问。

访问链路本地地址时通常还需要指定网卡:

ping6 fe80::1234%eth0

7. 云服务器 IPv6 访问要检查什么?

在云服务器上启用 IPv6 服务时,需要同时确认:

  1. 云服务器已经分配 IPv6 地址。
  2. IPv6 公网带宽或公网访问能力已经开通。
  3. 安全组入站规则允许 IPv6 来源访问目标端口。
  4. 操作系统防火墙允许 IPv6 流量。
  5. 服务进程确实监听在 IPv6 地址上。
  6. 客户端机器本身有 IPv6 出口。

很多时候,服务监听没有问题,但安全组或客户端 IPv6 出口缺失,会导致访问失败。

8. 常用测试命令

测试 IPv6 ICMP:

ping6 2402:4e00:c030:7c00:4438:550a:b49a:0

测试 IPv6 TCP 端口:

nc -6 -vz 2402:4e00:c030:7c00:4438:550a:b49a:0 8080

测试 IPv4 TCP 端口:

nc -4 -vz 192.168.1.10 8080

查看本机 IPv6 地址:

ip -6 addr

查看 IPv6 路由:

ip -6 route

查看系统是否允许 IPv6 socket 接受 IPv4:

sysctl net.ipv6.bindv6only

总结

IPv6 部署中最核心的几个规则是:

IPv6 地址带端口时必须加方括号:

[IPv6地址]:端口

监听所有 IPv6 地址使用:

[::]:端口

监听所有 IPv4 地址使用:

0.0.0.0:端口

Linux 上 [::]:端口 是否同时接受 IPv4,取决于:

net.ipv6.bindv6only

客户端报 Network is unreachable 时,优先检查客户端是否有 IPv6 地址和默认 IPv6 路由。

posted @ 2026-05-12 14:54  morty-root  阅读(33)  评论(0)    收藏  举报