☰
EasyTier远程组网实战:无公网IP虚拟局域网、子网共享与排障
2026/11/4 4:49:08 网站建设 项目流程

前阵子有个朋友找我,说他在外地想把家里那台小主机里存的资料拷出来,折腾了一整晚没成功。他先搞了动态域名解析,路由器里的端口映射也开了,结果从外面怎么都连不上。后来一查,他家宽带早就被划进运营商的大内网里了,压根没有独立的公网地址,解析出来那个 IP 根本不是他家路由器的。这事挺典型,现在想给自家设备开个对外的入口,一年比一年费劲。

这类需求其实特别朴素:远程取个文件、远程登一下开发机、两个办公地点的电脑互访、几个朋友联机玩游戏。大家要的无非是"我在外面,也能像在家里一样访问那几台机器"。EasyTier 就是冲着这个场景来的一个开源远程组网工具,它给每台设备装一块虚拟网卡,让散在不同网络里的机器仿佛插在同一台交换机上。这篇我把自己从零跑通、再到长期挂机的完整流程写下来,中间踩的几个坑也一并交代清楚。

1. 没有公网 IP 的两台机器,怎么才能互相"看见"

1.1 先搞清楚"看不见"到底卡在哪一层

想弄明白组网工具为什么存在,得先知道普通家庭网络是怎么被"关起来"的。你家的路由器从运营商那儿拿到一个地址,这个地址如果全世界唯一,那就叫公网地址;如果只是运营商内部的一个编号,出了运营商的大门就没人认识,那就叫内网地址。后一种情况现在极其普遍,业内管它叫大内网或者 CGNAT。

用小区打个比方就很好懂。公网地址相当于你家在街上的门牌号,快递员能直接找到。而 NAT 相当于小区门口的门卫:外面的信只能寄到小区门房,门卫翻一下登记本,看这条信息对应哪一户,再送进去。你在家里往外寄信没问题,门卫会替你盖个章,但外面的人想主动寄信进来,门卫手里没这条登记记录,只能把信退回。

端口映射干的事,就是手动去门卫那儿补一条登记:"凡是写着 8080 的信,都送到 3 号楼 201。"问题是,这条登记只能做在你家路由器的门卫那里。如果运营商在你上游还设了一道门卫(也就是 CGNAT),你连自己小区门牌号都没有,只有运营商临时发的一个信箱编号,那你做什么登记都没用,因为外部的信根本到不了你这道门。

这就是为什么很多人照着老教程配 DDNS 加端口映射,配完发现毫无效果。不是配置错了,是前提条件不存在了。

1.2 四条常见路线,各自要付什么代价

在决定用 EasyTier 之前,我建议你先花五分钟对照一下下面这张表,看看自己真正需要的是哪条路。很多人一上来就找工具,其实需求用一条静态路由就能解决。

方案前提条件上手难度主要限制
向运营商申请独立公网地址当地支持、可能需要额外费用中等并非所有地区都能办下来
路由器端口映射有路由器管理权限、有公网地址低完全依赖上一条
第三方内网穿透服务有可用的中转服务低带宽和延迟受中转方限制,长期使用成本不低
虚拟组网工具设备能正常上网即可中等每台要互访的设备都得装客户端

前两条路的核心是"把门打开",问题是门越来越难开。第三条路是"请人代收",方便但速度上限捏在别人手里,传大文件时体感明显。第四条路,也就是 EasyTier 走的路子,是"给每台设备发一张内部通行证"——不改变你家网络的结构,而是在设备层面额外拉一张虚拟网络出来,所有加入这张网的设备互相之间直接对话。

这个区别很关键:前三种方案里,被访问的设备必须"暴露"在公网上;虚拟组网里,没有任何设备暴露,它们只是在一个私有的虚拟网段里互相看得见。从安全角度看,后者其实更省心。

2. EasyTier 的虚拟网卡是怎么把两个局域网缝在一起的

2.1 每台设备凭空多出一块"假网卡"

装完并启动 EasyTier 之后,你去系统里看一眼网卡列表,会发现多了一块从没见过的东西。Linux 上通常是tun开头的设备,Windows 上是一个虚拟适配器。这块网卡不对应任何真实硬件,它是一块纯软件模拟出来的网卡。

它的作用是个"出入口"。系统往这块网卡里写的任何一个数据包,都会被 EasyTier 的进程截住,加密之后从真实的物理网卡发出去;反过来,从外面收到的加密数据解密之后,从这块虚拟网卡"塞"回系统,上层应用看起来就像是刚刚从网线上收到的。

