WireGuard 本身不难。

真正麻烦的是后面这些零碎事情:加一个手机、删一个旧设备、生成二维码、改配置、重载服务、看 peer 有没有握手。

手动改 wg0.conf 也不是不行,就是次数多了很烦。而且一不小心把私钥、公钥、AllowedIPs 写错,又得回去排。

所以我写了个 wg-manager.sh,目标很简单:把 WireGuard 常见运维动作包起来,别每次都从头敲。

适用场景

这个脚本适合个人 VPS 上的 WireGuard 小环境:

  • 想快速添加、删除客户端。
  • 想直接在终端里生成二维码给手机扫。
  • 不想每次都手动改 wg0.conf
  • 希望通过菜单看状态、重载配置、导出客户端文件。

如果你已经有复杂的策略路由、多网卡、多出口环境,这个脚本不一定适合直接接管。

前置条件

默认按 Debian / Ubuntu 这类常见服务器环境写。使用前至少需要:

  • 一台可以使用 root 权限的 Linux 服务器。
  • 系统能正常安装 WireGuard 相关软件包。
  • 防火墙或云厂商安全组放行 WireGuard 使用的 UDP 端口。
  • 你知道自己要给客户端分配的大致网段。

最终效果

最后你可以直接运行:

1
sudo ./wg-manager.sh

然后通过菜单完成客户端增删、二维码查看、服务状态检查和配置重载。常用操作不用再反复翻命令。

这个脚本是干嘛的

wg-manager 是一个 Bash 脚本,主要用来管理 WireGuard 服务端和客户端。

它现在能做这些:

  • 安装 WireGuard 服务端。
  • 创建第一个客户端。
  • 添加 / 删除客户端。
  • 自动分配客户端 IP。
  • 生成客户端配置文件。
  • 在终端显示二维码,手机直接扫。
  • 支持全局模式和简单分流模式。
  • 查看服务状态和 peer 信息。
  • 重建配置并重载。
  • 卸载脚本管理的配置。

适合一台 Debian / Ubuntu 云服务器。

不适合那种已经有复杂 WireGuard 生产环境、策略路由一堆、分流规则特别细的场景。这个脚本不是来接管复杂网络的,主要是把普通人最常用的那套流程弄顺。

为什么要写菜单模式

一开始这种脚本通常都是命令行参数:

1
2
3
sudo ./wg-manager.sh add-client iphone
sudo ./wg-manager.sh qr iphone
sudo ./wg-manager.sh status

能用,但要记命令。

平时自己手动运维的时候,我更想直接看到菜单:

1
sudo ./wg-manager.sh

然后选:

1
2
3
4
5
6
7
8
9
1) 安装 WireGuard
2) 添加客户端
3) 删除客户端
4) 列出客户端
5) 查看客户端配置
6) 显示客户端二维码
7) 查看服务状态
8) 重载配置
9) 卸载

这样不用每次翻 README。

还有一个细节:菜单模式启动时会先检查是不是 root。

如果没用 sudo,直接退出。不要让人填了一堆东西,最后才提示权限不够。那种体验有点抽象。

获取脚本

如果仓库已经公开,可以直接克隆:

1
2
3
git clone https://github.com/Kaurisss/wg-manager.git
cd wg-manager
chmod +x wg-manager.sh

也可以只下载单文件:

1
2
curl -fsSL -o wg-manager.sh https://raw.githubusercontent.com/Kaurisss/wg-manager/main/wg-manager.sh
chmod +x wg-manager.sh

脚本建议放服务器上用。别在本地 Windows 上硬跑,这玩意本来就是给 Linux 服务器准备的。

菜单模式使用

最简单:

1
sudo ./wg-manager.sh

第一次用,选安装 WireGuard。

脚本会让你填这些东西:

  • WireGuard 接口名,默认 wg0
  • UDP 端口,默认 51820
  • IPv4 网段,默认 10.66.66.0/24
  • 是否启用 IPv6
  • 客户端 DNS
  • 第一个客户端名字
  • 客户端模式:全局 / 分流

大部分直接回车用默认值就行。

装完之后会生成服务端配置,也会顺手生成第一个客户端配置。

如果装了 qrencode,还能直接在终端显示二维码。手机 WireGuard 客户端一扫就能导入,挺省事。

