IPv6,你开始使用了吗?

随着 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;
    }
}

参考文档

zh.wikipedia.org/wiki/IPv6

相关推荐
mykyle44 分钟前
Canal 1.1.7的安装
网络协议·tcp/ip·adb
MediaTea2 小时前
Python 库手册:ssl 加密通信模块
开发语言·网络·python·网络协议·ssl
@CodeMaster4 小时前
websocket是什么?怎么用?
网络·websocket·网络协议
kfepiza4 小时前
Linux网络管理工具NetworkManager笔记250726
linux·网络协议
一个向上的运维者4 小时前
详谈OSI七层模型和TCP/IP四层模型以及tcp与udp为什么是4层,http与https为什么是7层
网络·网络协议
帅帅梓16 小时前
RIP实验
网络·网络协议·计算机网络·信息与通信
油丶酸萝卜别吃19 小时前
SSE与Websocket有什么区别?
前端·javascript·网络·网络协议
xyz_1 天前
VPN、网络代理的定义及区别
网络协议
hello 早上好1 天前
TCP/IP、SOCKET、HTTP
网络协议·tcp/ip·http