为什么要折腾 WireGuard
如果你有以下需求:在外用手机安全访问家里的 NAS、让家人共用一台软路由的科学上网出口、给远方的朋友提供内网穿透服务,WireGuard 是目前最轻量、最高效的解决方案。
与 OpenVPN 相比,WireGuard 代码量不到 4000 行(OpenVPN 超过 10 万行),内核态运行,延迟和吞吐都明显更好。与 Tailscale、ZeroTier 等商业方案相比,WireGuard 完全自建,数据不经过第三方服务器。本文以实际部署为例,从零搭建一套家庭私有网络。
网络拓扑设计
假设你家的网络结构如下:
- 一台软路由(或 Linux 小主机)作为 WireGuard 服务端,运行在家庭内网,IP 为 192.168.1.1
- 软路由已配置 DDNS(域名 wg.example.com 指向家里的公网 IP)
- 需要接入的设备:一部手机、一台出差用的笔记本、一台放在父母家的树莓派
规划的子网:WireGuard 虚拟网络使用 10.0.0.0/24,服务端地址 10.0.0.1。
第一步:服务端安装与配置
以 Ubuntu 24.04 为例,WireGuard 已内置在内核中:
apt install wireguard
生成服务端密钥对:
wg genkey | tee server_private.key | wg pubkey > server_public.key
创建配置文件 /etc/wireguard/wg0.conf:
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = (服务端私钥)# 开启转发,允许客户端互访
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
注意 PostUp/PostDown 中的 eth0 要替换为你的实际外网接口名(用 ip a 查看)。然后启用 IP 转发:
echo “net.ipv4.ip_forward = 1” >> /etc/sysctl.conf
sysctl -p
启动 WireGuard:
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
第二步:添加客户端
每个客户端需要自己的密钥对。以手机为例,在服务端为其生成配置:
wg genkey | tee phone_private.key | wg pubkey > phone_public.key
在服务端的 wg0.conf 中添加 Peer(每个客户端一个 Peer):
[Peer]
# 手机
PublicKey = (手机公钥)
AllowedIPs = 10.0.0.2/32
手机端的配置:
[Interface]
PrivateKey = (手机私钥)
Address = 10.0.0.2/24
DNS = 10.0.0.1[Peer]
PublicKey = (服务端公钥)
Endpoint = wg.example.com:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
AllowedIPs = 0.0.0.0/0 表示手机的所有流量都走 WireGuard(即通过家里的网络上网)。如果只想访问内网,改为 192.168.1.0/24, 10.0.0.0/24。
第三步:进阶玩法
多站点互联: 假设父母家的树莓派(10.0.0.3)需要访问你家内网的 NAS,只需在服务端 Peer 的 AllowedIPs 中添加父母家的子网。然后在树莓派上做类似的 iptables NAT 转发。两个家庭网络就通过 WireGuard 隧道打通了。
分流策略: 不想让所有流量都走 WireGuard?用 wg-quick 的 Table 参数配合策略路由,可以精确控制哪些目的地走隧道。比如只让 Netflix 和 YouTube 的流量出国,其他走本地。
用 wg-easy 简化管理: 如果觉得手动管理密钥麻烦,推荐 wg-easy 这个 Docker 项目。它提供了 Web UI 来添加 / 删除 Peer,还能直接生成二维码供手机扫描。一条 docker run 命令即可启动:
docker run -d –name wg-easy -e WG_HOST=wg.example.com -e PASSWORD= 你的管理密码 -v ~/.wg-easy:/etc/wireguard -p 51820:51820/udp -p 51821:51821/tcp –cap-add NET_ADMIN –cap-add SYS_MODULE –restart unless-stopped ghcr.io/wg-easy/wg-easy
小结
WireGuard 的精髓是 ” 简单 ”。配置一个 Peer 只需四行,没有复杂的证书体系,没有 CA、CRL 这些东西。对于个人和小团队场景,它几乎是最优解。如果你已经在用 Tailscale,不妨试试自建,把数据控制权拿回来。