这个机制带来的直接好处是:对应用程序完全透明。你的文件管理器、SSH 客户端、数据库工具、游戏,都不需要知道自己正在走一条特殊的通道。它们访问10.x.x.x这个虚拟地址,和访问192.168.1.x这个局域网地址,在系统层面没有任何区别。你不需要给任何软件做特殊配置,这是虚拟组网相比内网穿透最大的体验优势——穿透通常要你把服务端口映射到一个外部地址上,而组网是直接给你一个 IP。

2.2 打洞和中继:能直连就直连,连不上就绕路

两台都在 NAT 后面的设备,怎么建立连接?这里有个常被误解的点:它们并不是"约好一起连到某台服务器上",而是尽量想办法直接对话。

做法叫 NAT 打洞。双方几乎同时向对方的外网地址发包,第一个包会被各自的门卫拦下(因为没登记),但门卫在拦的同时会顺手记一笔"这个地址刚才来过"。等第二个包再发过来,门卫一看记录里有,就放进去了。两边都这么记一笔,通道就通了。

打洞的成功率取决于两边 NAT 的脾气。锥形 NAT 比较好说话,记录留着不删,打洞容易成;对称型 NAT 特别较真,每次连不同目标都换一个端口,记录还对不上,打洞基本没戏。移动网络和一些企业网络里对称型 NAT 很常见,这也是为什么有些人组网之后发现速度怎么都上不去。

打不通的时候,EasyTier 会自动退到中继模式:所有流量绕一圈,经过一台有公网地址的节点转发。能用,但代价是延迟。直连的情况下,往返延迟基本等于物理链路本身的延迟;走中继时,你的包要先到中转节点,再到对端,等于把两段路程加起来。同城可能只多十几毫秒,跨运营商跨地域时差距就明显了。所以判断一个组网配得好不好,第一件事就是看它到底走的是直连还是中继,而不是只看"能不能 ping 通"。

2.3 网络名和密钥,决定谁能进这个网

EasyTier 用一对参数来划定边界:网络名称(network_name)和网络密钥(network_secret)。名字相同、密钥也相同的节点,才会被认为是同一个虚拟网络的成员,才会互相交换路由信息。

这套机制的好处是极简:不需要中心化的账号体系,不需要审批,把两个字符串发给对方就行。但代价也很直接——密钥泄露等于门禁卡丢了。所以别图省事用123456或者test,那跟把家门钥匙插在锁上没区别。我一般用一段三四十位的随机串,生成完存在密码管理器里。

还有一点容易忽略:网络名称不要用带有明显含义的词,比如公司缩写加门牌号。这个名字在网络里是明文可见的,虽然它本身不构成安全风险,但没必要对外暴露信息。用一串无意义字符最省心。

3. 从零跑通第一个虚拟网络:安装、组网、验证

3.1 动手之前,先确认这三件事

第一件,虚拟网段不要和你现有的局域网撞车。假设你家路由器的网段是192.168.1.0/24,那虚拟网络就别用这个段。EasyTier 默认会挑一个比较冷门的网段,大多数情况下不会冲突,但如果你之前手动改过,或者你所在的环境里有多个网段,最好提前用ip route(Windows 上是route print)看一眼现有的路由表,把撞车的段避开。

第二件,确认设备能正常出网。这话听着像废话,但真有人卡在这里:设备能连上 Wi-Fi,但网关拦了非常规端口,导致连不上公共节点。先用浏览器随便开个网页,再试一下能不能连到你要用的那个节点地址和端口,两头都通了再往下走。

第三件,Linux 上需要 TUN 设备权限。检查/dev/net/tun是否存在,不存在的话要加载内核模块。如果打算跑在容器里,启动参数里要显式把设备挂进去,并给足网络管理能力,否则程序起来了但建不出虚拟网卡,日志里会报权限相关的错误。这一点在部署到小主机或者树莓派上时特别容易翻车。

提示:如果你用的是图形界面的客户端版本,大部分参数都有输入框,适合完全不想碰命令行的人。但我建议至少把命令行的跑法走一遍,出问题时能看懂日志,排查效率高得多。

3.2 用一条命令把第一个节点拉起来

下载对应平台的压缩包解开,主程序一般叫easytier-core,配套的还有一个easytier-cli用来查状态。先别急着后台运行,第一次跑建议前台跑着看日志:

sudo ./easytier-core \ --network-name my_mesh_01 \ --network-secret "替换成你自己的长随机串" \ -p tcp://<公共节点地址>:11010

