内网穿透 VS WireGuard:远程访问家庭服务的终极对比

内网穿透 VS WireGuard:远程访问…

内网穿透 VS WireGuard:远程访问家庭服务的终极对比

作者:IT大叔

分类:网络教程


一、先说一个真实场景

上个月我又一次在机场候机时被老婆电话轰炸:”家里那个监控又连不上了,你弄的什么破玩意儿!”

这已经不是第一次了。家里跑着NAS存照片、一台刷了OpenWrt的路由器挂着广告屏蔽和科学上网、还有一台Ubuntu小主机跑着Home Assistant和Jellyfin媒体服务器。平时在家用着挺爽,可一旦出了门,这一切就跟废铁一样——因为你没有远程访问的方案。

相信很多人跟我一样,折腾了一圈又一圈才找到适合自己的方案。今天这篇文章,我就把这几年来踩过的坑、用过的方案、最终的选择,一次性说清楚。

这个文章适合谁? 就是那些家里有一台或几台服务器/NAS/路由器,想在外面也能访问的人。不管你是刚入门的小白,还是已经折腾了几年的老手,这篇文章都能让你少走弯路。


二、远程访问的本质是什么?

说人话就是:你家里的设备在一个内网里(比如 192.168.1.x),你手机在外面用的是4G/5G或者公司WiFi,这两个网络之间没有直达的通道。你得想办法建一条通道,让你在外面能连回家里。

就这么简单的一件事,市面上却有好多种做法,各有各的坑。


三、市面常见方案大盘点

3.1 方案A:端口映射 + DDNS(最传统)

这个方案年纪跟我差不多大。做法就是:

1. 跟运营商要个公网IP(现在越来越难要了)

2. 在路由器上做端口映射,把NAS的5000端口映射到公网

3. 用DDNS(动态域名解析)绑一个域名,因为公网IP会变

优点:

  • 免费,不需要第三方服务器

  • 直连,延迟最低

缺点(致命的那种):

  • 公网IP现在跟大熊猫一样稀有。电信联通还好,移动基本别想了

  • 端口暴露在公网上,24小时被各种扫描器问候。我路由器上的日志,一天能被扫几千次

  • 如果你映射的是SSH的22端口或者NAS的管理端口,等着被暴力破解吧

  • 家里所有设备都暴露在一个网段,一旦破了一个口子,整个内网就不设防了

大叔评价: 不是不能用,但风险确实不小。如果你非要用,记得换非标准端口、关密码登录只用密钥、给NAS开防火墙规则。别裸奔。

3.2 方案B:内网穿透工具(frp / ngrok / Cloudflare Tunnel)

这类方案的共同特点:你家里的设备主动连到一台有公网IP的服务器上,你在外面也连到这台服务器,数据经过它中转。

先说 frp(我最熟悉的):

frp 是国人开发的,江湖地位很高。你需要一台VPS(云服务器),在上面跑 frps(服务端),在家里设备上跑 frpc(客户端)。

# frps 配置文件(VPS上)
[common]
bind_port = 7000

# frpc 配置文件(家里的NAS上)
[common]
server_addr = 你的VPS公网IP
server_port = 7000

[web]
type = tcp
local_port = 5000
remote_port = 5000

看起来很简单对吧?但坑在后面:

  • 你得有一台VPS,最低配一年也得两三百块

  • 所有流量都经过VPS中转,VPS的带宽决定了你的体验。如果你买的VPS只有1Mbps,传个照片都卡

  • frp 本身不带加密(可以通过TLS插件实现,但配置更复杂)

  • 维护工作:VPS要续费、要更新系统、要防攻击

再说 Cloudflare Tunnel(也叫 Cloudflared):

这个是我近期比较推荐的”免费方案”。原理是你家里装一个 cloudflared 客户端,它跟 Cloudflare 的网络建立一条加密隧道,然后你在 Cloudflare 上配域名指向这个隧道。

优点:

  • 免费!不需要VPS

  • 自带SSL/TLS加密

  • DDoS防护(Cloudflare的强项)

  • 可以设置Zero Trust策略,加一层登录验证

缺点:

  • 必须用 Cloudflare 管理你的域名

  • 速度取决于 Cloudflare 到你的网络质量。国内用户经常遇到”慢得要死”的情况,因为 Cloudflare 的节点延迟

  • 对国内用户不太友好,部分地区访问 Cloudflare 的 IP 会被限速甚至阻断

  • WebSocket 和流媒体(比如Jellyfin看视频)体验一般