命令行模式

菜单适合人手动点。

但写文档、自动化、复制命令时,子命令还是要保留。

安装并创建第一个客户端:

1
sudo ./wg-manager.sh install --client-name phone

启用 IPv6:

1
sudo ./wg-manager.sh install --enable-ipv6 --client-name phone

自定义端口和网段:

1
2
3
4
5
6
sudo ./wg-manager.sh install \
--port 51820 \
--ipv4-net 10.66.66.0/24 \
--enable-ipv6 \
--ipv6-net fd66:66:66::/64 \
--client-name laptop

添加客户端:

1
sudo ./wg-manager.sh add-client iphone

显示二维码:

1
sudo ./wg-manager.sh qr iphone

查看状态:

1
sudo ./wg-manager.sh status

列出客户端:

1
./wg-manager.sh list-clients

重载配置:

1
sudo ./wg-manager.sh reload

卸载:

1
sudo ./wg-manager.sh uninstall --yes

全局模式和分流模式

脚本里客户端有两种模式。

全局模式

全局模式就是客户端所有流量都走 WireGuard:

1
AllowedIPs = 0.0.0.0/0,::/0

适合:

  • 手机出门连回服务器。
  • 想让所有流量都经过这台 VPS。
  • 不想研究分流规则。

分流模式

分流模式就是只让指定网段走 WireGuard。

比如只走内网地址:

1
2
3
sudo ./wg-manager.sh add-client office \
--mode split \
--allowed-ips 10.0.0.0/8,172.16.0.0/12,192.168.0.0/16

注意,这只是靠 AllowedIPs 做简单分流。

它不是智能分流,也不会自动识别游戏、网站、域名。你要是想做特别细的规则,那得上更复杂的方案。

生成的文件放哪

默认都在 /etc/wireguard/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/etc/wireguard/
├── wg0.conf
├── clients/
│ ├── phone.conf
│ └── iphone.conf
├── peers/
│ └── iphone/
│ ├── private.key
│ ├── public.key
│ ├── psk.key
│ └── meta
├── backup/
└── .wg-manager/
├── server.env
├── server_private.key
└── server_public.key

这里面有私钥、PSK、客户端配置。

不要传 GitHub。

公开仓库里只放脚本、README、示例配置就行。真实配置文件传上去,基本就是自己给自己挖坑。

安全组和防火墙

脚本会尝试处理 UFW 和 firewalld,自动放行 WireGuard 的 UDP 端口。

但云服务器还有安全组。

这个脚本管不了云厂商控制台。

如果连不上,先看:

  • 云服务器安全组有没有放行 UDP 51820
  • 本机防火墙有没有拦
  • 客户端里的 endpoint 是不是写错
  • 服务端公网 IP 有没有变
  • sudo ./wg-manager.sh status 里有没有握手

不要一连不上就怀疑脚本。

网络这东西很多时候不是配置没生成,是流量根本没进来。

排错顺序

我一般按这个顺序看:

1. 服务有没有起来

1
sudo ./wg-manager.sh status

或者:

1
sudo systemctl status wg-quick@wg0

2. 客户端配置有没有生成

1
ls -l /etc/wireguard/clients/

3. 二维码能不能扫

1
sudo ./wg-manager.sh qr iphone

4. peer 有没有握手

1
sudo wg

latest handshake 才说明客户端真的连上了。

没有握手就继续看端口、安全组、endpoint、公私钥。

已知限制

这个脚本不是万能的。

目前限制大概是:

  • 只支持 Debian / Ubuntu。
  • IPv4 网段只按 /24 处理。
  • IPv6 网段只按 /64 处理。
  • 默认用 iptables / ip6tables 做 NAT。
  • 不接管已有复杂 WireGuard 环境。
  • 分流只是简单 AllowedIPs,不做智能规则。

这些限制不是 bug,是故意先控制范围。

脚本这种东西最怕一开始想包打天下,最后写成一坨没人敢跑的东西。

最后

wg-manager 不是为了替代 WireGuard 官方工具。

它只是把我经常要做的几件事包成一个脚本:安装、加客户端、删客户端、扫二维码、看状态、重载配置。

能少手改一次 wg0.conf,就少一次写错配置的机会。

先能稳定跑,再慢慢补功能。这个方向比较像人样。