WireGuard 伪局域网实践:让服务器变成异地设备的中转节点

2024 年 5 月 16 日 星期四
/ , , , ,
5
摘要
WireGuard 在这里不是管理入口方案,而是把服务器作为中转节点,自建一个虚拟局域网。用于异地设备互通、伪局域网联机游戏和远控实验,包含 Server/Client 配置、AllowedIPs、NAT 和排障记录。

阅读此文章之前,你可能需要首先阅读以下的文章才能更好的理解上下文。

WireGuard 伪局域网实践:让服务器变成异地设备的中转节点

编写时间:2024-05-16

管理入口后来基本都放在 Cloudflare Application / Zero Trust 后面了,WireGuard 在这里不是为了解决“管理页面不能裸露”的问题。我当时更想要的是一个自己可控的虚拟局域网:几台不在同一地点的设备接进同一个网段,让家里的服务器充当中转节点。

这个用途有点像自建版“局域网联机网络”:可以尝试伪局域网联机游戏,例如《博德之门 3》这类支持局域网发现或直连的游戏;也可以做伪局域网远控,把异地设备当作同一个内网里的机器访问。后来这类远控场景被免费且体验不错的软件覆盖了不少,例如支持高分辨率的远程桌面工具,所以 WireGuard 最后更偏实验和备用方案。

网络模型

采用中心节点模式:家庭服务器作为 WireGuard Server,其他电脑、笔记本、移动设备作为 Peer 接入。

虚拟网段和家庭 LAN 网段要分开:

网络示例用途
家庭 LAN192.168.10.0/24路由器、服务器、内网设备
WireGuard10.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 show

Client 配置

客户端配置的关键是 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 主动连出去。

新增设备流程

每新增一台设备,只做三件事:

  1. 客户端生成密钥对;
  2. 为客户端分配一个新的虚拟 IP;
  3. 服务器追加一个 [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、端口转发、防火墙
能握手但不能访问家庭 LANIP 转发、AllowedIPs、路由规则
Peer 之间不能互通服务器转发规则、客户端防火墙
移动网络下断连PersistentKeepalive = 25
一台设备能连另一台不能客户端虚拟 IP 是否重复

使用边界

WireGuard 适合做可控的虚拟局域网,尤其是想让几台异地设备通过同一个中转节点互相访问时。它不承担这套服务器的管理后台防护主职责;管理面板、SSH Web、路由器后台这些入口,还是放在 Cloudflare Zero Trust 这类访问控制后面更省心。

如果只是远程桌面,现在也有不少免费且体验很好的工具,WireGuard 不一定是最省事的方案。它的价值在于可控、透明、通用,适合当作网络实验和备用通道。

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...