从VPS到家庭服务器:一条内网穿透隧道让局域网设备全球可达


摘要: 手上有台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站点)和私有服务(如数据库管理面板)物理隔离。

七、写在最后

内网穿透让家庭服务器突破了地理边界,但也把内网的攻击面扩展到了全球。便利与安全永远是一对矛盾——隧道越方便,被滥用的风险越高。建议从最小权限原则出发:只穿透必要的服务,只开放必要的端口,只给必要的用户访问权限。剩下的,交给防火墙、日志监控和定期审计。



-

用VPS自建图床:从0到1搭建一个支持WebP转换、CDN加速、防盗链的私有图床系统

评 论
更换验证码