几个参数单独说一下。--network-name和--network-secret就是刚才讲的准入凭证,后面所有设备必须完全一致,大小写都不能差。-p后面跟的是初始对端地址,作用是让这个节点先跟一个已知的、有公网落脚点的节点取得联系,它相当于"介绍人"。没有这个介绍人,两台都在 NAT 后面的设备根本不知道对方存在,也就谈不上打洞。

程序启动后,日志里会打印本节点的虚拟 IP,还有虚拟网卡的创建情况。看到tun类设备创建成功的提示,就已经成功一半了。如果卡在这里,八成是权限问题或者/dev/net/tun不可用。

确认没问题之后,加上后台运行的参数重新起一遍,或者干脆先停掉,直接进入下一步用配置文件管理。我个人习惯是:调试阶段用命令行快速试,稳定跑起来之后立刻转成配置文件,因为参数一多,命令行很快就会变成一行看不懂的长串。

3.3 第二台设备进来,然后验证连通性

在另一台设备上用完全相同的网络名和密钥,配上同一个介绍人节点,把命令再执行一遍。启动之后,两台设备的日志里都会出现对方的信息,说明它们已经互相"认识"了。

接下来用 CLI 工具确认状态:

# 查看本节点的虚拟 IP、网络名等基本信息 ./easytier-cli node # 查看当前有哪些对端节点,以及连接是通过直连还是中转 ./easytier-cli peer # 查看本节点掌握的虚拟路由表 ./easytier-cli route

peer这条命令是最有信息量的一个,重点看两点:一是对端有没有出现,二是连接的类型。如果显示的是直连,那恭喜,路是通的;如果显示走了中转,说明打洞没成功,功能上能用,但速度上要有心理预期,后面的排错章节会专门讲这个。

最后拿ping做验证:

ping <对端的虚拟IP>

能通就说明整条链路是活的。这里有个小提醒:Windows 默认的防火墙会拦掉 ICMP 回显,所以从 Linux ping 一台 Windows 机器经常会失败,但对方其实是在线的。遇到这种情况别急着怀疑组网,先去被 ping 的那台机器上临时关一下防火墙试试,或者用telnet之类的方式测一个具体端口,结论会更准确。

3.4 转成配置文件,为长期运行做准备

命令行参数适合试水,真正要长期挂着,还是得靠配置文件。写法是一份 TOML,字段和命令行参数基本一一对应:

instance_name = "default" hostname = "home-host" [network_identity] network_name = "my_mesh_01" network_secret = "替换成你自己的长随机串" # 介绍人节点,可以写多个作为备份 [[peer]] uri = "tcp://<公共节点地址>:11010" [[peer]] uri = "udp://<另一个公共节点地址>:11010" [flags] # 默认使用的传输协议 default_protocol = "tcp" # 开启加密 enable_encryption = true [file_logger] level = "warn" file = "/var/log/easytier.log"

写好之后启动时用-c指定路径即可:

sudo ./easytier-core -c /etc/easytier/config.toml -d

hostname这个字段值得单独提一句,它只是给人看的标签,方便你在节点列表里认出谁是谁,不参与任何路由判断。但如果你的网络里有五六台设备,不给它们起名字,一周之后你绝对分不清哪个 IP 对应哪台机器。我的习惯是按位置加角色来命名,比如"书房-小主机""机柜-软路由",一眼就能认出来。

[[peer]]写多个是有意义的。公共节点的可用性不可能百分之百,只写一个的话,那个节点出问题你的整张网就散了。写上两三个不同来源的,容错能力会好很多。

4. 子网共享:让一台小主机把整个家庭内网"背"出去

4.1 什么时候你需要这一层

前面讲的都是"每台设备装一个客户端"。但现实里有些设备你装不了:打印机、老款 NAS、监控摄像头、嵌入式小板子,它们没有对应的客户端,也没法跑。这时候就需要一台"中间人"——一台能装客户端的常开机器,让它把整个本地网段共享给虚拟网络。

具体做法是:在这台常开机器上启用子网通告功能,告诉虚拟网络里的其他成员"我身后有一个192.168.20.0/24的网段,想去那里的人,把包交给我"。这样你在外面只需要连上虚拟网络,就能像坐在家里一样访问那个网段里的任何一台设备,包括那些装不了客户端的老设备。

这个功能在跨办公场景里非常实用。一个分支办公室只要能有一台小主机跑客户端,整个办公室的内网就能被主办公室的同事访问到,不用改造任何网络设备。

