Docker/linux/斐讯设备/系统运维

使用wireguard搭建实现异地组网并使用 wg-gen-web 来管理 WireGuard 的配置

daimafengzi · 11月29日 · 2024年 · · · · · · · · · · · · 本文共5940个字 · 预计阅读20分钟19次已读

使用wireguard搭建实现异地组网并使用 wg-gen-web 来管理 WireGuard 的配置
内容有点长,让我缕缕

前言

说起异地组网,之前一直在使用zerotier-planet进行搭建,使用了一段时间也挺稳定,唯一的不足就是ios平台由于系统限制没办法修改planet文件,也就没法进行组网。
网上找了一圈,看到很早就有人在官方论坛里面提过这个需求,但是官方似乎对此兴趣好像不大,没办法只能研究其他组网方式,找了一圈后最后确定下来使用wireguard搭建中继服务器进行组网,wireguard的各平台支持也都比较齐全,其功能也都满足我的需求,在此记录下组网过程。

画个图

使用wireguard搭建实现异地组网并使用 wg-gen-web 来管理 WireGuard 的配置

安装wireguard

#Ubuntu22
apt install -y wireguard
#Centos
yum install -y wireguard
#armbian
yum install -y wireguard
#KylinV10
yum install -y wireguard

# 添加下面的配置到 /etc/sysctl.conf 后执行 sysctl -p 生效
net.ipv4.ip_forward = 1

一键命令,一次性搞定。

wg-gen-web 配置

wg-gen-web 仓库
对于新手来说,如何才能快速把 WireGuard 用起来呢?当然是通过图形管理界面啦,填几个参数,生成个二维码,再拿客户端扫下二维码就连上了,简直是比爽姐还爽~
wg-gen-web 就是这样一款图形管理界面,主要包含以下这些功能:

  • 根据 CIDR 自动分配 IP 地址给客户端;
  • 每个客户端会生成 QR 二维码,方便移动客户端扫描使用;
  • 支持通过邮件发送二维码和配置文件;
  • 支持启用和禁用某个客户端;
  • 支持 IPv6;
  • 支持使用 GitHub 和 Oauth2 OIDC 来进行用户认证;
  • 颜值还比较高。

使用wireguard搭建实现异地组网并使用 wg-gen-web 来管理 WireGuard 的配置
wg-gen-web 支持直接通过容器来运行,如果你是在本地运行,可以准备一份 docker-compose 文件:

version: '3.6'
services:
  wg-gen-web:
    image: vx3r/wg-gen-web:latest
    container_name: wg-gen-web
    restart: always
    expose:
      - "8080/tcp"
    ports:
      - 80:8080
    environment:
      - WG_CONF_DIR=/data
      - WG_INTERFACE_NAME=wg0.conf
      - OAUTH2_PROVIDER_NAME=fake
      - WG_STATS_API=http://:8182
    volumes:
      - /etc/wireguard:/data
    network_mode: bridge
  wg-json-api:
    image: james/wg-api:latest
    container_name: wg-json-api
    restart: always
    cap_add:
      - NET_ADMIN
    network_mode: "host"
    command: wg-api --device wg0 --listen :8182

我习惯于用docker命令来安装:

docker run --rm -it -v /tmp/wireguard:/data -p 8080:8080 -e "WG_CONF_DIR=/data" vx3r/wg-gen-web:latest

这里还用到了另外一个项目 wg-api,该项目提供了一个 JSON-RPC 接口,用来暴露 WireGuard 的网络状态信息。其中 可以直接替换成 docker0 的 IP。
执行以下命令运行 wg-gen-web:

docker-compose up -d

在浏览器中输入 URL 打开图形管理界面,点击 “SERVER” 开始填写服务端和客户端的配置信息:
使用wireguard搭建实现异地组网并使用 wg-gen-web 来管理 WireGuard 的配置
使用wireguard搭建实现异地组网并使用 wg-gen-web 来管理 WireGuard 的配置
使用wireguard搭建实现异地组网并使用 wg-gen-web 来管理 WireGuard 的配置
这里的 PostUpPostDown我只有如下设置的时候才行,不知道是不是我的内网原因。各位看着弄

#PostUp
iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
#PostDown
iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

填写好配置信息后,直接点击 UPDATE SERVER CONFIGURATION 保存,同时会生成配置文件 wg0.conf:

 cat /etc/wireguard/wg0.conf
# Updated: 2021-01-20 03:59:37.718655459 +0000 UTC / Created: 2021-01-20 03:32:28.045982181 +0000 UTC
[Interface]
Address = 10.6.6.1/24
ListenPort = 51820
PrivateKey = iLPeSYaKYERfyrOX/YcAam4AIIHCNEBXnqL2oRedAWQ=

PreUp = echo WireGuard PreUp
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PreDown = echo WireGuard PreDown
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

注意: 这里如果需要多个内网网段,记得都填写下去


接下来点击 CLIENTS,然后点击 ADD NEW CLIENT 开始新增客户端配置:
使用wireguard搭建实现异地组网并使用 wg-gen-web 来管理 WireGuard 的配置
填写客户端配置信息:
使用wireguard搭建实现异地组网并使用 wg-gen-web 来管理 WireGuard 的配置
点击 SUBMIT,就会在 /etc/wireguard 目录下生成客户端的 json 配置文件:

cat /etc/wireguard/f5fcc1e7-e03a-48bb-acd9-8d5214c6cb1f
{
  "id": "f5fcc1e7-e03a-48bb-acd9-8d5214c6cb1f",
  "name": "test",
  "email": "yangchuansheng33@gmail.com",
  "enable": true,
  "ignorePersistentKeepalive": false,
  "presharedKey": "8QkkeXGt4D/lnLDA1jfJUhB3oiShhRWp/GC8GFQtgKs=",
  "allowedIPs": [
    "10.6.6.0/24"
  ],
  "address": [
    "10.6.6.2/32"
  ],
  "tags": [],
  "privateKey": "ODN2xN12p5lwcEuj20C4uZV9kJE9yHz4eAHB/4czPEM=",
  "publicKey": "k2Ut15aQn7+mNHqEd4bwdNx3WcvA4F7SPmETYuWdSjM=",
  "createdBy": "Unknown",
  "updatedBy": "",
  "created": "2021-01-20T05:19:16.659225991Z",
  "updated": "2021-01-20T05:19:16.659225991Z"
}

如果勾选了 “Enable client after creation”,还会将 peer 的配置加入 wg0.conf:

cat /etc/wireguard/wg0.conf
# Updated: 2021-01-20 03:59:37.718655459 +0000 UTC / Created: 2021-01-20 03:32:28.045982181 +0000 UTC
[Interface]
Address = 10.6.6.1/24
ListenPort = 51820
PrivateKey = iLPeSYaKYERfyrOX/YcAam4AIIHCNEBXnqL2oRedAWQ=

PreUp = echo WireGuard PreUp
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PreDown = echo WireGuard PreDown
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# test / yangchuansheng33@gmail.com / Updated: 2021-01-20 05:19:16.659225991 +0000 UTC / Created: 2021-01-20 05:19:16.659225991 +0000 UTC
[Peer]
PublicKey = k2Ut15aQn7+mNHqEd4bwdNx3WcvA4F7SPmETYuWdSjM=
PresharedKey = 8QkkeXGt4D/lnLDA1jfJUhB3oiShhRWp/GC8GFQtgKs=
AllowedIPs = 10.6.6.2/32

最后直接启动 wg-quick 服务就行了:

systemctl start wg-quick@wg0

如果你之前已经启动过该服务,现在只需要重启就行了:

systemctl restart wg-quick@wg0

每次更新配置后都要手动 reload 还是很麻烦的,我们可以通过 systemd 来监听配置文件的实时变化,一但配置文件有所改动,就立即触发 reload。方法也很简单,先创建一个 wg-gen-web.service 用来 reload:

# /etc/systemd/system/wg-gen-web.service
[Unit]
Description=Restart WireGuard
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl reload wg-quick@wg0.service

[Install]
WantedBy=multi-user.target

然后再创建一个同名的 wg-gen-web.path 用来监听文件变化:

# /etc/systemd/system/wg-gen-web.path
[Unit]
Description=Watch /etc/wireguard for changes

[Path]
PathModified=/etc/wireguard

[Install]
WantedBy=multi-user.target

设置开机自启

systemctl enable wg-gen-web.service wg-gen-web.path --now

后面如果再到 Web 页面上更新配置信息,会立即触发 reload,不需要再自己手动 reload 了。
查看接口信息:

wg show wg0
interface: wg0
  public key: dG5xPA7Q6X7ByeNl5pasI/8ZPhiTOsfsy0NUX4w2wmI=
  private key: (hidden)
  listening port: 51820

peer: k2Ut15aQn7+mNHqEd4bwdNx3WcvA4F7SPmETYuWdSjM=
  preshared key: (hidden)
  allowed ips: 10.6.6.2/32

客户端建立连接

Linux客户端

# 安装wireguard
apt install -y wireguard
# 添加下面的配置到 /etc/sysctl.conf 后执行 sysctl -p 生效
net.ipv4.ip_forward = 1

将上面服务器添加的客户端配置文件下载后 存放到 /etc/wireguard/并执行启动程序

systemctl reload wg-quick@wg0

启动后ping一下上面设置的局域网内网连接,如果通了,则组网成功!

一些优化

有时外网IP变化了,wg服务并未报错,但是也没有重连到中继服务器上,造成机器离线,这里新增一个watchdog服务进行连接保活监控

# 新建watchdog服务
vim /lib/systemd/system/wg-watchdog.service
# 添加下面代码到service中
[Unit]
Description=Wireguard Watchdog
After=network.target
StartLimitIntervalSec=0

[Service]
Type=simple
Restart=always
RestartSec=10
ExecStart=/etc/wireguard/watchdog.sh

[Install]
WantedBy=multi-user.target
# 新建脚本
vim /etc/wireguard/watchdog.sh

# 添加下面代码到watchdog.sh中

#!/bin/bash
# TARGET_HOST 根据实际情况修改,这里是中继服务器的内网IP
TARGET_HOST='10.0.1.1' # this is your wireguard network server IP
UP=false
while true
do

  count=$(ping -c 1 $TARGET_HOST | grep rtt | wc -l)
  if [ $count -eq 0 ]; then
      echo "$(date)" "Target host" $TARGET_HOST "unreachable, reinitiating wireguard wg0 interface!"
      systemctl restart wg-quick@wg0
      UP=false
  else
      if [ $UP = false ]; then
        echo "$(date)" "Wireguard connection reestablished!"
      fi
      UP=true
  fi
  sleep 10

done

最后启动服务

systemctl daemon-reload
systemctl start wg-watchdog
systemctl enable wg-watchdog

脚本原理是每隔10秒ping一下中继服务器IP,如果ping不通则说明本机离线,检测到离线后就重启wg服务,这样就可以保证机器一直在线了。

0 条回应
| 耗时 0.488 秒 | 查询 60 次 | 内存 4.27 MB |
本站CDN由One degree CDN提供