1、docker 安装 wg-gen-web

docker-compose.yaml

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://<API_LISTEN_IP>: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 <API_LISTEN_IP>:8182

这里还用到了另外一个项目 wg-api,该项目提供了一个 JSON-RPC 接口,用来暴露 WireGuard 的网络状态信息。其中 <API_LISTEN_IP> 可以直接替换成 docker0 的 IP。

查看 docker0 的 IP,ip addr

即实际 docker-compose.yaml 如下:

version: '3.6'
services:
  wg-gen-web:
    image: vx3r/wg-gen-web:latest
    container_name: wg-gen-web
    restart: always
    expose:
      - "8080/tcp"
    ports:
      - 8080:8080
    environment:
      - WG_CONF_DIR=/data
      - WG_INTERFACE_NAME=wg0.conf
      - OAUTH2_PROVIDER_NAME=fake # 此处表示 web 端不开启账号密码验证
      # 
      - WG_STATS_API=http://172.17.0.1: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 172.17.0.1:8182

执行以下命令运行 wg-gen-web:

docker-compose up -d

注意:如果 wg 没有启动可能 wg-api 安装不成功,此时 先执行 启动 systemctl start wg-quick@wg0 再安装 wg-gen-web

2、配置 SERVER 端

在浏览器中输入 URL <hostIP> 打开图形管理界面,点击 “SERVER” 开始填写服务端和客户端的配置信息:

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

使用命令:cat /etc/wireguard/wg0.conf 查看配置

3、添加 client 配置

接下来点击 CLIENTS,然后点击 ADD NEW CLIENT 开始新增客户端配置:

点击 SUBMIT,就会在 /etc/wireguard 目录下生成客户端的 json 配置文件:

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

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

systemctl start wg-quick@wg0

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

systemctl restart wg-quick@wg0

4、配置 在不中断活跃连接的情况下重新加载配置文件

重启之后 WireGuard 会断开重连,体验不太好。

事实上 WireGuard 可以做到在不中断活跃连接的情况下重新加载配置文件,命令如下:

wg syncconf wg0 <(wg-quick strip wg0)

我们可以将这个命令作为 systemd 服务的 reload 命令:

# /usr/lib/systemd/system/wg-quick@.service
[Unit]
Description=WireGuard via wg-quick(8) for %I
After=network-online.target nss-lookup.target
Wants=network-online.target nss-lookup.target
PartOf=wg-quick.target
Documentation=man:wg-quick(8)
Documentation=man:wg(8)
Documentation=https://www.wireguard.com/
Documentation=https://www.wireguard.com/quickstart/
Documentation=https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
Documentation=https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8

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

[Install]
WantedBy=multi-user.target

后面再更新配置文件时,直接 reload 就行了:

systemctl reload wg-quick@wg0

5、配置 更新 配置后 自动 reload

每次更新配置后都要手动 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

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

参考教程:

https://icloudnative.io/posts/configure-wireguard-using-wg-gen-web/
https://github.com/vx3r/wg-gen-web

作者:admin  创建时间:2023-02-13 15:33
最后编辑:admin  更新时间:2023-02-27 11:56