4.2 配置写法,以及最容易被忽略的回程路由

配置本身很简单,在那台常开机器的配置文件里加一段:

# 把本地的 192.168.20.0/24 网段通告到虚拟网络 [[proxy_network]] cidr = "192.168.20.0/24"

看起来就一行,但真正让人卡住的从来不是这一行,而是回程路由。

想一下数据流:你在外面的笔记本(虚拟 IP 假设是10.144.144.5)想访问家里的 NAS(192.168.20.10)。你的包先到虚拟网络,被转发到那台常开机器,常开机器再把包转发给 NAS。到这里去程是通的。但 NAS 收到包之后要回一个响应,它看一眼源地址是10.144.144.5,这个地址它不认识,查路由表也没有对应条目,于是它按默认路由把响应扔给了自己的网关——也就是家里的路由器。路由器同样不认识10.144.144.5,只能把包丢掉。结果就是你去程通了,回程永远回不来,表现是 NAS 完全没反应。

解决方式有两种。一种是在家里的路由器上手动加一条静态路由,把10.144.144.0/24指向那台常开机器的内网地址。另一种是如果路由器没法改配置,就在 NAS 本机上加一条路由,把去往虚拟网段的路指向常开机器。两种都行,单台设备加一条最省事,设备多了就在路由器上统一加。

注意:很多"能 ping 通常开机器,但 ping 不通它后面的设备"的案例,根子都在回程路由上,而不是 EasyTier 配置错了。先用traceroute看一眼包走到哪一步断了,比反复重启客户端有用得多。

4.3 把某台设备设成默认出口,以及为什么要谨慎

EasyTier 还支持把某个节点设为默认出口:其他节点的默认流量全部交给它,由它转发出去。这样在外面的设备上网时,出口统一从家里那条线路走。

用不用取决于场景。出差在酒店连着不安全的 Wi-Fi,把出口设到家里的常开机器上,确实更让人放心。但要清醒地知道代价:所有流量都要绕一圈回家,再出去,延迟至少翻倍,而家里那条宽带的带宽会变成天花板。而且一旦出口节点掉线,所有流量立刻断掉。

我的建议是只在真正需要的时候开,用完就关,别把它当成常开配置。另外,开启出口的节点要留意它本机的路由转发是否打开,这一步在 Linux 上默认是关的,不打开的话流量根本转不出去,症状同样是"连上了但上不了网"。

5. 打洞失败、节点掉线、网段冲突:三类高频故障的排查链路

5.1 一直显示走中转,速度上不去

症状很明确:功能全都正常,能 ping 通、能访问服务,但传文件的速度差得离谱,实际值和两边宽带的上限严重不匹配。这时候第一件事是查连接类型,easytier-cli peer里会标明是直连还是经过中转。

确认走了中转,接下来按这个顺序排查。先看两边的网络环境,如果一边在移动网络或者大型企业网里,那基本可以判断是对称型 NAT,打洞成功率天然就低,这时候调整参数的意义不大,得从网络结构上想办法。再看防火墙规则,UDP 通常用于打洞尝试,如果某台机器的防火墙严格限制出站 UDP,打洞永远成不了。最后看介绍人节点的位置,如果两台设备都在同一个城市而介绍人在很远的地方,有些实现会倾向于保守策略,可以换一个物理位置更近的节点试试。

如果确实打不通,也不能干等。务实的选择是自己搭一个离两边都不远的中转节点,哪怕带宽不大,也比绕远路强。这一点是很多教程不说的:中转节点的地理位置,直接决定了退而求其次时体验的下限。

5.2 节点列表里能看到,但 ping 不通

这个症状比上一种更让人困惑。peer里明明列出了对方,虚拟 IP 也分好了,就是不通。

第一步查虚拟 IP 的分配情况。easytier-cli node会显示本机的虚拟地址,让对面也执行一遍,确认两边确实拿到了同一网段里的不同地址。如果某台显示没有地址,那问题在 DHCP 分配环节,可能在配置里手动关掉了自动分配又没指定地址。

第二步查系统防火墙。Windows 的入站规则默认严格,很多人配完发现从别处连不上自己这台机器,原因就是系统防火墙把虚拟网卡当成了"公用网络",直接拦了所有入站。把虚拟网卡的网络类型改成专用,或者手动放行对应端口,问题就解决。

