WireGuard 伪局域网实践:让服务器变成异地设备的中转节点
编写时间:2024-05-16
管理入口后来基本都放在 Cloudflare Application / Zero Trust 后面了,WireGuard 在这里不是为了解决“管理页面不能裸露”的问题。我当时更想要的是一个自己可控的虚拟局域网:几台不在同一地点的设备接进同一个网段,让家里的服务器充当中转节点。
这个用途有点像自建版“局域网联机网络”:可以尝试伪局域网联机游戏,例如《博德之门 3》这类支持局域网发现或直连的游戏;也可以做伪局域网远控,把异地设备当作同一个内网里的机器访问。后来这类远控场景被免费且体验不错的软件覆盖了不少,例如支持高分辨率的远程桌面工具,所以 WireGuard 最后更偏实验和备用方案。
网络模型
采用中心节点模式:家庭服务器作为 WireGuard Server,其他电脑、笔记本、移动设备作为 Peer 接入。
虚拟网段和家庭 LAN 网段要分开:
| 网络 | 示例 | 用途 |
|---|---|---|
| 家庭 LAN | 192.168.10.0/24 | 路由器、服务器、内网设备 |
| WireGuard | 10.10.0.0/24 | 异地设备组成的虚拟局域网 |
如果只是让 Peer 之间互相连通,路由会简单很多;如果还要访问家庭 LAN,再额外打开转发和路由。
Server 配置
安装工具:
sudo dnf install epel-release -y
sudo dnf install wireguard-tools -y生成密钥:
wg genkey | tee server_privatekey | wg pubkey > server_publickey/etc/wireguard/wg0.conf 模板:
[Interface]
Address = 10.10.0.1/24
ListenPort = 51820
PrivateKey = [server-private-key]
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT
[Peer]
PublicKey = [client-a-public-key]
AllowedIPs = 10.10.0.2/32
[Peer]
PublicKey = [client-b-public-key]
AllowedIPs = 10.10.0.3/32如果需要让客户端访问家庭 LAN,再开启 IP 转发:
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf启动:
sudo wg-quick up wg0
sudo systemctl enable wg-quick@wg0
sudo wg showClient 配置
客户端配置的关键是 AllowedIPs。它决定哪些流量走隧道。
[Interface]
Address = 10.10.0.2/24
PrivateKey = [client-private-key]
DNS = 1.1.1.1
[Peer]
PublicKey = [server-public-key]
Endpoint = ddns.example.cn:51820
AllowedIPs = 10.10.0.0/24, 192.168.10.0/24
PersistentKeepalive = 25| AllowedIPs | 行为 |
|---|---|
10.10.0.0/24 | 只访问 WireGuard 虚拟网段,适合伪局域网 |
10.10.0.0/24, 192.168.10.0/24 | 额外访问家庭 LAN |
0.0.0.0/0 | 全部流量走隧道,适合临时安全上网 |
伪局域网联机时,通常只需要路由 10.10.0.0/24,避免影响本机普通上网。
端口和 NAT
如果服务器在家庭内网,需要软路由把 UDP 端口转发到服务器:
公网 UDP 51820 -> 服务器 LAN IP UDP 51820如果没有公网 IP,可以把 WireGuard Server 放在云服务器或固定 IP 机器上,再让家庭服务器作为 Peer 主动连出去。
新增设备流程
每新增一台设备,只做三件事:
- 客户端生成密钥对;
- 为客户端分配一个新的虚拟 IP;
- 服务器追加一个
[Peer]。
服务器追加模板:
[Peer]
PublicKey = [new-client-public-key]
AllowedIPs = 10.10.0.X/32重载配置:
sudo wg-quick down wg0
sudo wg-quick up wg0验证与排障
sudo wg show
ping 10.10.0.1
ping 10.10.0.2
ping 192.168.10.1| 现象 | 排查 |
|---|---|
latest handshake 为空 | Endpoint、端口转发、防火墙 |
| 能握手但不能访问家庭 LAN | IP 转发、AllowedIPs、路由规则 |
| Peer 之间不能互通 | 服务器转发规则、客户端防火墙 |
| 移动网络下断连 | PersistentKeepalive = 25 |
| 一台设备能连另一台不能 | 客户端虚拟 IP 是否重复 |
使用边界
WireGuard 适合做可控的虚拟局域网,尤其是想让几台异地设备通过同一个中转节点互相访问时。它不承担这套服务器的管理后台防护主职责;管理面板、SSH Web、路由器后台这些入口,还是放在 Cloudflare Zero Trust 这类访问控制后面更省心。
如果只是远程桌面,现在也有不少免费且体验很好的工具,WireGuard 不一定是最省事的方案。它的价值在于可控、透明、通用,适合当作网络实验和备用通道。