最后说 ngrok:

ngrok 是最”傻瓜”的穿透工具,下载就能用,还能给你分配一个临时域名。

ngrok http 5000

就这一条命令,你的本地服务就暴露到公网了。

优点: 简单到令人发指,调试Webhook的首选

缺点: 免费版域名随机的每次变,每分钟40个连接限制,不适合生产环境

大叔评价: frp适合有一定Linux基础、手头有VPS的人;Cloudflare Tunnel适合有域名且网络条件允许的人;ngrok……临时调试用用就行了,别想太多。

3.3 方案C:VPN方案(WireGuard / OpenVPN / Tailscale / ZeroTier)

这就到我最喜欢的部分了。

VPN 的思路跟前面两种完全不同——你不是把端口暴露到公网,而是在你和家里的网络之间建一条加密的”专线”,就像你也在家里一样。

优势很明显:

  • 不暴露任何端口到公网(除了VPN的端口,但只开一个端口跟开十个端口,攻击面完全不一样)

  • 端到端加密

  • 你等于进了家里的内网,所有设备都能访问,不需要一个一个配穿透

  • 可以放在路由器上,整个局域网都能享用


四、WireGuard 深度讲解(我最推荐的方案)

4.1 为什么我最终选择了WireGuard?

我先说结论:WireGuard 是目前为止,远程访问家庭网络的最佳方案。前提是:你家里或你的VPS有一个公网IP。

我用过的VPN排个名:OpenVPN → IPSec/L2TP → WireGuard。用过WireGuard之后,前面那些我全弃了。

4.2 WireGuard 到底有多优秀?

1. 内核级实现

WireGuard 被合并到了 Linux 内核(5.6+)。这意味着它不是跑在用户态的一个进程,而是内核原生支持的。速度上天生就赢了那些跑在用户态的VPN(比如OpenVPN)。

2. 性能是OpenVPN的3-4倍

这不是我瞎吹的,有大量的评测数据支持。在我实测中:

  • 同一台VPS,OpenVPN能跑大概 50-80Mbps

  • WireGuard 轻松跑满 VPS 的 200Mbps 带宽

这还只是单线程。如果你的VPS带宽够大,WireGuard 几乎是线速转发。

3. 配置简洁到令人感动

对比一下。OpenVPN需要:

  • CA证书

  • 服务端证书

  • 客户端证书

  • DH参数文件

  • TLS认证密钥

  • 一大串配置文件

WireGuard只需要:

  • 一个配置文件,配一对密钥对

真的,就一个 wg0.conf 文件。服务端和客户端都是同样的格式。

4. 加密协议先进

WireGuard 使用了:

  • Curve25519(比OpenVPN用的RSA-2048更安全、更高效)

  • ChaCha20-Poly1305(现代AEAD加密,在无AES硬件加速的设备上更快)

  • 内置完美前向保密(PFS)

而且只有这么几种加密套件,不给你选择的余地——因为选择越多,配置出错的可能性越大,也越容易有安全漏洞。

4.3 实战部署:家庭NAS做Server,手机/笔记本做Client

下面是一个真实的部署案例,我家就这么配的。

前提条件: 有一台有公网IP的设备(可以是VPS,也可以是家里的软路由/NAS)。如果没有公网IP,请看后面的方案对比。

第一步:在Server(家中NAS/软路由)上安装WireGuard

以Ubuntu为例:

# 安装(新版Ubuntu自带内核模块,只需要装工具)
sudo apt update && sudo apt install wireguard-tools

# 生成密钥对
wg genkey | tee privatekey | wg pubkey > publickey

你会得到一对密钥。私钥你自己留着,公钥给客户端用。

第二步:配置Server端(/etc/wireguard/wg0.conf)

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <Server的私钥>

# 开启IP转发(让下面的客户端之间能互通)
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# 手机客户端
PublicKey = <手机的公钥>
AllowedIPs = 10.0.0.2/32

[Peer]
# 笔记本客户端
PublicKey = <笔记本的公钥>
AllowedIPs = 10.0.0.3/32

第三步:启动WireGuard

sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

第四步:配置手机客户端(以iPhone的WireGuard官方App为例)

App里添加隧道,配置内容:

[Interface]
PrivateKey = <手机私钥>
Address = 10.0.0.2/24
DNS = 192.168.1.1

[Peer]
PublicKey = <Server的公钥>
Endpoint = 你的公网IP:51820
AllowedIPs = 10.0.0.0/24, 192.168.1.0/24
PersistentKeepalive = 25

这里的 AllowedIPs 指定了哪些IP段的流量走VPN。192.168.1.0/24 是家庭内网段,加了这条之后,你在外面连上VPN就能直接访问家里所有设备的192.168.1.x地址。

你会发现:不需要再一个一个去配端口映射了。你连上VPN,输入 192.168.1.100:5000 就能直接进NAS管理页面。手机App连家里的Jellyfin,直接输入内网地址就行。

这就是VPN方案最大的优势——你把自己”放进”了家里的网络。

4.4 踩坑实录

第一个大坑:运营商UDP限流

WireGuard 默认用UDP协议。而国内三大运营商对UDP的态度:

  • 电信:比较友好,基本没问题

  • 联通:还可以,偶有丢包

  • 移动:对UDP非常不友好,很多地区的移动宽带有严重的UDP QoS,甚至直接丢弃UDP包

解决办法:

  • 换端口。不要用默认的51820,换成443(这个端口一般是白名单,不会被QoS)

  • 或者把WireGuard流量伪装成TCP。有 udp2raw 这个工具可以帮你把UDP包封装成TCP,绕过运营商的限制

  • 或者干脆用 Cloudflare Tunnel 方案(走HTTPS/TCP,没有UDP问题)

第二个大坑:NAT类型

如果客户端也在NAT后面(比如手机在4G网络下),就会遇到NAT打洞的问题。

好消息是:WireGuard 的 PersistentKeepalive 参数就是解决这个问题的。它会定时发送心跳包,保持NAT映射不失效。

PersistentKeepalive 调优建议:

# 在家连公司VPN,延迟低,网络稳定
PersistentKeepalive = 25

# 手机在移动网络下,网络波动大
PersistentKeepalive = 15

# 两端都在重度NAT后面(比如移动对移动)
PersistentKeepalive = 10

值设得太小(比如5秒),每分钟发12次心跳,浪费带宽和设备电量。值设得太大(比如60秒),NAT映射可能已经超时被删了。一般 15-25秒 是经验值。

第三个坑:公网IP被运营商收回

这是最让我抓狂的事。用了三年的联通宽带,某天突然发现远程连不上了。一查,公网IP没了,被改成大内网了。

解决思路:

  • 打电话给运营商,说要装监控/NAS,要求恢复公网IP。态度要好,坚持要。大部分情况能要回来

  • 实在要不回来,那就只能用中转方案了。要么上frp(需要VPS),要么上Cloudflare Tunnel(免费但慢),要么上Tailscale/ZeroTier


五、内网穿透方案的全面对比

5.1 frp:老牌经典,但需要一台VPS

frp 的架构是 C/S 模式:

手机/笔记本 ─── 公网VPS(frps) ─── 家里NAS(frpc)

优点:

  • 支持TCP/UDP/HTTP/HTTPS

  • 可以穿透任意TCP应用

  • 有Dashboard管理界面

  • 支持负载均衡

缺点:

  • 必须有一台VPS,这是硬成本

  • VPS的带宽决定了体验

  • 需要维护VPS(系统更新、安全加固)

适合人群: 手里已经有VPS在跑其他服务的人,顺便搭个frp没毛病。

5.2 Cloudflare Tunnel:免费但挑网络

手机/笔记本 ─── Cloudflare边缘节点 ─── 家里的cloudflared客户端

优点:

  • 完全免费

  • 自带HTTPS和WAF防护

  • Zero Trust策略可以加一层邮箱验证/一次性密码

  • 不需要公网IP

缺点:

  • 必须用Cloudflare管理域名

  • 国内访问速度看脸

  • 流媒体体验差(视频经常缓冲)

  • WebSocket应用延迟高

适合人群: 有域名且网络条件允许,主要访问Web页面,不需要看视频。

5.3 ngrok:调试利器,仅此而已

优点: 无需配置,下载即用

缺点: URL随机、限速、免费版40连接/分钟限制

适合人群: 开发调试Webhook、给客户临时演示


六、新选择:Tailscale / ZeroTier(Mesh组网)

前面说的frp、WireGuard都需要公网IP或者VPS来中转。那如果我既没有公网IP,又不想买VPS呢?