第三步查路由表。在设备上执行ip route(Windows 上是route print),看有没有指向虚拟网段、且下一跳是虚拟网卡的那条条目。没有这条,系统压根不知道虚拟地址该往哪发,包会直接走上默认网关然后丢掉。

5.3 网段撞车,会让整张网陷入诡异状态

这一类问题最难查,因为症状不固定:有时候能通,有时候断,有时候只有部分设备不可达,日志里看不出任何明显错误。

根本原因是虚拟网段和你本地某个真实网段重复了。假设你办公室的内网恰好是10.144.144.0/24,而虚拟网络默认也用了这个范围,那系统面对一个目标地址时,完全不知道该从物理网卡发还是从虚拟网卡发,只能按最长前缀匹配随便挑一个,结果就是时通时不通。

判断方法很直接:把虚拟网段和所有参与设备的本地网段逐一对照,看有没有重叠。查完之后在配置文件里把虚拟网段显式指定成一个肯定不冲突的范围,比如挑一个172.16到172.31之间的冷门段。

# 显式指定虚拟网段的 IP,避免自动分配撞车 ipv4 = "172.20.20.1"

这个坑我踩过一次,花了整整一个下午。当时的现象是家里两台设备之间完全正常,但从公司连过去就时断时续,一度怀疑是公司网络有限制。最后把所有网段列出来一看,公司测试环境里恰好有个一模一样的段。改完虚拟网段之后立刻就好了。

6. 长期挂机前必须做的几件事

6.1 密钥强度和信息暴露

网络名称和密钥是你这张网唯一的门槛,没有第二道验证。所以密钥长度别吝啬,三四十位随机字符完全够,用密码管理器存起来,需要给新设备加网时复制粘贴,别手打。网络名称用无意义字符串,不要包含位置、单位、设备类型这类信息。

另外,配置文件里是明文写着密钥的。部署到共享机器上时,记得把文件权限收紧到只有对应账户能读,最简单的做法是chmod 600。这个细节听起来小,但在多人共用的机器上,配置文件被其他账户读到,等于门禁卡被复制了一份。

6.2 用系统服务托管,别靠nohup

临时测试用后台运行参数没问题,长期挂着就得交给系统服务管理,这样进程崩了能自动拉起,开机也能自启。Linux 上写一个 systemd 单元文件:

[Unit] Description=EasyTier Mesh Node After=network-online.target Wants=network-online.target [Service] Type=simple ExecStart=/usr/local/bin/easytier-core -c /etc/easytier/config.toml Restart=always RestartSec=5 LimitNOFILE=65535 [Install] WantedBy=multi-user.target

After=network-online.target这行别省。不加的话,开机时网络还没起来,进程就先跑了,连不上介绍人节点,然后一直卡在重试状态。Restart=always配合RestartSec=5是防抖的常见组合,避免进程一启动就崩、系统疯狂重启它。

Windows 上可以用计划任务,触发条件设成开机时,勾上"无论用户是否登录都运行"。图形客户端版本一般自带开机自启选项,勾一下就行,但要注意它可能是当前用户级别的自启,切换用户后不会生效。

6.3 MTU 与分片:一个容易被忽略的细节

虚拟网卡有一个 MTU(最大传输单元)的概念,也就是一次能塞进去的数据上限。虚拟网卡上还要额外封装一层协议头,所以它的可用 MTU 会比物理网卡小一些。默认值大多数情况下能用,但如果你的网络里出现了"网页能开、但大文件传一半就断""SSH 能连上、但一执行大命令就卡死"这类奇怪现象,八成是 MTU 设太大了,包在中间被分片或者丢弃。

排查方法很朴素:用ping加大包但不允许分片,一点点试出能通过的最大值。Linux 上是ping -M do -s <大小>,Windows 上是ping -f -l <大小>。比如从 1400 开始往下试,找到不丢包的那个值,然后把虚拟网卡的 MTU 设成这个数减掉协议头开销。

这个值不需要精确到个位,留一点余量反而更可靠。我一般在默认值基础上直接降 100 左右,绝大多数链路都能过。


我个人在实际操作中的体会是,组网工具本身的门槛其实不高,真正花时间的是三件事:搞清楚自己到底需要直连还是中继、把回程路由配明白、以及提前避开网段冲突。这三件事每一件都不复杂,但每一件都能让人卡上半天。我现在的习惯是,新建一张网之前先画一张纸,把涉及的所有网段列出来,标清楚哪台机器装了客户端、哪台靠子网共享覆盖,然后才开始动手。这张纸花五分钟,能省掉后面两个小时的排查。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询