很多人在家或公司搭建了服务器,比如 NAS、监控系统或者开发环境,但发现没法从外面直接访问。最常见的原因就是没有公网 IP,运营商分配的是内网地址,这时候传统的端口映射就走不通了。
为什么拿不到公网 IP?
现在大多数宽带用户拿到的其实是运营商内网 IP,尤其是家庭宽带。这是因为 IPv4 地址枯竭,运营商用 CGNAT 技术让多个用户共享一个公网出口。你拨号成功,但实际出口还是被层层包裹,外网无法主动连接进来。
反向代理:让内网主动“走出去”
既然外网进不来,那就让内网设备自己先连出去。反向代理的核心思路是:你的本地服务主动连接一台有公网 IP 的服务器,建立一条长期通道。别人访问这台公网服务器时,请求会被转发回你的本地设备。
常用的工具有 frp、ngrok、ZeroTier 等。以 frp 为例,你需要在云服务器上运行 frps(服务端),在本地运行 frpc(客户端)。
# frpc.ini 配置示例
[common]
server_addr = your_vps_ip
server_port = 7000
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
保存后启动 frpc,你的家里的 SSH 服务就会通过云服务器暴露在 6000 端口。即使没有公网 IP,也能从外网 ssh 家中设备。
内网穿透工具一键上手
如果你不想搭服务器,可以用现成的内网穿透平台。比如 natapp、花生壳、localtunnel 等。这些服务提供临时域名,安装客户端后配置几行命令就能对外暴露服务。
npx localtunnel --port 8080
执行后会返回一个类似 https://abc123.loca.lt 的地址,别人点开就能访问你本地 8080 端口的服务。适合临时调试网页、展示项目原型。
虚拟局域网方案:把设备拉到同一网络
像 ZeroTier 或 Tailscale 这类工具,能让你的手机、电脑、家里服务器处在同一个虚拟局域网里,哪怕物理位置完全不同。它们自动处理 NAT 穿透,不需要公网 IP。
安装 Tailscale 后,所有登录了账号的设备会获得一个虚拟 IP,比如 100.x.y.z。你可以像在公司内网一样直接 ping 或访问家里的 NAS,就像从来没被隔离过。
适用场景举例
周末你在咖啡厅想取家里电脑的文件,SSH 挂载一下就行;爸妈不会操作复杂软件,你用 Tailscale 配好后,他们开机就能被远程协助;做微信公众号开发,需要回调地址,用 natapp 生成个外网链接,本地调试毫无压力。
没有公网出口不是死路一条,关键是换个思路——不靠 IP,靠连接。只要你的设备能上网,就有办法让它被找到。