基于 EasyTier 的异地组网实践方案
一、EasyTier 是什么
EasyTier是一个由 Rust 和 Tokio 驱动的去中心化异地组网方案,采用 P2P 架构,节点之间地位平等,无需中心化服务器。它的核心特点是去中心化、跨平台、安全(支持 AES-GCM 或 WireGuard 加密),并且支持高效的 UDP 和 IPv6 NAT 穿透,可以在 NAT4-NAT4 等复杂网络环境下工作。
二、组网原理简述
EasyTier 的组网过程可以简单理解为三个阶段:
节点发现与握手:所有节点通过共享节点(或自建服务器)作为初始联络点,使用相同的网络名(
--network-name)和网络密钥(--network-secret)互相发现并认证,形成一个虚拟网络。节点默认会自动获取一个虚拟 IP 地址(如10.144.144.x/24)。NAT 穿透与 P2P 直连:节点握手成功后,EasyTier 会自动尝试 UDP/TCP 打洞,建立节点间的直接 P2P 连接。节点间成功组网后,会自动尝试 NAT 穿透并建立 P2P 连接,在成功 P2P 之前,共享节点会帮助转发数据。P2P 直连的优势在于延迟低、带宽高(取决于节点自身网络上限)。
中继回退:如果 P2P 穿透失败,数据会自动走共享节点或自建服务器的中继(relay)通道进行转发,保证网络始终可用,代价是延迟较高、带宽较低。
三、架构与客户端支持
EasyTier 的跨平台支持非常完整:
- CPU 架构:支持 x86_64(amd64)、ARM64(aarch64)、ARM(armv7/armhf)、MIPS 等多种架构
- 操作系统:Windows、Linux、macOS、FreeBSD、Android、OpenWrt 均有对应版本
- Docker 镜像:官方提供 linux/amd64、linux/arm/v6、linux/arm/v7、linux/arm64、linux/riscv64 多架构镜像
- Astral 客户端:Astral 是基于 EasyTier 的跨平台图形化应用,采用 Flutter 构建界面、Rust 作为后端,将 EasyTier 内核直接编译进去,无需额外安装,支持 Windows、macOS、Linux、Android 平台。对于移动端和游戏联机场景,Astral 是一个比 EasyTier 自带 GUI 更友好的选择。
四、版本选择
在实际部署中,我选择了 EasyTier v2.5.0 作为主力版本。这个版本在 NAT 穿透稳定性、虚拟 IPv6 支持等方面表现成熟,支持完整的虚拟 IPv6 功能,包括子网代理、QUIC、KCP 等,也支持虚拟网内有多个网段并基于 CIDR 规则做路由。
关于 2.6.x 的注意事项:v2.6.x 系列对 IPv6 的支持不够友好。在安卓设备上,连接 EasyTier 后会出现 IPv6 地址无法正常访问的问题,原因是 Android VPNService 初始化时未填入 IPv6 地址,导致系统 IPv6 协议栈未被启用。此外,easytier-web 组件在纯 IPv6 环境下也存在监听支持不完善的情况。如果你有 IPv6 环境的需求,建议优先使用 2.5.0。
Astral 安卓客户端目前使用的内核版本标记为 2.6.9999,但其底层内核版本实际为 2.5.0。这个版本号是 Astral 的构建标记,内核能力与 EasyTier 2.5.0 一致。如果你在安卓端使用 Astral,IPv6 方面的体验会比直接用 EasyTier 2.6.x 客户端更好。
五、部署验证
目前已在以下环境完成部署测试:
- Ubuntu:Linux 命令行部署,通过 easytier-core 运行,使用 easytier-cli 查看节点状态和路由信息
- Fedora:Linux 命令行部署,流程与 Ubuntu 一致
- Windows:使用 GUI 客户端,界面化配置网络名和密钥即可完成组网
- Docker:使用官方 easytier/easytier 镜像部署,配合 docker-compose.yml 实现开机自启动和自动更新
各环境之间可以互相通信,P2P 直连成功率达到预期。Docker 部署时需要注意开启特权模式并映射 /dev/net/tun 设备。
六、两大场景的组网方案
场景一:有公网 IPv4
如果你拥有公网 IPv4 地址(无论是家宽直接获取,还是购买了一台有公网 IP 服务器),最推荐的做法是将这台有公网 IPv4 的机器作为自建中继节点。
核心思路:在公网服务器上运行 EasyTier,开放监听端口,其他节点通过参数指向这台服务器的公网 IP 和端口作为初始节点。EasyTier 会以这台服务器为联络点帮助所有节点互相发现,节点间再自动尝试建立 P2P 直连。P2P 打洞成功后的数据不经过服务器,带宽和延迟取决于节点自身的网络;打洞失败时才走服务器中继。
场景二:有公网 IPv6
如果你没有公网 IPv4,但运营商分配了公网 IPv6 地址(目前国内不少家宽在开启 IPv6 后会获得 /64 或 /60 的前缀,一般就是地址以24开头),EasyTier 同样支持通过 IPv6 进行组网和 P2P 打洞。
⚠️ 版本注意:如前文所述,2.6.x 的 IPv6 支持存在多个已知问题,包括 IPv6 地址选择不当(未过滤 fe80::/10 等非全局地址)、STUN 探测缺失、easytier-web 在纯 IPv6 环境下监听不完善等。如果以 IPv6 为主要组网通道,强烈建议使用 2.5.0 版本。
七、通用 Docker Compose 参考
服务节点(启动了 config.toml、config2.toml 两个虚拟网络)192.168.99.194
1 | services: |
config.toml 配置参考如下
1 | instance_name = "M5-FNOS-EASYTIER" |
接入节点(想要加入组网端)参考配置 192.168.99.222
1 | instance_name = "自定义实例名" |
至于 GUI 版本的Easytier\Astral 自动探索就行,服务和接入点主要配置以上,Astral中网络名是以房间的形式体现的