随着 IPv4 地址资源的枯竭,IPv6 已经从"预备役"进入实际部署阶段。本文将从原理、前后端实践、系统配置和云服务启用等方面,带你全面了解和使用 IPv6。 下面就以nodejs为例开始进入IPv6的世界吧。
nodejs http原生支持ipv6,无需额外配置。监听地址是'::',表示监听所有ipv6地址。
javascript
const http = require('http');
const server = http.createServer((req, res) => {
res.end('Hello IPv6');
});
// 监听 IPv6 地址
server.listen(3000, '::', () => {
console.log('Server running at http://[::]:3000/');
});
启动服务
bash
node server.js
虽然服务器监听的是 ::
(IPv6 中的通配地址,等价于 IPv4 的 0.0.0.0
,表示监听所有本地可用 IPv6 地址),但你不能直接通过 http://[::]
这种地址来访问服务 ,因为 ::
只是一个监听范围,不代表实际的目标地址。
如果你是在本机测试服务,应使用 [::1]
来访问,这是 IPv6 的 本地回环地址 ,等同于 IPv4 中的 127.0.0.1
,用于在本地通信时验证 IPv6 服务是否正常运行。
IPv6 地址结构简析:
IPv6 地址由 8 个字段组成,每个字段由 4 个十六进制数字(共 16 位)表示,使用冒号 :
分隔,例如:
makefile
0000:0000:0000:0000:0000:0000:0000:0001
这个地址就是 ::1
的完整形式。IPv6 允许进行简写:
- 连续的 0 字段可以用
::
表示(只能出现一次) - 每段前导的
0
可以省略
因此:
makefile
0000:0000:0000:0000:0000:0000:0000:0001
可以简写为:
makefile
::1
测试
可以通过浏览器或者curl来测试
访问http://[::1]:3000/
,你会看到Hello IPv6
。
arduino
curl -g http://[::1]:3000/
同时,你也可以通过curl
来测试IPv4地址:
arduino
curl -g http://127.0.0.1:3000/
包括:
http://localhost:3000/
http://127.0.0.1:3000/
http://[::1]:3000/
⚠️注意:如果监听的是0.0.0.0,则只监听ipv4的端口,如果监听的是::
,则支持ipv4和ipv6同时访问。
虽然可以同时开启两种监听,但顺序会影响效果,后开启的监听会覆盖先开启的监听,所以没必要同时监听两种,二选一即可。
远程访问
window用户使用ipconfig查看ipv6地址,mac用户使用ifconfig查看。
下面以window 11为例。
ruby
$ ipconfig
Windows IP 配置
以太网适配器 以太网:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
无线局域网适配器 本地连接* 1:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
无线局域网适配器 本地连接* 2:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
无线局域网适配器 WLAN:
连接特定的 DNS 后缀 . . . . . . . : lan
IPv6 地址 . . . . . . . . . . . . : fd33:c736:8744::124
IPv6 地址 . . . . . . . . . . . . : fd33:c736:8744:0:99f6:2d7c:d870:22ea
临时 IPv6 地址. . . . . . . . . . : fd33:c736:8744:0:5106:c9df:3492:3385
本地链接 IPv6 地址. . . . . . . . : fe80::f299:62ef:992d:4d6a%8
IPv4 地址 . . . . . . . . . . . . : 10.10.246.237
子网掩码 . . . . . . . . . . . . : 255.255.254.0
默认网关. . . . . . . . . . . . . : 10.10.246.1
以太网适配器 蓝牙网络连接:
媒体状态 . . . . . . . . . . . . : 媒体已断开连接
连接特定的 DNS 后缀 . . . . . . . :
以太网适配器 vEthernet (WSL (Hyper-V firewall)):
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::a647:1c28:23d7:966a%27
IPv4 地址 . . . . . . . . . . . . : 172.28.64.1
子网掩码 . . . . . . . . . . . . : 255.255.240.0
默认网关. . . . . . . . . . . . . :
只需要关注你当前使用的网卡的网络配置,其中本地链接IPv6地址,表示内容使用的ip地址,类似192.168.1.100
。
ruby
无线局域网适配器 WLAN:
连接特定的 DNS 后缀 . . . . . . . : lan
IPv6 地址 . . . . . . . . . . . . : fd33:c736:8744::124
IPv6 地址 . . . . . . . . . . . . : fd33:c736:8744:0:99f6:2d7c:d870:22ea
临时 IPv6 地址. . . . . . . . . . : fd33:c736:8744:0:5106:c9df:3492:3385
本地链接 IPv6 地址. . . . . . . . : fe80::f299:62ef:992d:4d6a%8
IPv4 地址 . . . . . . . . . . . . : 10.10.246.237
子网掩码 . . . . . . . . . . . . : 255.255.254.0
默认网关. . . . . . . . . . . . . : 10.10.246.1
后面这个 %8 是 "zone index"(区域索引),也叫 接口标识符(interface identifier),是Windows(和部分系统)在处理链路本地 IPv6 地址时为了解决"多个网卡同时存在 fe80::"的问题而引入的。
arduino
fe80::f299:62ef:992d:4d6a%8
它只能在局域网或本地链路中使用。每个网络接口(比如 Wi-Fi、有线网卡、虚拟机适配器)都可能有一个 fe80:: 开头的地址,所以:
系统必须通过一个标识来知道你要访问哪个网卡的 fe80 地址,于是就加上了 %8 这样的 zone ID。
实际使用时注意
%8 仅在本地命令行工具(如 ping、curl、telnet)中使用
在 浏览器 URL 中不要带 %8,否则会报错
在程序里(如 Node.js 请求)不需要加 %8,除非你明确绑定了特定接口
要不要启用 IPv6
当然可以!以下是一个适合放在博客中的「是否需要使用 IPv6」评估表和一段说明文字,可直接复制粘贴用于文章中:
我是否需要启用 IPv6?
评估问题 | 是 ✅ | 否 ❌ | 建议 |
---|---|---|---|
你是否有公网服务需要部署(如云主机、ECS、VPS)? | ✅ | ❌ | ✅ 建议启用 IPv6,便于公网访问、简化架构 |
你是否遇到端口映射困难或内网穿透问题? | ✅ | ❌ | ✅ IPv6 可省去 NAT 穿透 |
局域网中是否有多台设备需要直接通信? | ✅ | ❌ | ✅ IPv6 的链路本地地址可简化设备间通信 |
你是否需要为物联网、分布式架构、P2P 应用做准备? | ✅ | ❌ | ✅ IPv6 更适合这类场景 |
当前开发是否仅在单机环境中测试和运行? | ❌ | ✅ | ❌ IPv4 即可,IPv6 可作为可选支持 |
如果你当前只是在本地开发和调试少量服务,IPv4 完全可以满足需求。启用 IPv6 的主要价值在于:
- 简化公网部署
- 避免 NAT 和端口映射问题
- 提前适配现代网络环境
- 实现端到端通信的网络模型
但IPv6 并不再是"未来的事",随着联网设备的增多、移动互联网的发展,它已经在设备端
、云端
、客户端
全面落地。你是否采用,取决于你的项目是否需要公网访问、是否对网络架构和未来兼容性有要求。
写在后面
我调查了深圳电信宽带业务,电信光猫设备支持的情况下,可以拨打10000号申请开启100元每月的IPv6的公网IP,以前ipv4的公网服务是免费的的,后来关闭了ipv4的公网服务,需要申请专号,IPv6公网ip是目前最便宜的免穿透的方案了。可以访问ipv6test来查看当前设备和路由的网络情况。
目前阿里云的IPv6的公网服务默认是关闭的,按流量是每0.8元/G,开启单独收取固定带宽5m是4.8元每天,带宽越高越贵。
但依然可以开启IPv6的内容服务,不开启公网IPv6的带宽即可,时刻准备着,等待服务运营商切换IPv6优先的那天,也许就不用单独购买带宽了(已经购买了ipv4的公网带宽)。

扩展
- nginx监听IPv6
ini
server {
listen [::]:80; # 监听IPv6地址的80端口
listen [::]:443 ssl; # 监听IPv6地址的443端口,并启用SSL
server_name example.com;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}