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 服务时,需要同时确认:
- 云服务器已经分配 IPv6 地址。
- IPv6 公网带宽或公网访问能力已经开通。
- 安全组入站规则允许 IPv6 来源访问目标端口。
- 操作系统防火墙允许 IPv6 流量。
- 服务进程确实监听在 IPv6 地址上。
- 客户端机器本身有 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 路由。

浙公网安备 33010602011771号