家里电脑上跑着一个还在开发的网站,或者办公室的 NAS 想从外网访问,但家用路由器没有公网 IP,运营商又做了 NAT,外部请求进不来。这时需要一台有公网 IP 的服务器做中转,把外部请求转发到内网机器上,这就是内网穿透要做的事。阿里云的 ECS、NAT 网关都能承担中转。其中用 ECS 自建 frp 最灵活,个人和小团队用得也最多。

三种常见方案
选方案前先确认两件事。第一,内网服务在哪里,是本地电脑、家里的 NAS,还是另一台云主机。第二,对外要开放的是 HTTP 网页或接口,还是 SSH、数据库这类 TCP 服务。答案不同,选的方案也不同。
- 自建 frp:在阿里云 ECS 上部署 frps(服务端),本地机器运行 frpc(客户端)。frp 是开源项目,支持 HTTP、HTTPS、TCP、UDP,配置自由度高。成本基本就是一台 ECS 的费用。
- NAT 网关端口转发:如果要访问的服务本来就部署在阿里云 VPC 里,只是没有公网 IP,可以在 NAT 网关上配置 DNAT 规则,把公网 IP 的某个端口映射到 ECS 的内网地址和端口。不需要装客户端,但只适用于云上资源,家里的电脑够不着。
- 第三方穿透服务:开通即用,不用自己维护服务端,适合临时演示或者不想碰服务器配置的情况。代价是流量要经过第三方。数据比较敏感时,先想清楚能不能接受这一点。
个人开发和小团队长期使用,一般选第一种。后面的案例和步骤都基于这种方案。
案例:本地调试微信公众号回调
张工在一家做小程序的工作室工作。他的后端服务跑在自己的笔记本上,端口 3000。开发阶段需要接收微信公众号的消息回调,而微信服务器只能访问公网域名。笔记本在家庭宽带后面,没有公网地址,直接调试不了。
他的做法是这样的:买一台阿里云 ECS,系统选 Ubuntu,2 核 2G,地域放在中国香港。香港节点绑定域名不需要 ICP 备案,省了一步流程。ECS 上部署 frps,7000 端口接收客户端连接,同时开启 HTTP 虚拟主机端口 80,按域名分发请求。笔记本上运行 frpc,把本地 3000 端口注册成域名 dev.example.com 的 HTTP 代理。域名的 A 记录指向 ECS 公网 IP。
配置完成后,微信回调发到 dev.example.com,经 ECS 转发到笔记本的 3000 端口,本地日志里直接能看到回调内容。这套环境在工作室用了几个月,服务器和流量费用在开发预算里占比很小。以前每次都要部署到测试环境再排查问题,现在改完代码就能直接验证,反馈快了很多。
搭建步骤
- 准备 ECS:在阿里云控制台创建实例,记下公网 IP。安全组只放行必要端口,比如 7000(frp 通信)和 80 或 443(网站访问)。SSH 端口只允许自己的办公网或家庭出口 IP 访问,别对全网开放。
- 部署服务端:从 frp 的 GitHub 发布页下载与系统匹配的最新稳定版,解压后编辑 frps 配置文件,设置绑定端口和 HTTP 虚拟主机端口,并在认证部分填入一个足够长的随机 token。启动后用 systemd 之类的系统服务托管,服务器重启后它会自动运行。
- 配置客户端:在本地机器下载同版本的 frpc,填写服务端公网 IP、端口和同一个 token。然后添加代理,类型选 http,填入本地端口和自定义域名。两端版本差距大时可能连不上,先核对版本号。
- 设置域名解析:在域名服务商处添加 A 记录,指向 ECS 公网 IP。如果 ECS 位于中国大陆地域,绑定域名对外提供服务前要完成 ICP 备案,具体规则以阿里云备案要求为准。
- 验证:用外部网络(比如手机流量)访问域名,确认能打开本地服务。再看 frps 日志,代理状态显示在线,才算配通。
安全注意事项
- token 要够长:用随机生成的长字符串,不要用默认值或简单口令。token 一旦泄露,别人就能把任意服务注册到你的服务器上。
- 管理面板设密码:frps 如果开了管理面板,必须设置账号密码,并且只允许内网或指定 IP 访问。
- 只暴露必要端口:只映射对外必需的服务。数据库、远程桌面、内网管理后台不要直接穿透出去。确实要开,先加上访问控制。
- 网络不可信时开启 TLS:frp 支持 TLS 加密客户端与服务端之间的通信。在公司网络或公共 Wi-Fi 下运行时,最好打开。
- 定期更新:frp 和操作系统都要跟进安全补丁。穿透服务器本身就是公网入口,补丁落后会直接带来风险。
成本与选型建议
自建方案的主要成本是 ECS 实例费用和公网流量费用。如果要穿透视频流或大文件下载,流量会增长很快,先估算每月用量,再选带宽计费方式。只做开发调试的话,小规格实例一般够用。
临时演示就用第三方服务,省事。需要长期稳定运行、数据又比较敏感,就自建,服务端和日志都握在自己手里。服务本来就在阿里云 VPC 里的,优先用 NAT 网关或负载均衡,没必要绕到外网再穿透回来。
内网穿透只解决访问路径的问题,不能替代应用本身的安全。服务对外之后,登录认证、接口鉴权和访问频率限制还得单独做。