有了这款图形管理界面,一分钟内配置 10 个 WireGuard 客户端不是梦

本文主要是介绍有了这款图形管理界面,一分钟内配置 10 个 WireGuard 客户端不是梦,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


该文章随时会有校正更新,公众号无法更新,欢迎订阅博客查看最新内容:https://fuckcloudnative.io

前言

之前花了很大的篇幅介绍了 WireGuard 的????工作原理和????配置详解,可这里面的内容实在太多了,大部分人根本没兴趣深究,只是将其当成参考书来看。WireGuard 虽然组网逻辑很简洁明了,但秘钥和配置文件的管理是个麻烦事,需要手工配置。为了让大部分读者能够快速上手 WireGuard,体验 WireGuard 的优雅和强大,我决定新开一个 WireGuard 快速上手系列,第一篇之前已经发出来了:

  • ????WireGuard 快速安装教程

这篇文章仅仅介绍了如何快速安装 WireGuard,并没有涉及到如何配置使其正常工作。本文主要介绍如何方便优雅地管理 WireGuard 的配置和秘钥。当然了,这里不会详细解读各个配置参数的含义,也不会告诉你通过哪个命令来创建公钥私钥,如果你对此部分感兴趣,可以查看我之前发布的 ????WireGuard 配置详解。

1. wg-gen-web 配置

对于新手来说,如何才能快速把 WireGuard 用起来呢?当然是通过图形管理界面啦,填几个参数,生成个二维码,再拿客户端扫下二维码就连上了,简直是比爽姐还爽~

wg-gen-web 就是这样一款图形管理界面,主要包含以下这些功能:

  • 根据 CIDR 自动分配 IP 地址给客户端;

  • 每个客户端会生成 QR 二维码,方便移动客户端扫描使用;

  • 支持通过邮件发送二维码和配置文件;

  • 支持启用和禁用某个客户端;

  • 支持 IPv6;

  • 支持使用 GitHub 和 Oauth2 OIDC 来进行用户认证;

  • 颜值还比较高。

wg-gen-web 支持直接通过容器来运行,如果你是在本地运行,可以准备一份 docker-compose 文件:

docker-compose.yaml

version: '3.6'
services:wg-gen-web:image: vx3r/wg-gen-web:latestcontainer_name: wg-gen-webrestart: alwaysexpose:- "8080/tcp"ports:- 80:8080environment:- WG_CONF_DIR=/data- WG_INTERFACE_NAME=wg0.conf- OAUTH2_PROVIDER_NAME=fake- WG_STATS_API=http://<API_LISTEN_IP>:8182volumes:- /etc/wireguard:/datanetwork_mode: bridgewg-json-api:image: james/wg-api:latestcontainer_name: wg-json-apirestart: alwayscap_add:- NET_ADMINnetwork_mode: "host"command: wg-api --device wg0 --listen <API_LISTEN_IP>:8182

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

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

????  → docker-compose up -d

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

各项配置的含义我就不解释了,都很好理解,实在不理解的请查看 ????WireGuard 配置详解。

填写好配置信息后,直接点击 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 开始新增客户端配置:

填写客户端配置信息:

点击 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

重启之后 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

如果你按照 ????WireGuard 快速安装教程 这篇文章的步骤来安装 WireGuard,ExecReload 默认已经被加进去了,到这一步不需要做任何改动。后面再更新配置文件时,直接 reload 就行了:

????  → systemctl reload 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: wg0public key: dG5xPA7Q6X7ByeNl5pasI/8ZPhiTOsfsy0NUX4w2wmI=private key: (hidden)listening port: 51820peer: k2Ut15aQn7+mNHqEd4bwdNx3WcvA4F7SPmETYuWdSjM=preshared key: (hidden)allowed ips: 10.6.6.2/32

目前还没有客户端与之连接,所以还看不到连接信息。下面以 macOS 为例演示连接过程。

2. 客户端建立连接

macOS 目前只有两种客户端软件,一个是图形界面,一个是命令行工具。图形界面只上架了 App Store,而且需要美区 Apple ID,比较麻烦。

我推荐直接安装命令行工具:

????  → brew install wireguard-tools

macOS 中的 wg-quick 默认也是读取的 /etc/wireguard 目录,所以需要先创建该目录:

????  → sudo mkdir /etc/wireguard

然后直接下载配置文件:

将其移动到 /etc/wireguard 目录,并重命名为 wg0.conf

????  → sudo mv ~/Downloads/test.conf /etc/wireguard/wg0.conf

查看配置文件内容:

????  → cat /etc/wireguard/wg0.conf
[Interface]
Address = 10.6.6.2/32
PrivateKey = ODN2xN12p5lwcEuj20C4uZV9kJE9yHz4eAHB/4czPEM=[Peer]
PublicKey = dG5xPA7Q6X7ByeNl5pasI/8ZPhiTOsfsy0NUX4w2wmI=
PresharedKey = 8QkkeXGt4D/lnLDA1jfJUhB3oiShhRWp/GC8GFQtgKs=
AllowedIPs = 10.6.6.0/24
Endpoint = 172.16.7.3:51820
PersistentKeepalive = 25

直接启动:

????  → sudo wg-quick up wg0

查看连接信息:

????  → sudo wg
interface: utun2public key: k2Ut15aQn7+mNHqEd4bwdNx3WcvA4F7SPmETYuWdSjM=private key: (hidden)listening port: 60082peer: dG5xPA7Q6X7ByeNl5pasI/8ZPhiTOsfsy0NUX4w2wmI=preshared key: (hidden)endpoint: 172.16.7.3:51820allowed ips: 10.6.6.0/24latest handshake: 7 seconds agotransfer: 840 B received, 840 B sentpersistent keepalive: every 25 seconds

可以看到输出中有两行重要的信息:

transfer: 840 B received, 840 B sent
persistent keepalive: every 25 seconds

表示和服务端已经握手成功了,并且开始传输数据。

到服务端所在的机器查看连接信息:

????  → wg show wg0
interface: wg0public key: dG5xPA7Q6X7ByeNl5pasI/8ZPhiTOsfsy0NUX4w2wmI=private key: (hidden)listening port: 51820peer: k2Ut15aQn7+mNHqEd4bwdNx3WcvA4F7SPmETYuWdSjM=preshared key: (hidden)endpoint: 10.2.0.2:60082allowed ips: 10.6.6.2/32latest handshake: 25 seconds agotransfer: 1.64 KiB received, 1.61 KiB sent

可以看到握手成功了。

Web 页面也能看到连接信息:

如果想增加更多的客户端,直接在 Web 页面新增客户端配置就行了,不需要做任何额外的操作,解放了双手。手机客户端直接扫描二维码就能连接,还是挺爽的。

3. 优化

最后一部分主要介绍 WireGuard 的优化。

动态 IP

对于 WireGuard 而言,只需要一端具有公网 IP 地址便可建立连接,哪怕这一端的 IP 是动态变化的也没问题,可以使用 DDNS 来解决这个问题,WireGuard 会在启动时解析域名的 IP 地址,然后将该 IP 地址作为 peer 的 Endpoint。但这里有一个小瑕疵,WireGuard 只会在启动时解析配置文件中域名的 IP 地址,后续如果域名对应的 IP 地址有更新,也不会重新解析。

wireguard-tools[2] 项目中提供了一个脚本 reresolve-dns.sh[3] 可以用来解决这个问题,该脚本会解析 WireGuard 的配置文件并更新 Endpoint 的 IP 地址。同时,我们还需要创建一个定时任务来定期触发该脚本更新配置,比如每 30 秒执行一次。具体操作步骤如下:

首先克隆 wireguard-tools 仓库:

????  → git clone https://git.zx2c4.com/wireguard-tools /usr/share/wireguard-tools

脚本内容:

