方永、南天紫雲

道亦有道

WireGuard使用记录
2022年03月27日

WireGuard 实现简洁,性能、安全性高,最近用 WireGuard 组建了一个 full mesh 的网络, 故记录之,以备忘也。

安装

如果内核版本不低于 5.6 ,那么 WireGuard 已经集成到了内核,只需安装其配置工具 wireguard-tools即可; 若内核版本低于5.6,建议安装用户空间的实现 boringtun 一个 boringtun 的 systemd service 文件:

  [Unit]
  Description=wireguard with boringtun
  After=network.target
  Wants=network.target

  [Service]
  Type=oneshot
  RemainAfterExit=yes
  Environment=WG_QUICK_USERSPACE_IMPLEMENTATION=boringtun WG_SUDO=1
  ExecStart=/usr/bin/wg-quick up wg0
  ExecStop=/usr/bin/wg-quick down wg0
  ExecReload=/bin/bash -c 'exec /usr/bin/wg syncconf wg0 <(exec /usr/bin/wg-quick strip wg0)'
  Environment=WG_ENDPOINT_RESOLUTION_RETRIES=infinity

  [Install]
  WantedBy=multi-user.target

配置

现在有3台机器,如下表:

序号名称网络情况WireGuard使用的IP
1home中国移动宽带,NAT 后面,无公网IP172.16.0.3
2office中国电信宽带,NAT 后面,无公网IP172.16.0.2
3vps国外网络,有公网IP(1.2.3.4)172.16.0.1

要实现两两互联,有如下配置:

home:

[Interface]
PrivateKey = <...>
Address = 172.16.0.3/24


# vps
[Peer]
PublicKey = <...>
Endpoint = 1.2.3.4:51820
AllowedIPs = 172.16.0.1/32

# office
[Peer]
PublicKey = <...>
# 192.168.100.0/24,该网段是 office 所在机器的内网网段,添加的目的是允许 home 访问该网段
AllowedIPs = 172.16.0.2/32,192.168.100.0/24
PersistentKeepalive = 25

office:

[Interface]
PrivateKey = <...>
Address = 172.16.0.2/24

# vps
[Peer]
PublicKey = <...>
Endpoint = 1.2.3.4:51820
AllowedIPs = 172.16.0.1/32

# home
[Peer]
PublicKey = <...>
AllowedIPs = 172.16.0.3/32
PersistentKeepalive = 25

vps:

[Interface]
Address = 172.16.0.1/24
# 可选
ListenPort = 51820
PrivateKey = <...>
# 可选,默认不用配置
MTU = 1300

# office
[Peer]
PublicKey = <...>
AllowedIPs = 172.29.254.2/32
PersistentKeepalive = 25

# home
[Peer]
PublicKey = <...>
AllowedIPs = 172.29.254.3/32
PersistentKeepalive = 25

公钥/私钥生成:

wg genkey | tee privatekey | wg pubkey > publickey

执行 wg-quick up wg0 即可使配置生效。

当然,配置文件里不用添加任何 Peerwg-quick up wg0 也会执行成功,可以通过 wg set ... 动态去添加。

WireGuard 默认是静默模式,配置生效后,连接并没有建立,在发送数据时才会完成握手,建立连接; 而添加 PersistentKeepalive 选项的原因也在于此,在一个时间间隔内发一个心跳数据,防止 NAT 建立的映射因一段时间内没有数据传输而收回。

vps 上 执行 wg show,可以看到 WireGuard 工作状态。

然后,在 homeoffice 上执行 ping 172.16.0.1,可以看到网络是连通的, 再在 vps 上 执行 wg show,会看到 peer 已更新,多了 endpoint 等几项, 分别记下 home peer 及 office peer 的 endpoint, 并在 homevps 执行 wg set wg0 peer <...> endpoint <...> 命令更新对应的 endpoint, 比如在 home 上执行时, wg set ... 这里的 endpoint 对应的就是 office 的。

home 上执行 ping 172.16.0.2,会看到 homeoffice 机器的网络已直连成功。 此时,执行 ping 192.168.100.1,网络不通,在 office 上执行如下命令,开启IP转发:

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

但是最好在 office的配置中加入如下选项,在 WireGuard 配置更新时一并生效:

[Interface]
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

总结

  1. 若要和某个 Peer 直连,必要条件是添加该 Peer 的配置
  2. 某个 PeerEndpoint 有变更时,需要更新所有配置了该 Peer 的配置

网上现有的一些工具,比如 netmaker , tailscale 等 ,提供了友好UI界面,方便管理网络,并实现了一个 “控制面(control plane)”,在配置变更时,及时地对受影响的 peer 的配置进行更新。