Tailscale 和 ZeroTier 就是为这种情况生的。

6.1 Tailscale:零配置的WireGuard

Tailscale 是基于 WireGuard 的二次开发。它做了几件大事:

1. 自动NAT打洞:通过STUN协议,尝试在两端之间建立直接的P2P连接。如果打洞成功了,流量不经过任何服务器,直接点对点传输。打洞失败了才走中继(DERP服务器)

2. 身份认证:用Google/GitHub/Microsoft账号登录,自动管理密钥,你甚至不需要知道公钥私钥是什么

3. Mesh组网:你所有设备都在同一个虚拟网络里,互相可以直接访问

4. 免费版够用:支持最多20台设备

部署步骤(真的只需要三步):

1. 在 tailscale.com 注册账号
2. 在家里的NAS上:curl -fsSL https://tailscale.com/install.sh | sh && tailscale up
3. 在你手机上:App Store搜Tailscale,登录,完事

然后你就可以在手机上用 内网IP:端口 访问家里的任何设备了。

缺点:

  • 国内的连接质量受限于Tailscale的DERP服务器(不在国内)

  • 重度依赖互联网,如果Tailscale服务器挂了,你的客户端之间的连接也会受影响(因为它需要先通过控制平面协商)

6.2 ZeroTier:更灵活的Mesh

ZeroTier 跟 Tailscale 类似,但更偏向企业级。它把虚拟网络叫做”ZeroTier Network”,你可以自定义IP段、路由规则、流控策略。

优点: 自定义能力强、支持桥接模式(可以把虚拟网络和物理网络打通)

缺点: 配置复杂一些、移动端App体验不如Tailscale

6.3 Tailscale vs ZeroTier 怎么选?

我个人的建议很简单:

  • 不想折腾、追求开箱即用 → 选 Tailscale

  • 需要复杂的网络策略、需要桥接物理网络 → 选 ZeroTier

  • 两个都不能用(比如网络环境极其苛刻) → 老老实实买VPS搭WireGuard


七、实际部署建议——对号入座

写了这么多,我知道有人要问了:”大叔你别啰嗦了,直接告诉我该选哪个。”

好,我按你的具体情况给建议:

情况一:你有一台VPS(哪怕是最便宜的)

推荐方案:WireGuard

这是最灵活、性能最好的方案。VPS做跳板,家里NAS做节点,手机在外连。

  • 带宽取决于VPS和家里的上行速度

  • 延迟一般在30-50ms(取决于VPS位置)

  • 可以访问家里所有服务

  • 配置一次,一劳永逸

方案推荐度:⭐⭐⭐⭐⭐

情况二:你没有VPS,不想花钱

推荐方案:Tailscale

零成本、零配置、零维护。App Store下载即用。

  • 速度取决于NAT打洞是否成功。打洞成功≈直连速度,打洞失败走中继会慢

  • 免费版20台设备够用了

  • 适合电脑小白

方案推荐度:⭐⭐⭐⭐

情况三:你有域名且托管在Cloudflare

推荐方案:Cloudflare Tunnel

如果你主要想访问NAS的Web界面、路由器管理后台这种HTTP/HTTPS服务,Cloudflare Tunnel是最安全的选择。

  • 免费的WAF和DDoS防护

  • 配合Zero Trust可以加两步验证

  • 不需要开任何端口

注意: 如果你要用Jellyfin看视频、或者用FTP传大文件,这个方案体验不好。

方案推荐度:⭐⭐⭐⭐

情况四:你需要极致性能(比如远程玩游戏、4K视频串流)

推荐方案:WireGuard 直连(或Tailscale打洞成功后)

只有直连才能满足低延迟高带宽的需求。

  • WireGuard 直连延迟在5-10ms以内

  • 带宽取决于双方的上行速度

  • 用Tailscale的话,只要打洞成功,性能和WireGuard直连没区别

方案推荐度:⭐⭐⭐⭐⭐

情况五:你是小白,只想在外面看NAS里的照片

推荐方案:买成品NAS自带的服务(群晖QuickConnect / 威联通myQNAPcloud)

别折腾了,群晖和威联通都有官方穿透服务,路由器上都不用配任何东西,注册账号就能用。

虽然速度慢点(经官方服务器中转),但胜在省心。

方案推荐度:⭐⭐⭐(省心,但慢)


