摘要: 手上有台VPS,家里有台NAS或树莓派,想让内网设备通过VPS的公网IP被全球访问?内网穿透是最经济的方案。本文对比FRP、NPS、Cloudflare Tunnel三种主流工具,从部署复杂度、性能损耗、安全模型三个维度,帮你找到最适合家庭场景的隧道方案。
一、内网穿透的本质
NAT让 IPv4 地址得以续命,也让内网设备成了互联网孤岛。你的NAS、智能家居中枢、监控摄像头、甚至游戏服务器,都躲在路由器后面,公网无法直接访问。
内网穿透的核心逻辑是:内网设备主动向外建立一条长连接,公网流量通过这条隧道转发进来。关键在于"主动"——内网设备作为客户端发起连接,绕过NAT限制,无需公网IP、无需路由器端口映射。
代价是流量绕行VPS,增加延迟和带宽成本;VPS成为单点故障和潜在攻击面。
二、方案一:FRP——老牌经典,灵活可控
FRP(Fast Reverse Proxy)是国人开发的开源项目,社区活跃、文档完善、配置灵活,是国内用户最熟悉的内网穿透工具。
架构设计
FRP采用C/S架构:frps运行在VPS上,监听公网端口;frpc运行在内网设备上,主动连接frps;frps将公网请求通过隧道转发给frpc,frpc再转发给本地服务。
服务端部署(VPS)
下载对应架构的二进制文件:
wget https://github.com/fatedier/frp/releases/download/v0.58.1/frp_0.58.1_linux_amd64.tar.gz
tar -xzf frp_0.58.1_linux_amd64.tar.gz
cd frp_0.58.1_linux_amd64
创建配置文件 frps.toml:
bindPort = 7000
auth.method = "token"
auth.token = "你的强密码"
# 可选:Dashboard监控面板
webServer.addr = "127.0.0.1"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "面板密码"
启动:
./frps -c frps.toml
建议用Systemd托管:
sudo tee /etc/systemd/system/frps.service <<'EOF'
[Unit]
Description=FRP Server
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
sudo mkdir -p /etc/frp
sudo cp frps.toml /etc/frp/
sudo cp frps /usr/local/bin/
sudo systemctl enable --now frps
客户端部署(内网设备)
frpc.toml:
serverAddr = "你的VPS公网IP"
serverPort = 7000
auth.method = "token"
auth.token = "你的强密码"
[[proxies]]
name = "nas-web"
type = "http"
localPort = 80
customDomains = ["nas.yourdomain.com"]
[[proxies]]
name = "nas-ssh"
type = "tcp"
localPort = 22
remotePort = 6000
启动frpc,访问 nas.yourdomain.com 即可穿透到内网NAS的80端口,SSH连接 VPS_IP:6000 即可穿透到内网NAS的22端口。
FRP的优与劣
优势在于协议支持全面——HTTP、HTTPS、TCP、UDP、STCP(点对点加密)、XTCP(直连P2P)全部覆盖;配置语法直观,一个toml文件定义所有隧道;社区生态丰富,有第三方Web管理面板、自动SSL集成方案。
劣势是公网暴露端口增加攻击面,尤其是TCP远程端口直接暴露在VPS上,需要配合防火墙严格限制来源IP;frps本身成为单点,VPS宕机则所有隧道中断;流量全部绕行VPS,带宽和延迟受限于VPS线路质量。
三、方案二:NPS——国产替代,Web管理更友好
NPS(NatPassServer)是国内开发的另一款内网穿透工具,内置Web管理界面,对不习惯命令行的用户更友好。
快速部署
服务端一键安装脚本:
wget https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_amd64_server.tar.gz
tar -xzf linux_amd64_server.tar.gz
cd nps
sudo ./nps install
sudo nps start
默认Web管理面板在 http://VPS_IP:8080,账号密码在安装时输出。
客户端连接:
./npc -server=你的VPS_IP:8024 -vkey=客户端密钥
NPS vs FRP
NPS的Web界面降低了上手门槛,隧道增删改查可视化操作;支持多用户、权限分组,适合小团队共享一台穿透服务器;内置文件传输、 Socks5代理等附加功能。
但NPS更新频率低于FRP,部分高级功能(如P2P直连)实现不如FRP成熟;Web面板本身也是攻击面,务必修改默认端口、强密码、限制访问来源IP。
四、方案三:Cloudflare Tunnel——零公网端口,安全模型最优
Cloudflare Tunnel(原Argo Tunnel)是Cloudflare推出的内网穿透服务,核心差异在于:内网设备通过Cloudflare守护进程建立出站连接,VPS上无需暴露任何入站端口。
工作原理
内网设备运行 cloudflared,与Cloudflare边缘网络建立四条持久化的QUIC连接。用户访问你的域名时,请求到达Cloudflare边缘节点,通过已有连接转发到内网设备。整个过程中,VPS不需要开放任何端口,甚至不需要独立公网IP。
部署步骤
安装cloudflared:
# Debian/Ubuntu
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
# 登录并授权
cloudflared tunnel login
这条命令会打开浏览器,让你选择要关联的Cloudflare域名。
创建隧道:
cloudflared tunnel create my-nas
输出隧道UUID,记录下来。
配置隧道路由 ~/.cloudflared/config.yml:
tunnel: 你的隧道UUID
credentials-file: /root/.cloudflared/你的隧道UUID.json
ingress:
- hostname: nas.yourdomain.com
service: http://localhost:80
- hostname: ssh.yourdomain.com
service: ssh://localhost:22
- service: http_status:404
启动隧道:
cloudflared tunnel route dns my-nas nas.yourdomain.com
cloudflared tunnel run my-nas
DNS记录自动创建,SSL证书由Cloudflare自动管理。
Cloudflare Tunnel的独特价值
零公网端口暴露,VPS防火墙可以全部关闭入站,攻击面趋近于零;内网设备无需公网IP,甚至不需要独立VPS——任何能访问互联网的主机都能作为隧道端点;内置DDoS防护、Bot管理、Access身份验证(可强制Google/GitHub OAuth登录后才允许访问)。
代价是依赖Cloudflare服务可用性,虽然其SLA极高,但理论上存在单点;免费版有带宽和连接数限制,个人使用通常触达不到;QUIC协议在国内部分网络环境下可能不稳定。
五、三种方案如何选择
FRP适合对协议灵活性要求高、需要UDP穿透或P2P直连的场景,比如游戏服务器、视频监控流。配置自由度最高,但需要自己处理安全加固。
NPS适合小团队共享穿透服务、需要Web可视化管理的场景。上手最快,但长期维护信心弱于FRP。
Cloudflare Tunnel适合安全敏感型用户、已有Cloudflare域名管理的场景。零端口暴露的安全模型无可替代,但功能边界受限于Cloudflare生态。
六、安全加固:隧道不是免死金牌
无论选哪种方案,以下措施必须执行:
限制隧道可访问范围
FRP和NPS的TCP远程端口,用防火墙限制只允许特定IP访问:
sudo ufw allow from 你的家庭公网IP to any port 6000
Cloudflare Tunnel配合Access策略,强制身份验证后再放行。
本地服务本身要加固
隧道只是入口,本地服务的安全责任不会转移。NAS管理界面修改默认端口、禁用默认账号、启用双因素认证;SSH仅允许密钥登录、禁用root、修改到非标准端口;Web服务启用HTTPS、HSTS、安全响应头。
监控与告警
FRP Dashboard或NPS Web面板定期查看连接日志;Cloudflare Analytics监控隧道流量和错误率;本地部署Fail2ban,对异常登录尝试自动封禁。
隧道分离原则
不要把所有服务塞进一条隧道。敏感服务(如SSH管理)走独立的隧道实例,甚至独立的VPS;公开服务(如Web站点)和私有服务(如数据库管理面板)物理隔离。
七、写在最后
内网穿透让家庭服务器突破了地理边界,但也把内网的攻击面扩展到了全球。便利与安全永远是一对矛盾——隧道越方便,被滥用的风险越高。建议从最小权限原则出发:只穿透必要的服务,只开放必要的端口,只给必要的用户访问权限。剩下的,交给防火墙、日志监控和定期审计。
