WireGuard 实现简洁,性能、安全性高,最近用 WireGuard 组建了一个 full mesh 的网络, 故记录之,以备忘也。
安装
如果内核版本不低于 5.6 ,那么 WireGuard 已经集成到了内核,只需安装其配置工具 wireguard-tools
即可;
若内核版本低于5.6,建议安装用户空间的实现 boringtun
一个 boringtun 的 systemd service 文件:
[Unit]
with boringtun
wireguard .target
network.target
network
[Service]
oneshot
yes
WG_QUICK_USERSPACE_IMPLEMENTATION=boringtun WG_SUDO=1
/usr/bin/wg-quick up wg0
/usr/bin/wg-quick down wg0
/bin/bash -c 'exec /usr/bin/wg syncconf wg0 <(exec /usr/bin/wg-quick strip wg0)'
WG_ENDPOINT_RESOLUTION_RETRIES=infinity
[Install]
-user.target
multi
配置
现在有3台机器,如下表:
序号 | 名称 | 网络情况 | WireGuard使用的IP |
---|---|---|---|
1 | home | 中国移动宽带,NAT 后面,无公网IP | 172.16.0.3 |
2 | office | 中国电信宽带,NAT 后面,无公网IP | 172.16.0.2 |
3 | vps | 国外网络,有公网IP(1.2.3.4) | 172.16.0.1 |
要实现两两互联,有如下配置:
home
:
[Interface]
<...>
[Peer]
<...>
[Peer]
<...>
,
25
office
:
[Interface]
<...>
[Peer]
<...>
[Peer]
<...>
25
vps
:
[Interface]
51820
<...>
MTU = 1300
[Peer]
<...>
25
[Peer]
<...>
25
公钥/私钥生成:
| |
执行 wg-quick up wg0
即可使配置生效。
当然,配置文件里不用添加任何 Peer
,wg-quick up wg0
也会执行成功,可以通过 wg set ...
动态去添加。
WireGuard 默认是静默模式,配置生效后,连接并没有建立,在发送数据时才会完成握手,建立连接;
而添加 PersistentKeepalive
选项的原因也在于此,在一个时间间隔内发一个心跳数据,防止 NAT
建立的映射因一段时间内没有数据传输而收回。
在 vps
上 执行 wg show
,可以看到 WireGuard 工作状态。
然后,在 home
或 office
上执行 ping 172.16.0.1
,可以看到网络是连通的,
再在 vps
上 执行 wg show
,会看到 peer
已更新,多了 endpoint
等几项,
分别记下 home
peer 及 office
peer 的 endpoint,
并在 home
和 vps
执行 wg set wg0 peer <...> endpoint <...>
命令更新对应的 endpoint,
比如在 home
上执行时, wg set ...
这里的 endpoint
对应的就是 office
的。
在 home
上执行 ping 172.16.0.2
,会看到 home
到 office
机器的网络已直连成功。
此时,执行 ping 192.168.100.1
,网络不通,在 office
上执行如下命令,开启IP转发:
但是最好在 office
的配置中加入如下选项,在 WireGuard 配置更新时一并生效:
总结
- 若要和某个
Peer
直连,必要条件是添加该Peer
的配置 - 某个
Peer
的Endpoint
有变更时,需要更新所有配置了该Peer
的配置
网上现有的一些工具,比如 netmaker , tailscale 等 ,提供了友好UI界面,方便管理网络,并实现了一个 “控制面(control plane)”,在配置变更时,及时地对受影响的 peer 的配置进行更新。