本文目录导读:

n2n 是一个开源的、轻量级的 P2P VPN 解决方案,它的核心原理是通过一个超级节点(Supernode)来辅助节点建立直接的 P2P 连接(打洞),一旦连接建立,数据流就在节点之间直接传输,不经过中心服务器,从而实现类似于局域网(局域网,局域网)内网穿透的效果。
下面详细解释 n2n 如何实现 P2P VPN 以及其工作流程。
核心概念:三大组件
-
超级节点 (Supernode):
- 作用: 作为“电话交换机”,它不处理 VPN 数据流量,只负责帮助各个边缘节点相互发现、交换公网 IP/端口信息,并协调建立直接的 P2P 连接。
- 位置: 通常部署在具有公网 IP 的服务器或云主机上,一个超级节点可以服务于多个虚拟网络。
- 特点: 稳定、轻量,成本低(只需最基础的云服务器)。
-
边缘节点 (Edge):
- 作用: 实际参与 VPN 通信的终端设备,比如你的笔记本电脑、家里的树莓派、云上的另一个服务器等。
- 位置: 可以在任何网络环境中,包括内网(公司、家庭 WiFi)、移动网络 4G/5G。
- 功能: 运行
edge程序,加入指定的社区(Community),并处理加密、数据包封装/解封装。
-
社区 (Community)
- 作用: 虚拟网络名称,所有加入同一个“社区”的边缘节点,会组成一个虚拟局域网(VLAN),不同社区的网络是完全隔离的。
- 实现: 通过
-c community_name参数指定。
P2P VPN 建立过程(核心步骤)
这是你问题的关键,n2n 的 P2P 建立过程分为两步:
第一步:注册与公共端点发现(通过超级节点)
- 启动注册: 所有边缘节点启动时,都向同一个超级节点发送注册包,数据包中包含该节点希望加入的“社区名称”。
- 记录与响应: 超级节点记录下每个边缘节点的公网 IP 和端口(Public Endpoint,即对外暴露的 IP:Port),并将其所在的社区内“其他人”的信息(如 A 知道 B 的公网 IP 和端口,B 知道 A 的公网 IP 和端口)返回给该节点。
- 初步连接: 每个边缘节点只知道其他节点的外部地址,但还不知道它们是否可以直接通信。
第二步:打洞与直接连接(P2P 直连)
- 尝试连接: 边缘节点 A 尝试直接向边缘节点 B 的外部地址(从超级节点获取的)发送一个 UDP 包。
- 打洞机制:
- A 和 B 都在不同的 NAT 后面(最常见的家庭网络),此时会发生经典的 NAT 打洞:
- 当 A 发送 UDP 包到 B 的外部地址时,A 的 NAT 设备会在其防火墙/端口映射表中创建一个临时条目,记录“从 A 的内部 IP:Port 到 B 的外部 IP:Port”的映射。
- 同样,当 B 的 NAT 设备收到来自 A 的包(或者 B 也尝试向 A 发送包)时,它也会建立相应的映射。
- 这个“洞”打通后,双方就可以直接通信了。这是 n2n 工作的核心。
- 如果打洞失败(对称 NAT、防火墙严格限制、运营商阻止 UDP 等),n2n 会回退到中继模式,这时,数据包会先发给超级节点(或一个专用的中继节点),再由超级节点转发给目标节点,这种情况下不是真正的 P2P,但保持了连通性。
- A 和 B 都在不同的 NAT 后面(最常见的家庭网络),此时会发生经典的 NAT 打洞:
- 建立 P2P 连接: 一旦打洞成功,A 和 B 之间就建立了直接的 UDP 通道,数据流不经过超级节点。
第三步:封装与解密(虚拟网卡)
- 虚拟网卡: 每个边缘节点上,n2n 会创建一个虚拟网络接口(如
edge0)。 - 数据封装: 当你在本地应用发送数据包(ping 另一个边缘节点的虚拟 IP
0.0.2)时,这个包会被 n2n 捕获,n2n 会:- 压缩(可选)。
- 使用社区定义的密钥进行加密(AES、Twofish 等,保证安全)。
- 将加密后的数据包封装到一个新的 UDP 包中,目标地址是目标节点的真实公网 IP 和端口。
- 通过之前建立的 P2P 通道发送出去。
- 接收端处理: 目标边缘节点收到 UDP 包后,反向操作:解密、解压缩,然后通过其虚拟网卡注入到本地网络栈中,应用层看到的是一个来自虚拟 IP
0.0.1的原始包。
| 特性 | 说明 |
|---|---|
| P2P 直连 | 连接建立后,数据流不经过超级节点,延迟低、带宽高、无单点瓶颈。 |
| NAT 穿透 | 自动处理各种 NAT 类型(全锥形、不对称、对称需要特殊处理),通过打洞技术实现。 |
| 加密 | 默认使用社区密钥进行 AES 加密,确保数据传输安全,社区名本身相当于一个预共享密钥。 |
| 轻量 | 代码量小(C 语言编写),资源占用极低,可以运行在路由器、树莓派、低配云主机上。 |
| 多平台 | Linux、Windows、macOS、Android、FreeBSD、OpenWrt 等。 |
| 动态社区 | 可以随时添加/移除节点,超级节点自动通知更新。 |
实际部署示例(极简版)
假设:
- 超级节点:
supernode.example.com(IP:2.3.4,端口默认7654) - 你的电脑 A (在家,内网
168.1.100) - 你的电脑 B (在办公室,内网
0.0.50)
在电脑 A 上运行:
sudo edge -d n2n0 -c my_private_network -k my_secret_key -l supernode.example.com:7654 -a 10.0.0.1
-d n2n0:创建虚拟网卡名称-c my_private_network:社区名称(必须和 B 相同)-k my_secret_key:社区密钥(必须和 B 相同)-l supernode.example.com:7654:指定超级节点-a 10.0.0.1:分配虚拟 IP 给本机
在电脑 B 上运行:
sudo edge -d n2n0 -c my_private_network -k my_secret_key -l supernode.example.com:7654 -a 10.0.0.2
结果: 几分钟后,电脑 A 和电脑 B 就可以通过 ping 10.0.0.2 (ping B) 和 ping 10.0.0.1 (ping A) 通信,就和在同一个局域网里一样。
注意点
- 打洞成功率并非100%:对于某些对称 NAT(如大部分 4G/5G 网络)、防火墙限制严格的场景(如企业网络有出站 UDP 限制),打洞可能失败,n2n 会自动使用中继模式,可以通过
supernode或专用的tunnel节点来中转。 - 安全性:社区名(
-c)和密钥(-k)是预共享的,暴露社区名和密钥则任何人都可以加入你的虚拟网络,生产环境建议使用更强的密钥生成方式(如-k可以配合-P提供密码文件)。 - 版本:n2n 有多个版本,最常见的是 n2n 2.x 和 3.x,3.x 版本更稳定、性能更好,推荐使用。
n2n 就像给每个设备装了一个“虚拟的对讲机”
- 超级节点:是“对讲机中继台”,负责把每个人的“呼号(IP)和频道(社区)”登记下来,并告诉大家“谁在线”。
- 打洞:是两个对讲机用户通过中继台知道对方的位置后,尝试直接对讲(P2P)。
- 加密:是你们约定的暗语(密码),防止被别人窃听。
- 最终效果:你完全感觉不到中间的复杂性,就像两台电脑直接插了一根网线一样,你和你的朋友可以在世界任何地方,组成一个安全的、私有的虚拟局域网。
标签: P2P VPN
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。