WireGuard 家庭网络互联网访问方案

1,024 阅读6分钟

概述

WireGuard 可以方便的搭建 VPN,借助固定/动态公网 IP,能快速组网实现访问家中的资源,或将家中的服务通过反代服务器暴露在公网。另外,组网过程可以完全基于 NAT 打洞而不需要任何公网 IP,但不稳定。

安装 WireGuard

Debian

apt install wireguard

macOS

brew install wireguard-tools

组网方案

Untitled.png

网段分配

家庭内网:10.0.0.1/21

  • 家中的“中继节点”:10.0.1.104(网卡:ens18

WireGuard 网段:192.168.2.1/24

  • 公网服务器:192.168.2.1
  • 家中的“中继节点”:192.168.2.2
  • 客户端:192.168.2.3 ~ 192.168.2.254

以上仅为本例中的网段分配,并不是必须如此安排。

补充说明

此方案中,家用宽带提供了动态公网 IP,但封禁了 80 和 443 端口。

通过路由器的“端口转发”功能,将“中继节点”的 51820 UDP 端口暴露于公网。

同时借助 DDNS,使得客户端能以域名的方式较为稳定的连接到“中继节点”。

整个 WireGuard 网络呈现星型拓扑结构,家中的“中继节点”为中心节点。

客户端、公网服务器的目标是访问家中的服务,两两之间不互通。

“公网服务器”在本质上亦是“客户端”,只是在此基础上:

  • 借助 Nginx 对家中的指定服务进行反代,对外提供 http 服务;
  • WireGuard 不能自动处理 DDNS 的解析变化,需要手动重启服务以更新对应 DDNS 域名的最新 IP,而公网服务器具有稳定的公网 IP,因此采用“中继节点”访问“公网服务器的”的方向来展开 WireGuard 连接,而不是像客户端那样访问“中继节点”。

由于“公网服务器”的网络带宽有限,因此客户端采用直连“中继节点”的方式以获取更大的带宽,即家用宽带的上行带宽。

若家用宽带不提供动态公网 IP,此时网络仍呈现星型拓扑结构,但中心节点为“公网服务器”,其需要进行合适的“转发”配置,以确保其他客户端能正确的通过“公网服务器”的中继访问到家中的各服务。

常用命令

生成密钥对

在安装有 wireguard 的服务器上执行:

umask 077
wg genkey > privatekey
echo "Private Key: " && cat privatekey
wg pubkey < privatekey > publickey
echo "Public Key: " && cat publickey
rm privatekey publickey

执行上述命令后,公钥和私钥会在控制台打印,并将对应的密钥文件删除。删除密钥文件是由于密钥的文本将以“内容”的形式直接填写于配置文件中,不会使用到密钥文件。

WireGuard 启停和信息查看

# 启动 WireGuard
wg-quick up wg0
# 停止 WireGuard
wg-quick down wg0
# 打印 WireGuard 配置
wg-quick strip wg0
# 查看 WireGuard 信息和 Peer 连接情况
wg
# 在不中断 WireGuard 连接的同时重新加载配置文件
wg syncconf wg0 <(wg-quick strip wg0)
# 以服务的方式启动 WireGuard
systemctl enable wg-quick@wg0 --now
# 以服务启动的情况下,在不中断 WireGuard 连接的同时重新加载配置文件
systemctl reload wg-quick@wg0

查看路由情况

ip route list table main

通常在中继节点上执行,用于获取网卡名称。如果命令未找到,可通过 apt install net-tools 安装。

配置步骤

生成密钥对

参考常用命令,为每个节点生成独立的一组密钥对。

可以在任意在安装有 wireguard 的服务器上一并执行,不需要在对应的服务器上分别操作。

配置公网服务器

编辑 WireGuard 配置文件 /etc/wireguard/wg0.conf

[Interface]
PrivateKey = <公网服务器私钥>
Address = <公网服务器 WG IP>/24
ListenPort = 51820

[Peer]
PublicKey = <中继节点公钥>
AllowedIps = <中继节点 WG IP>/32, <内网局域网网段>

注意,所有配置文件应使用 700 权限以确保其安全性,可以在编写之前使用 umask 077 命令进行遮盖,下同。

公网服务器防火墙/安全组还需开通 51820 UDP 端口的入权限。

配置中继节点

编辑 WireGuard 配置文件 /etc/wireguard/wg0.conf

[Interface]
PrivateKey = <中继节点私钥>
Address = <中继节点 WG IP>/24
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT
PostUp = iptables -A FORWARD -o wg0 -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o <网卡名> -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT
PostDown = iptables -D FORWARD -o wg0 -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o <网卡名> -j MASQUERADE

[Peer]
PublicKey = <公网服务器公钥>
Endpoint = <公网服务器公网 IP>:51820
AllowedIPs = <公网服务器 WG IP>/32
PersistentKeepalive = 25

# 若有多个客户端,逐个进行配置
[Peer]
PublicKey = <客户端公钥>
AllowedIPs = <客户端 WG IP>/32

其中 PostUp 配置通过 iptables 设置允许 wg0 网卡的出入流量,并将其经 NAT 后经由其网卡进行转发。对应的 PostDown 配置则是在停止 WireGuard 服务时将对应的 iptables 设置删除。

中继节点上还需要开启 IP 转发:

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf

配置客户端

客户端为 macOS,编辑 WireGuard 配置文件 /usr/local/etc/wireguard/wg0.conf

[Interface]
Address = <客户端 WG IP>/24
PrivateKey = <客户端私钥>

[Peer]
PublicKey = <中继节点公钥>
Endpoint = <家庭网络 DDNS 域名>:51820
AllowedIps = <中继节点 WG IP>/32, <内网局域网网段>
PersistentKeepalive = 25

注意:macOS 执行 wg-quick 和 wg 相关命令需要管理员权限。

针对 AllowedIPs 的理解

在 Peer 中配置的 AllowedIPs,用于标注将“针对对应的 IP 或网段的请求”转发至该 Peer,以及允许来自对应的 IP 或网段的请求。

如果配置的是网段而非具体的 IP 地址,说明对应的 Peer 将会起到中继的作用,应该进行“中继/转发”的相关配置,否则请求不能正确到达。

在本例中由于客户端和公网服务器无需互访,配置的 AllowedIps 是 <中继节点 WG IP>/32

如果客户端和公网服务器需要互访(借助中继节点转发),则两者配置文件中的 AllowedIPs 均需要调整为 WG 网段或逐个显式标注,缺一不可。中继节点由于已经配置了中继/转发,无需调整配置。

如果客户端和公网服务器需要直接互访,在两者的配置中增加对方作为 Peer 即可。

参考