八、终极对比总结表

| 方案 | 费用 | 公网IP需求 | 性能 | 安全性 | 配置难度 | 适用场景 |

|——|——|———–|——|——–|———|———|

| 端口映射+DDNS | 免费 | 必须 | ⭐⭐⭐⭐⭐ | ⭐ | ⭐⭐ | 不推荐,除非没有其他选择 |

| frp | 需要VPS(≈200元/年) | VPS需要(家里不需要) | ⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐ | 已有VPS的人 |

| Cloudflare Tunnel | 免费 | 不需要 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ | Web服务访问、有域名 |

| ngrok | 免费版有限制 | 不需要 | ⭐⭐ | ⭐⭐ | ⭐ | 临时调试 |

| WireGuard(自建) | 需要VPS或公网IP | 必须(服务端) | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | 追求性能和灵活性 |

| Tailscale | 免费(20台) | 不需要 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐ | 不想折腾的人 |

| ZeroTier | 免费(25台) | 不需要 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | 需要自定义网络 |

| 成品NAS自带服务 | 部分免费 | 不需要 | ⭐⭐ | ⭐⭐⭐ | ⭐ | 只访问NAS、小白首选 |


九、常见问题 FAQ

Q1:WireGuard 掉线后会自动重连吗?

会。WireGuard 有内置的 Keepalive 机制。客户端配置了 PersistentKeepalive 之后,如果连接断开,客户端会持续尝试重连,一旦网络恢复或者你回到了家(连上了家里的WiFi),它就能自动恢复连接。整个过程你不需要任何操作。

Q2:用Tailscale/ZeroTier,家里需要一直开着电脑吗?

不需要。这两个方案都需要在一台”一直在线的设备”上运行客户端。推荐放在:

  • 软路由/OpenWrt路由器上(最理想)

  • NAS上(群晖/威联通/Unraid都有官方或社区版)

  • 树莓派(功耗低,几瓦)

  • 长期在线的Linux小主机

Q3:WireGuard 支持双栈(IPv4 + IPv6)吗?

支持。你可以在配置里同时配 IPv4 和 IPv6 地址:

[Interface]
Address = 10.0.0.1/24, fd00::1/64

如果你的运营商给了IPv6地址,WireGuard 可以优先走IPv6,速度往往比IPv4还好(因为IPv6没有NAT问题)。

Q4:frp 和 WireGuard 能一起用吗?

当然可以。我之前就是这么干的:WireGuard 连不上时自动用 frp 兜底。可以写一个简单的健康检查脚本:

#!/bin/bash
# 每隔60秒检查WireGuard是否在线
ping -c 1 -W 3 10.0.0.1 > /dev/null 2>&1
if [ $? -ne 0 ]; then
# WireGuard挂了,启动frp兜底
systemctl start frpc
else
systemctl stop frpc
fi

Q5:家里用的移动宽带,死活连不上WireGuard怎么办?

三条路:

1. 打电话给移动客服投诉,要求改公网IP(成功率不高,但值得一试)

2. 换方案,上 Tailscale 或 Cloudflare Tunnel

3. 使用 udp2raw + WireGuard 组合,把UDP伪装成TCP流,绕过运营商的UDP QoS


十、一点掏心窝子的话

折腾网络这个东西,说到底是没有银弹的。

我在WireGuard和frp之间反复横跳了好几次,最后家里用的是 WireGuard + Tailscale 双保险

  • WireGuard 是主力方案,速度快、可控性强

  • Tailscale 是备选方案,万一WireGuard因为运营商问题连不上,切到Tailscale保证能远程回家

你说这算不算”既要又要”?算。但一个搞技术的,家里老老小小都指着NAS里的照片、监控、电影,多一手准备总不是坏事。

最后一句话:不管你选哪个方案,先跑起来。 WireGuard配半小时跑不起来?那先上Tailscale,五分钟就能用。等之后有空了再慢慢折腾。别让”最佳方案”变成”什么都没做”。

🔧 如果配置 WireGuard 后带宽跑不满,问题可能不在 WireGuard 本身,而在家庭网络的底层架构。家庭服务器网络性能调优全链路指南 从桥接配置到 DPDK 加速都有详细排查方法。

有问题欢迎在评论区留言。大叔虽然不能保证秒回,但看到了一定会回复。


*本文首发于 IT大叔的工具箱,转载请注明出处。*

类似文章

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注