????  → cat /usr/share/wireguard-tools/contrib/reresolve-dns/reresolve-dns.sh#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
#
# Copyright (C) 2015-2020 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.set -e
shopt -s nocasematch
shopt -s extglob
export LC_ALL=CCONFIG_FILE="$1"
[[ $CONFIG_FILE =~ ^[a-zA-Z0-9_=+.-]{1,15}$ ]] && CONFIG_FILE="/etc/wireguard/$CONFIG_FILE.conf"
[[ $CONFIG_FILE =~ /?([a-zA-Z0-9_=+.-]{1,15})\.conf$ ]]
INTERFACE="${BASH_REMATCH[1]}"process_peer() {[[ $PEER_SECTION -ne 1 || -z $PUBLIC_KEY || -z $ENDPOINT ]] && return 0[[ $(wg show "$INTERFACE" latest-handshakes) =~ ${PUBLIC_KEY//+/\\+}\ ([0-9]+) ]] || return 0(( ($(date +%s) - ${BASH_REMATCH[1]}) > 135 )) || return 0wg set "$INTERFACE" peer "$PUBLIC_KEY" endpoint "$ENDPOINT"reset_peer_p
}reset_peer_p() {PEER_SECTION=0PUBLIC_KEY=""ENDPOINT=""
}reset_peer_p
while read -r line || [[ -n $line ]]; dostripped="${line%%\#*}"key="${stripped%%=*}"; key="${key##*([[:space:]])}"; key="${key%%*([[:space:]])}"value="${stripped#*=}"; value="${value##*([[:space:]])}"; value="${value%%*([[:space:]])}"[[ $key == "["* ]] && { process_peer; reset_peer_p; }[[ $key == "[Peer]" ]] && PEER_SECTION=1if [[ $PEER_SECTION -eq 1 ]]; thencase "$key" inPublicKey) PUBLIC_KEY="$value"; continue ;;Endpoint) ENDPOINT="$value"; continue ;;esacfi
done < "$CONFIG_FILE"
process_peer

然后创建一个 Service 文件:

# /etc/systemd/system/wireguard_reresolve-dns.service
[Unit]
Description=Reresolve DNS of all WireGuard endpoints
Wants=network-online.target
After=network-online.target[Service]
Type=oneshot
ExecStart=/bin/sh -c 'for i in /etc/wireguard/*.conf; do /usr/share/wireguard-tools/contrib/reresolve-dns/reresolve-dns.sh "$i"; done'

再创建一个同名的 wireguard_reresolve-dns.timer 实现定时任务:

# /etc/systemd/system/wireguard_reresolve-dns.timer
[Unit]
Description=Periodically reresolve DNS of all WireGuard endpoints[Timer]
OnCalendar=*:*:0/30[Install]
WantedBy=timers.target

设置开机自启动:

????  → systemctl enable wireguard_reresolve-dns.service wireguard_reresolve-dns.timer --now

打印 debug 日志

在支持动态调试的内核上使用 Linux 内核模块时,可以将 WireGuard 的调试信息写入内核环形缓冲区中:

????  → modprobe wireguard 
????  → echo module wireguard +p > /sys/kernel/debug/dynamic_debug/control

然后就可以使用 journalctl 或者 dmesg 来查看调试信息了:

????  → journalctl -xf|grep wireguard
Jan 20 15:07:00 k8s03 kernel: wireguard: wg0: Receiving keepalive packet from peer 25 (125.122.107.150:52647)
Jan 20 15:07:00 k8s03 kernel: wireguard: wg0: Receiving handshake initiation from peer 25 (125.122.107.150:52647)
Jan 20 15:07:00 k8s03 kernel: wireguard: wg0: Sending handshake response to peer 25 (125.122.107.150:52647)
Jan 20 15:07:00 k8s03 kernel: wireguard: wg0: Keypair 83096 destroyed for peer 25
Jan 20 15:07:00 k8s03 kernel: wireguard: wg0: Keypair 83112 created for peer 25????  → dmesg|tail -20|grep wireguard
[4222650.389928] wireguard: wg0: Receiving keepalive packet from peer 23 (125.122.107.150:50904)
[4222652.081319] wireguard: wg0: Receiving keepalive packet from peer 22 (125.122.107.150:58715)
[4222654.802308] wireguard: wg0: Receiving keepalive packet from peer 25 (125.122.107.150:53533)
[4222675.389578] wireguard: wg0: Receiving keepalive packet from peer 23 (125.122.107.150:50904)

接下来的文章将会介绍 WireGuard 的全互联模式,以及使用 WireGuard 作为 Kubernetes 的 CNI 插件,大家搓搓小手等着吧。

最后,扫描下方的二维码关注公众号:

公众号后台回复 wg-gen-web 即可获取 wg-gen-web 的项目地址。

参考资料

[1]

wg-api: https://github.com/jamescun/wg-api

[2]

wireguard-tools: https://git.zx2c4.com/wireguard-tools

[3]

reresolve-dns.sh: https://git.zx2c4.com/wireguard-tools/tree/contrib/reresolve-dns


你可能还喜欢

点击下方图片即可阅读

16 岁高中生成功在 iPhone 7 上安装 Ubuntu 20.04 桌面!

云原生是一种信仰 ????

码关注公众号

后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具,只需一条命令,连 ssh 都不需要!

点击 "阅读原文" 获取更好的阅读体验!

❤️给个「在看」,是对我最大的支持❤️

这篇关于有了这款图形管理界面,一分钟内配置 10 个 WireGuard 客户端不是梦的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/803561

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

软考系统规划与管理师考试证书含金量高吗?

2024年软考系统规划与管理师考试报名时间节点: 报名时间:2024年上半年软考将于3月中旬陆续开始报名 考试时间:上半年5月25日到28日,下半年11月9日到12日 分数线:所有科目成绩均须达到45分以上(包括45分)方可通过考试 成绩查询:可在“中国计算机技术职业资格网”上查询软考成绩 出成绩时间:预计在11月左右 证书领取时间:一般在考试成绩公布后3~4个月,各地领取时间有所不同

安全管理体系化的智慧油站开源了。

AI视频监控平台简介 AI视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。用户只需在界面上进行简单的操作,就可以实现全视频的接入及布控。摄像头管理模块用于多种终端设备、智能设备的接入及管理。平台支持包括摄像头等终端感知设备接入,为整个平台提