
你在外面连不上家里的 NAS,多半不是网速问题
出差时想取一份存在家里硬盘上的文件,结果发现:没有公网 IP,端口映射做不了,运营商把入站连接全挡在外面。于是有人开始用网盘中转,有人开了各种“内网穿透”服务,把家里的入口交给了第三方。
其实这类需求有个更干净的解法:让设备之间自己组一个虚拟内网。本文用 WireGuard 做一遍完整流程,三台设备(一台云服务器、一台笔记本、一部手机),所有命令可复制,配置可复现。
1. 先明确拓扑,再动手
本文采用的拓扑是“一台有公网 IP 的服务器做中转节点”,其余设备都连它。这样家里不需要公网 IP,也不需要动路由器端口映射。
- 云服务器:公网 IP,UDP 51820 放行,作为 WireGuard 服务端,虚拟地址 10.8.0.1
- 笔记本:虚拟地址 10.8.0.2
- 手机:虚拟地址 10.8.0.3
- 家庭内网网段:192.168.1.0/24,通过笔记本所在的网络访问
如果你的目标只是“让手机访问家里的 NAS”,也可以把服务端直接放在家里的树莓派或 NAS 上,只要能解决公网可达性即可。拓扑变了,配置逻辑不变。
2. 工具清单与前置条件
| 项目 | 要求 | 说明 |
|---|---|---|
| 系统 | Linux 内核 5.6 以上 | 内核已内置 WireGuard,无需装 DKMS 模块 |
| 软件 | wireguard-tools | 提供 wg、wg-quick 命令 |
| 端口 | UDP 51820 | 云厂商安全组与系统防火墙都要放行 |
| 权限 | root 或 sudo | 需要改 sysctl 与防火墙规则 |
Debian / Ubuntu 上一条命令装完:
apt update && apt install -y wireguard-tools
3. 生成密钥对
WireGuard 用公钥认证,每台设备一对密钥,私钥绝不外传。在服务器上执行:
umask 077
wg genkey | tee server.key | wg pubkey > server.pub
cat server.key server.pub
客户端同理,把文件名换成 client1、client2 即可。私钥文件权限必须是 600,wg-quick 会拒绝加载权限过宽的私钥,报错信息不太直观,容易被误判成配置语法错误。
4. 服务端配置
写入 /etc/wireguard/wg0.conf:
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <server.key 的内容>
PostUp = sysctl -w net.ipv4.ip_forward=1; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = <client1.pub 的内容>
AllowedIPs = 10.8.0.2/32
三个要点:eth0 要换成你服务器真实的网卡名(用 ip route 查默认路由对应的接口);AllowedIPs 在服务端写 /32,表示这个公钥只允许使用这一个地址;PostUp 里的转发规则是让客户端能出公网,不做 NAT 就只能互通、不能上网。
5. 客户端配置
笔记本的配置文件长这样:
[Interface]
PrivateKey = <client1.key 的内容>
Address = 10.8.0.2/32
DNS = 10.8.0.1
[Peer]
PublicKey = <server.pub 的内容>
Endpoint = your-server-ip:51820
AllowedIPs = 10.8.0.0/24, 192.168.1.0/24
PersistentKeepalive = 25
AllowedIPs 决定了哪些流量走隧道,这是最容易配错的一项。上面这份配置只把虚拟网段和家庭网段导进隧道,其余流量照常走本地网络,属于“分流模式”。如果想全局代理,把它改成 0.0.0.0/0。
手机端更简单:装官方 App,扫码或导入配置文件即可,不需要命令行。
6. 启动与验证
systemctl enable --now wg-quick@wg0
wg show
ping -c 3 10.8.0.2
wg show 的输出里,latest handshake 有时间戳、transfer 有收发字节数,才说明隧道真的通了。如果 handshake 一直是空的,先查 UDP 端口是否被安全组挡住,再看 Endpoint 是否写错。
7. 五个真实踩过的坑
第一个:MTU。默认 1420 在部分移动网络下会“能 ping 通但网页打不开”,表现极像 DNS 故障。把客户端 MTU 改成 1280 通常能解决。
第二个:DNS。服务端没有跑 DNS,客户端却写了 DNS = 10.8.0.1,结果全部域名解析失败。要么去掉这行,要么真的部署一个解析服务。
第三个:内核转发没开。只在 PostUp 里临时开,重启后可能失效。建议写进 /etc/sysctl.d/99-wireguard.conf 持久化。
第四个:AllowedIPs 重叠。同一网段被两条 Peer 声明,后加载的会覆盖先加载的,症状是“某些设备时通时不通”。
第五个:忘了 reload。改完配置不执行 wg-quick down/up,规则不会生效,人却以为改错了方向,越改越乱。
写在最后
WireGuard 的配置量比 OpenVPN 小一个数量级,代价是它只负责加密和路由,不负责发地址、不负责推 DNS。地址要自己规划,密钥要自己管,出问题要靠 wg show 和 tcpdump 自己看。
这种“把复杂度交还给使用者”的设计,恰好适合家庭场景:设备数量固定,拓扑一年不变,一次配好能跑很久。如果你需要频繁增减成员、集中审计,那还是选带管理面板的方案更省事。
你的家庭内网是怎么连的?有没有被 MTU 坑过一次?

评论 (0)