
记不清这是第几次被人问到“内网穿透用什么好”了。上周我一个老朋友折腾家里那台群晖 NAS想在地铁上翻照片自己搜了一堆资料最后被玩法各异的方案整得更懵。我把手头常用的四条路径整理成了一份选型笔记也就是这篇要展开讲的 FRP、ZeroTier、Ngrok 和花生壳。这四个名字基本覆盖了“内网穿透软件哪个好”这个问题下面九成以上的答案也对应着完全不同的使用思路。这篇文章我会把每个方案的原理、部署成本、实际体验和踩坑点都摊开讲清楚最后按场景给选型建议。家里有 NAS、远程要连电脑、经常调试接口或者纯粹想在公司访问家里设备的朋友都可以拿它当参考。内网穿透这个事本质上解决的是一个很朴素的问题你的设备在私网里外面怎么找到你。网络世界里私网 IP 遍地都是公网 IP 却是稀缺资源。运营商给家庭宽带的往往还是一个动态的、甚至是大内网套小内网的地址想要让外网设备直接访问到家里的服务就必须靠一条“隧道”把流量带出去。市面上的穿透工具看起来五花八门底层思路其实就那么几条搞清楚了就不容易选错。1. 内网穿透到底在解决什么问题1.1 没有公网 IP 的日常困境先聊一个最简单的场景。你在家里用一台旧电脑跑了个下载服务或者装了监控录像的查看页面在同一个 WiFi 下访问毫无压力IP 填 192.168.1.x 就行。但一旦人出了门用手机流量访问同一个地址立刻就不通了因为 192.168.1.x 是私网地址公网上的设备根本不知道怎么把数据包送给它。这时候人们的第一反应是去路由器里做端口映射把公网某个端口转到内网某台设备的端口。这个思路本身没错但它有两个前提第一你得有公网 IP第二这个 IP 得能被外部稳定访问。现实情况是很多地区的家庭宽带不再分配独立公网 IPv4 地址用户拿到的其实是一个共享出口想在路由器上做端口映射完全无从下手因为你的“公网 IP”根本不在自己手里。IPv6 虽然能解决一部分问题但运营商给家庭宽带的 IPv6 地址也经常变化而且不少设备、不少程序对 IPv6 的支持还是很别扭。这就给内网穿透工具留出了巨大的发挥空间。穿透工具的核心作用是让内网设备主动向外网的一个“中间据点”建立连接再通过这个据点把外部请求转发回内网。因为连接是内网设备主动发起的所以不需要公网 IP也不需要路由器上的端口映射天然绕开了上面的两个限制。1.2 穿透方案的四种技术路线把主流的穿透工具归类之后你会发现其实就是四条技术路线。第一种是自建中转隧道。典型代表是 FRP。你需要有一台带公网 IP 的云服务器在上面跑一个服务端程序内网设备跑客户端程序两边建立一条通道。外部用户访问服务器上的某个端口时流量会被原封不动地通过这条通道送到你家内网的服务上。这种方案完全自己掌控灵活度最高代价是你得会点 Linux 命令还要养一台服务器。第二种是虚拟组网。典型代表是 ZeroTier。它不再围绕“某个端口”做文章而是把你分散的设备拉进同一张虚拟局域网里每台设备获得一个类似 10.x.x.x 的虚拟 IP互相之间可以直接访问。底层它会在合适的网络条件下自动打洞实现点对点直连速度非常理想。第三种是托管隧道。典型代表是 Ngrok 官方服务国内的 cpolar、樱花内网穿透也属于这类。服务商替你把中转服务器准备好你只需要下载一个小客户端并运行就能拿到一个公网域名或公网端口立刻开始转发。上手最快但免费版限制不少。第四种是商业映射服务。典型代表是花生壳。它其实是把第二种思路上面的“服务器搭建”做成了云服务用户注册个账号装个客户端点几下就能添加映射。全程不需要碰代码和配置文件适合完全不想折腾的人。清楚了这四条路线后面看每个工具的对比就很容易对号入座了。2. 四个主流方案逐个拆解2.1 FRP自由度最高的自建中转方案FRP 全称是 Fast Reverse Proxy是一个开源项目Github 上热度非常高。它的架构很清晰一个有公网 IP 的云服务器跑 frps也就是服务端家里那台设备跑 frpc也就是客户端。frpc 启动后会主动去连 frps把这个连接保持在后台。外部访问者请求云服务器的某个端口frps 就把数据内容传递给这条已经建立好的通道frpc 再转给内网的目标服务。FRP 最大的优势是自由。它支持的协议非常多TCP、UDP、HTTP、HTTPS 都能转这意味着你不仅能穿 Web 服务SSH、远程桌面、数据库连接、游戏服务器只要能跑在特定端口上的东西它都能转发。它还提供了 stcp 和 xtcp 这两种特殊的 P2P 模式可以在特定条件下跳过服务器中转让两边直接建立连接速度上限一下子高很多代价是配置复杂度和打洞成功率都有不确定性。我自己的主力方案就是 FRP。长期挂机的服务我会走普通中转模式因为云服务器带宽虽然不宽但胜在稳定。偶尔需要在两台机器之间传大文件我再临时起一个 xtcp 的配置让它尝试直连能跑满家庭宽带上行就非常爽。FRP 的缺点同样明显你必须花时间维护一台服务器还得处理 TLS 证书、token 认证、防火墙放行这些事。没有 Linux 基础的人第一次接触会有点懵但一旦跑起来稳定性和可控性远远好于任何托管服务。顺便说一句网上还能看到一些“火点 frp”这样的第三方名称本质是有人把 FRP 做成了托管服务帮你把服务端和客户端都包好了。好处是自己不用买服务器坏处是数据从别人那边绕一圈隐私和稳定性都没法完全掌控适合临时测一测不适合正式用它承载敏感数据。2.2 ZeroTier把分散设备组进一张虚拟局域网ZeroTier 的思路和 FRP 完全不同。它不做端口转发而是直接构建一张 Overlay 虚拟网络。你在 ZeroTier 官网注册一个账号创建一个网络会得到一个 16 位的网络 ID。家里电脑、公司电脑、手机、NAS 都装上客户端加入同一个网络 ID然后在网页后台把设备勾选成允许加入它们就互相“认识”了每台设备会拿到一个像 172.28.x.x 这样的虚拟 IP。之后你可以像访问局域网机器一样访问它们跑 RDP、SSH、SMB 文件共享随便什么协议都行。ZeroTier 的厉害之处在于它内部有一套协调机制。设备刚加入网络时会通过 ZeroTier 官方的根服务器来交换彼此的位置信息然后尝试 NAT 穿透。如果两边的网络类型允许数据就直接在设备之间点对点传输完全不经过谁的服务器速度取决于你家里宽带上行和你所在位置访问它这段链路的实际质量。打洞不成功的情况下流量会走官方中继服务器转发速度就差很多这个问题后面我会详细讲怎么排查。我觉得 ZeroTier 最舒服的使用场景不是“向公网暴露某个服务”而是“让你的多台私人设备组成一个私密网络”。它不需要你去记一堆公网端口所有设备都在一个大内网里你可以用它把一台放在老家的 Linux 小主机变成一台随时可用的远程开发机也可以把公司电脑和家里 NAS 放在同一张网络里直接映射网络驱动器。免费套餐对于个人使用通常绰绰有余这也是它近几年越来越火的原因。它的门槛在于第一用它的前提是双方都需要安装客户端你不能只在一端操作就让外面的朋友访问你的服务第二网络里的设备数量多了之后派发 IP、管理授权也需要一点学习成本第三如果两台设备之间存在严格对称型 NAT或者处于运营商级 CGNAT 后面打洞会失败这时候就需要自己搭建 Moon 节点来担当协调者甚至中继。2.3 Ngrok临时调试场景的最快选择Ngrok 是一个非常老的隧道工具几年前还没几个人知道内网穿透这个概念时程序员们就已经用它来调试本地代码了。它的用法极度简单在本地装一个 ngrok 客户端运行一行命令比如ngrok http 8080工具就会自动连上 ngrok 官方的服务器同时告诉你一个公网 HTTPS 地址。别人访问这个地址流量就会被原封不动地转发到你本地 8080 端口的服务上。这个体验在联调场景里简直救了大命。比如你本地跑了一个微信小程序后端服务微信服务器要求回调地址必须是公网 HTTPS 域名总不能为了联调就把代码部署到云服务器上去。用 ngrok 起一个隧道瞬间就有一个公网地址可以填进回调配置里日志在本地直接看改完代码刷新就生效。类似的还有对接支付平台的 webhook、给客户临时演示一个网页效果、把自己机器的某个 TCP 端口短期暴露给朋友联机玩游戏。Ngrok 免费版的限制也一直存在。免费用户拿到的域名是随机分配的每次重启隧道域名都会变而且国内直连官方服务器的稳定性并不尽如人意。它的 2.0 版本之后官方把客户端和服务端做了强关联自己部署一套 ngrok 服务端已经比较麻烦网上很多教程也过时了。所以我现在更倾向于把它当作一个“临时快捷方式”而不是长期使用的主力方案。需要长期稳定暴露服务的地方我会用 FRP 自己搭。如果实在不想折腾服务器也可以试试文字热词里经常一起出现的 cpolar。cpolar 的定位类似 Ngrok 官方服务界面是中文的浏览器里就能管理隧道免费版也提供可用的随机域名和固定的 TCP 隧道上手体验比 Ngrok 官方省心不少。2.4 花生壳适合小白的商业托管服务花生壳是国内老牌的动态域名解析和端口映射工具很多年前大家还在用动态公网 IP 连家里电脑时它就是非常出名的选择。如今它转型成了托管式的内网穿透服务思路很清晰服务端的维护交给贝锐客户端软件做得足够傻瓜化在官网注册账号、下载客户端、登录后在界面里添加一个映射规则填写内网设备的 IP 和端口它就会给你分配一个外网访问地址。整个过程不到五分钟就能跑通不需要碰命令行也不需要理解什么 TCP、UDP、token。它最大的优势就是省心。免费版可以用来体验日常使用会有速度限制、流量限制和映射数量限制当你需要更快的速度和更多映射条目时就得按年付费订阅。付费价格不算贵但对于经常折腾的人来说最让人纠结的是数据都会通过花生壳的服务器中转带宽和延迟受限于你购买的套餐等级。我给完全不懂技术的朋友远程协助时会建议他们装花生壳来临时救急。比如家里的打印机想在外面用或者有人需要从办公室访问家里的监控后台装个花生壳客户端几分钟就能解决。但如果他们打算长期稳定地跑一个需要消耗较大流量的服务我一般还是劝他们找一台便宜云服务器我用 FRP 帮他们搭好毕竟自己手里的服务器始终比托管服务更可控。3. 横向对比与选型建议3.1 一张表看清四个方案的核心差异当你把四个方案放到同一张表格里彼此之间的侧重就非常明显了。对比维度FRPZeroTierNgrok官方托管花生壳是否需要公网服务器需要自己准备不需要官方协调不需要服务商提供不需要服务商提供部署难度较高要配置 frps/frpc低装客户端加网络很低一行命令启动最低图形界面点几下数据传输方式默认中转可选 P2PP2P 直连失败走中继托管服务器中转托管服务器中转免费额度开源完全免费服务器自费免费套餐个人够用免费版域名随机、有限制免费版功能受限性能上限取决于服务器带宽打洞成功时逼近宽带上限受服务商带宽限制受套餐带宽限制适合人群有服务器、愿意折腾多设备组网、长期互访临时调试、快速分享非技术用户、应急使用这个表能解释很多现象。FRP 的上限最高但门槛也最高ZeroTier 在“设备互相访问”这个场景下体验最好因为它天生就是一张虚拟局域网Ngrok 和花生壳这一类托管服务的核心价值是省事代价是自由度和性能都要打折扣。3.2 按场景选型的判断顺序选型其实不需要把每个工具的所有文档都读一遍按下面这个顺序问自己三个问题就够了。第一问你手里有没有一台能长期使用的云服务器如果有而且你愿意花半小时配置一次FRP 几乎是全能答案。它既能做端口转发也能做 P2P 打洞还能搭配各种认证和加密长期稳定性也最好。这是我个人最推荐的主力方案。第二问你的核心需求是“让多台设备互相访问”还是“向公网暴露一个特定服务”如果是前者比如在家里 NAS、公司电脑、手机之间传文件ZeroTier 体验远超 FRP。它在设备之间建立的是网络连接访问方式和局域网完全一样不需要为每个服务单独折腾端口映射。如果是后者比如做一个网站或对接一个公网 APIFRP 或托管隧道更自然。第三问你是想长期用还是临时救急长期用且不想维护服务器可以看看 cpolar 这类国内托管隧道或者接受花生壳的付费套餐。临时调试、给别人演示一下直接用 Ngrok 官方服务的免费额度一分钟搞定。4. 实操细节FRP 与 ZeroTier 部署避坑讲完选型思路我挑两个最有代表性和实操价值的方案展开说FRP 和 ZeroTier。一个代表中转隧道一个代表虚拟组网。剩下两款工具的官网指引已经足够友好我就不在这里重复了。4.1 FRP 从下载到开机自启FRP 的部署分两端。服务端放在有公网 IP 的云服务器上客户端放在家里那台需要被访问的设备上。先去 GitHub 找到 FRP 的 Releases 页面下载对应你系统架构的压缩包。服务器一般是linux_amd64家里如果是树莓派或 ARM 平台的 NAS就得选linux_arm64。怎么判断在终端里输入uname -m输出x86_64就选 amd64输出aarch64就选 arm64。下载后用tar -xzf frp_xxx.tar.gz解压你会看到frps、frpc两个可执行文件以及对应的.toml配置文件。新版 FRP 从 0.52 版本开始全面使用 TOML 格式网上老教程里那种[common]的 INI 写法已经过时不要照抄。服务端frps.toml最简单版本长这样bindPort 7000 auth.method token auth.token 换成一段足够长的随机字符串客户端frpc.toml这样写serverAddr 你的云服务器公网IP serverPort 7000 auth.method token auth.token 和服务端一致的token [[proxies]] name nas-web type tcp localIP 192.168.1.10 localPort 5000 remotePort 7500这段配置的意思是把家里 192.168.1.10 这台设备的 5000 端口映射到云服务器的 7500 端口。外部访问云服务器IP:7500流量就会通过隧道打到家里的 5000 端口上。启动也很简单服务端跑./frps -c frps.toml客户端跑./frpc -c frpc.toml。如果一切正常日志里会出现一条login to server success类似的信息。这里有几个非常容易踩的坑第一个坑是云服务器安全组和系统防火墙。很多新手在云服务器里把程序跑起来了但外部怎么都访问不到十有八九是安全组没有放行端口。阿里云、腾讯云这些平台即使服务器系统内部的防火墙关闭了控制台里的安全组规则仍然会拦截入站流量。你需要同时放行 frps 的 bindPort7000和映射出去的 remotePort7500。第二个坑是 remotePort 不能和服务器上已有服务的端口冲突。如果云服务器上已经跑了 Nginx 占着 80 和 443你非要映射 remotePort 80服务会直接启动失败报端口占用。先执行ss -tlnp | grep 7500确认一下端口是空闲的再用。第三个坑是要保持 frpc 长期运行。手动执行程序只能运行在当前终端里一旦终端退出进程就没了最稳的办法是注册成 systemd 服务。在你的服务器上新建/etc/systemd/system/frpc.service写上[Unit] Descriptionfrp client Afternetwork.target [Service] ExecStart/root/frp/frpc -c /root/frp/frpc.toml Restartalways RestartSec5 [Install] WantedBymulti-user.target然后依次执行systemctl daemon-reload、systemctl enable frpc --now就能实现开机自启和异常退出自动拉起。服务端 frps 同理按照这个套路写一个 service 文件放到服务器上即可。还有一个额外建议如果穿透的是 Web 服务最好在 frps 侧配置 TLS或者在 frpc 里指定transport.tls.enable true至少把传输内容加密一下避免数据在链路上裸奔。如果你对自己服务器性能有信心也可以直接在 frpc 前面再套一层 Nginx 反向代理做终结具体要求看你的场景但加密这件事千万不要省。4.2 ZeroTier 组网与打洞调优ZeroTier 的起步非常顺手。去 my.zerotier.com 注册一个账号创建一个网络记下那串 16 位的 Network ID。然后在你需要加入网络的设备上安装客户端Windows 和 macOS 有图形界面Linux 上执行安装脚本后运行sudo zerotier-cli join 你的网络ID加入之后到网页后台的设备列表里能看到这台设备的 MAC 地址和 IP这时候它还没有获得授权。你需要在这条设备记录前打勾允许它加入网络。如果默认的 IP 分配方式不符合你的要求可以在后台手动给它设置一个固定的虚拟 IP比如 172.28.0.20这样后续访问路径就稳定了。所有设备都授权完毕之后互相ping一下就通了。这套流程看着简单但实际用起来最容易踩的是两个点。第一个点ZeroTier 只是把安装了客户端的设备拉进虚拟网络它不能直接访问该设备所在物理局域网中其他设备。也就是说A 电脑加入了某个 ZeroTier 网络你想通过 A 这台设备去访问它旁边一台没装 ZeroTier 的打印机是行不通的。想要实现这种效果需要在 A 设备上开启 IP 转发并配置 NAT 规则让虚拟网络的流量可以从 A 的物理网卡转发出去。Linux 上一般需要开启net.ipv4.ip_forward再加上一条 iptables MASQUERADE 规则。这个操作有一定门槛但如果你真需要“一台设备带着整个家里局域网接入”花点时间研究是值得的。第二个点性能表现全看打洞结果。ZeroTier 网络最理想的状态是设备之间点对点直连数据不经过官方服务器传输速度接近家里宽带上限。但现实是很多网络环境打洞失败流量自动走了官方中继延迟高、速度慢。怎么看自己走的是直连还是中继执行sudo zerotier-cli listnetworks # 查看虚拟网络状态 sudo zerotier-cli peers # 查看对端连接类型如果peers输出里对端的关系是 DIRECT说明打洞成功慢就是链路质量问题如果是 RELAY说明流量走了中继优先解决打洞。常见的解决办法包括检查两端的 NAT 类型避免双方都是对称型 NAT给路由器开启 UPnP确认没有防火墙拦截 ZeroTier 使用的 UDP 端口。环境实在打不通洞的就自建一个 Moon 节点把 Moon 服务器加到网络里至少能把 RELAY 节点稳定在中转效果更好、离你更近的服务器上。5. 常见问题与排查技巧实录5.1 隧道通但数据传输速度上不去这个问题在 FRP 和花生壳里最常见在 ZeroTier 里也不少。如果你用的是中转模式先看服务器的带宽。很多便宜云服务器默认为 1Mbps 到 5Mbps 的小水管跑满也就几百 KB 每秒这不是工具不行是上游带宽限制死了。解决办法要么升级服务器的带宽套餐要么换成 P2P 模式让流量不走服务器。FRP 的 xtcp 和 ZeroTier 的直连本质上都是这个思路先把数据通道从“绕远路”改成“抄近道”速度才能有质的提升。如果 P2P 已经打通但速度仍然不理想检查一下两端的 MTU 值或者尝试在客户端配置里关闭 IPv6某些网络环境下 IPv6 开启反而干扰了 UDP 打洞。5.2 加入了网络却互相 ping 不通ZeroTier 入网后 ping 不通绝大多数原因是设备没有在网页后台被授权。我见过不少朋友把 Network ID 填进去看到客户端显示请求加入就以为完事了其实还需要管理员到后台的成员列表里点那个勾这一步不做设备始终处于未激活状态。排除授权问题之后再看系统防火墙。Windows 设备加入专用网络时如果被识别成了公用网络默认就会拦截各种入站请求手动切换网络配置文件类型或者放行相关端口就能解决。如果授权和防火墙都没问题但依然不通大概率是路由问题。用sudo zerotier-cli peers查看对端状态是否正常同时检查两端是否处于同一虚拟网络且 IP 段不冲突。最后一招是把两台设备的 ZeroTier 服务都重启一遍很多临时性的网络故障这样就好了。5.3 在 Linux 上找不到 frpc 程序怎么办有人下载完 FRP 后不知道解压到哪了也有人下载完就忘了放在哪个目录过几天想改配置就找不到了。最简单的方法是直接用which frpc或whereis frpc查一下它是否在 PATH 里。如果没有任何输出再尝试全盘搜索find / -name frpc -type f 2/dev/null这个命令会在整个文件系统里找名为 frpc 的文件速度稍慢但一定能找到。如果你想养成好习惯建议以后把 FRP 固定放在/opt/frp目录下并把执行路径写进 service 文件里就不会再出现“用户找不到了frp下载到linux的位置”这种抓瞎情况了。另外搜索的时候注意排除系统临时目录很多情况下文件根本没丢只是你解压到了/tmp下面重启机器文件就被清理了。5.4 端口冲突、域名被占用的处理FRP 服务端启动失败时如果日志里有address already in use说明 remotePort 或 bindPort 被占用了用lsof -i:7500或者ss -tlnp | grep 7500查看是谁占用的端口换个端口重新映射即可。Ngrok 这类工具报端口占用则更直接运行ngrok http 8091换一个本机端口就行注意 ngrok 代理的端口一定是你本地服务真正监听的端口不能随手填一个没跑服务的端口。花生壳添加映射时提示域名被占用一般是随机分配的免费域名被用掉了换一个端口或者换一个域名前缀也能解决。总而言之遇到端口类问题先检查占用再确认防火墙安全组这两个地方覆盖了大部分故障场景。6. 补充方案与个人选型体会6.1 cpolar、樱花内网穿透这类托管隧道怎么选除了上面四个主流方案国内还有一批托管隧道服务经常被提到cpolar 和樱花内网穿透就是代表。cpolar 在中文用户圈里口碑不错它提供的浏览器控制台能方便地管理隧道状态免费版可以拿来体验付费后能固定域名、增加带宽。樱花内网穿透也因为上手简单、有免费隧道成了很多人临时开服联机的选择。这两类服务的本质都是 Ngrok 官方那种托管中转不要指望免费套餐能跑出多高的速度也不要放敏感业务在上面。如果只是临时共享一个页面、联机玩一把游戏、给客户做个演示它们是效率最高的选择如果打算长期稳定跑一个服务还是老老实实回到 FRP 或 ZeroTier 的轨道上。6.2 最后聊聊我的长期使用建议用了这么多年我个人的组合方式是长期在线、需要对外提供服务的机器全部走 FRP自己掌握服务器意味着带宽、安全、稳定性都可控。多台私人设备之间互访用 ZeroTier它让我在家里和公司两个局域网之间像在同一间办公室一样传文件。临时调试接口或给别人演示用 Ngrok 或 cpolar一分钟起一个隧道用完就关不留下任何常驻进程。帮完全不懂技术的朋友远程应急我直接推荐花生壳图形界面操作几下次就能搞定我也不用隔着电话教他改配置文件。这几种工具之间不是谁取代谁的关系而是不同需求对应不同选择。做技术选型最忌讳听到一个方案就无脑上先想清楚你要解决什么问题再决定用什么工具效率会高很多。最后提醒一句不管选择了哪套方案密码和 token 一定要设置高强度暴露在公网上的端口一定要越少越好安全这道防线永远是自己把住的。除了上面这些你如果手里正好有几台设备需要长期互联我强烈建议从 ZeroTier 开始体验因为它给你的正反馈来得最快。装上客户端、点一个勾、ping 通那种“原来内网穿透也可以这么简单”的感觉比看十篇对比文章都管用。