wireguard
概述
在织造云数据服务器的 docker 中部署了 wireguard 服务端,使用了默认端口号 51821 作为管理端口,管理页面的访问地址是 IP + 这个端口号,密码是最简单的数字+英文,登录后就可以为客户端创建访问凭证了。
安装
CentOS服务端
由于国内 docker 镜像站点都不可用了,本次还制作了阿里云个人镜像站点,用来拉取 docker hub 的镜像文件到阿里云,国内服务器再使用阿里云个人镜像站下载镜像文件。部署方法和使用方法见 devOps/docker/03.国内镜像仓库 然后在安装有 docker 的 centos 中执行下面命令
下面设置的可用IP地址是:10.0.0.0 - 10.7.255.255,子网掩码是:255.248.0.0,可简写为:10.0.0.0/13。注意使用前将下面的中文解释删除
docker run -d \
--name=wg-easy \
-e WG_HOST=织造云数据服务器IP地址 \
-e PASSWORD=管理页面登录密码 \
-e WG_DEFAULT_ADDRESS=10.0.0.x \
-e WG_DEFAULT_DNS=114.114.114.114 \
-e WG_ALLOWED_IPS=10.0.0.0/13 \
-e WG_PERSISTENT_KEEPALIVE=25 每25秒保活\
-v ~/.wg-easy:/etc/wireguard 映射docker内路径为宿主机 ~/.wg-easy 目录\
-p 51820:51820/udp wpm内部数据使用端口\
-p 51821:51821/tcp 管理页面使用端口\
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
--sysctl="net.ipv4.ip_forward=1" \
--restart unless-stopped \
# 下面是阿里云个人镜像站的 wg-easy 使用路径,原本官方的路径是:weejewel/wg-easy
crpi-imkwu1c6wa3ojqar.cn-shanghai.personal.cr.aliyuncs.com/ccdockerhub/wg-easy
注意在执行上面代码之前要求先登录阿里云个人镜像站
# 在 docker 中登录到阿里云个人镜像站点
docker login --username=阿里云个人镜像站登录账号=我的支付宝登录账号 crpi-imkwu1c6wa3ojqar.cn-shanghai.personal.cr.aliyuncs.com
# 拉取镜像文件到本地云服务器
docker pull crpi-imkwu1c6wa3ojqar.cn-shanghai.personal.cr.aliyuncs.com/ccdockerhub/wg-easy
点击进入官方 客户端下载地址 ,这个地址下载的是下载器,运行后要有魔法才能下载真实的安装程序,可以在公司服务器250上 \\192.168.0.250\alist\安装程序\cc\vpn远程控制\wireguard 找到真实的安装包,安装后打开在服务器端生成的配置文件即可。管理页面中每生成一个证书就会在配置文件 wg0.conf 中指定好客户端静态IP地址,由于 docker 安装时做了路径镜像,所以访问织造云数据服务器的 ~/.wg-easy 即可看到这个配置文件。服务端管理页面是
http://服务器IP地址:51821
CentOS客户端
CentOS7 内核版本太低,将 yum 源更换为腾讯云后通过下面的方法重建本地缓存
yum clean all
yum makecache
再通过 yum 在线安装也是没有用。最终在染厂云服务器上通过编译客户端源码的方法试验成功了
# 安装编译依赖
yum groupinstall "Development Tools" -y
yum install kernel-devel-$(uname -r) kernel-headers-$(uname -r) -y
# 下载 WireGuard 源码
cd /tmp
wget https://git.zx2c4.com/wireguard-linux-compat/snapshot/wireguard-linux-compat-1.0.20220627.tar.xz
tar -xf wireguard-linux-compat-1.0.20220627.tar.xz
cd wireguard-linux-compat-1.0.20220627/src
# 编译和安装
make
sudo make install
# 加载模块
sudo modprobe wireguard
执行上面代码中如果出现如下报错
go build -v -o "wireguard-go"
go: errors parsing go.mod:
/tmp/wireguard-go/go.mod:3: invalid go version '1.23.1': must match format 1.23
make[1]: [wireguard-go] 错误 1
make: [generate-version-and-build] 错误 2
说明 go 编译环境太老,需要升级
# 卸载旧版本的 Go
yum remove golang -y
# 下载并安装新版本的 Go
cd /tmp
wget https://golang.org/dl/go1.21.6.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.6.linux-amd64.tar.gz
# 设置环境变量
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
source ~/.bashrc
# 验证 Go 版本
go version
# 重新编译
cd /tmp/wireguard-go
make clean
make
sudo cp wireguard-go /usr/local/bin/
通过上面方法安装后对于 wpm 的操作如下
# 安装后 wireguard 的路径
cd /etc/wireguard
# 其默认配置文件是 wg0.conf
# 连接 VPN
sudo WG_QUICK_USERSPACE_IMPLEMENTATION=wireguard-go wg-quick up wg0
# 断开 VPN
sudo WG_QUICK_USERSPACE_IMPLEMENTATION=wireguard-go wg-quick down wg0
# 查看状态
sudo wg show
# 设置开机自启(可选)
sudo systemctl enable wg-quick@wg0
上面的命令过长,可通过下面方法简化
# 添加别名到 .bashrc
echo 'alias wg-up="sudo WG_QUICK_USERSPACE_IMPLEMENTATION=wireguard-go wg-quick up"' >> ~/.bashrc
echo 'alias wg-down="sudo WG_QUICK_USERSPACE_IMPLEMENTATION=wireguard-go wg-quick down"' >> ~/.bashrc
source ~/.bashrc
# 现在可以简单使用:
wg-up wg0 # 连接
wg-down wg0 # 断开
启用 wireguard 后可能导致自己的 springboot 制作的微信后台服务请求微信 API 失败,例如请求二维码等。需要将客户端下面的配置文件中的 DNS 一行配置去掉重启网络即可
[Interface]
PrivateKey = mNZmrbVdCsJJSZGxVwn/0mgokgT1iNtmZqWjDSwDd1k=
Address = 10.0.0.8/24
DNS = 114.114.114.114
[Peer]
PublicKey = K6EpSFoCIfQIiPHVe2HWQK3inFYGa8+zltDCIQC3fEw=
PresharedKey = dshFLzAvQlBJMvdTMgIgnO8rMyRU/4c0xAg367d/wms=
AllowedIPs = 10.0.0.0/13
PersistentKeepalive = 25
Endpoint = 101.34.89.88:51820
下面是 2025年7月25日 在天翼云网筒服务器上安装的步骤
# 拷贝腾讯镜像源文件到 /etc/yum.repos.d/ 下,两个文件在 \\192.168.0.250\alist\安装程序\cc\centos7\腾讯云镜像源
# 拷贝后执行下面两个命令,更新本地缓存
yum clean all
yum makecache
yum update -y
# 卸载旧版本的 Go
sudo yum remove golang -y
# 下载并安装新版本的 Go
cd /tmp
git clone https://git.zx2c4.com/wireguard-go
wget https://golang.org/dl/go1.21.6.linux-amd64.tar.gz
tar -C /usr/local -xzf go1.21.6.linux-amd64.tar.gz
# 设置环境变量
echo 'export PATH=$PATH:/usr/local/go/bin' >> ~/.bashrc
echo 'export GOPATH=$HOME/go' >> ~/.bashrc
source ~/.bashrc
# 验证 Go 版本
go version
cd /tmp/wireguard-go
make clean
make
sudo make install
# 以上成功编译并安装了 wireguard-go(用户空间的 WireGuard 实现),但内核模块 wireguard 没有加载。这两个是不同的部分
# wireguard-go:是 WireGuard 的用户空间实现(用 Go 编写),不依赖内核模块
# wireguard 内核模块:是官方的高性能内核实现(用 C 编写),需要内核支持
# CentOS 7 默认内核(3.10.x)不原生支持 WireGuard 内核模块(WireGuard 内核模块需要 5.6+ 内核或通过 DKMS 安装)
# 你通过 wireguard-go 编译安装的是用户空间版本,不会自动安装内核模块
# 下面是安装 wireguard 内核模块
# 启用 ELRepo 并安装新内核
sudo yum install -y https://www.elrepo.org/elrepo-release-7.el7.elrepo.noarch.rpm
sudo yum --enablerepo=elrepo-kernel install -y kernel-ml
# 安装 WireGuard 内核模块
sudo yum --enablerepo=elrepo-kernel install -y kmod-wireguard wireguard-tools
# 重启并选择新内核
sudo reboot
错误与提示
通过上面的 docker run -d ... 成功执行后会立即运行容器,就可以访问管理页面了,如果访问不通按照下面步骤检查:
- 在云服务器中执行
curl 127.0.0.1:52821,如果出现拒绝则表示wireguard没有网络配置,导致无法访问 - 执行
docker logs 20fd06281008后面是容器的ID,查看日志文件,如果出现如下提示,表示wireguard没有网络
Error: WireGuard exited with the error: Cannot find device "wg0"
This usually means that your host's kernel does not support WireGuard!
at /app/lib/WireGuard.js:65:19
at processTicksAndRejections (internal/process/task_queues.js:95:5)
at async /app/lib/WireGuard.js:63:9
这是由于 CentOS7 内核并不支持 wireguard,在比较新的版本 Linux 中才集成了 wireguard
# 检查 WireGuard 内核模块是否加载
sudo modprobe wireguard && echo "WireGuard 模块已加载" || echo "WireGuard 不支持"
# CentOS 7/8 默认内核较旧,需手动启用 WireGuard
# 安装 ELRepo 仓库
sudo yum install -y epel-release
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
# 安装 WireGuard
sudo yum install -y wireguard-dkms wireguard-tools
# 加载内核模块
sudo modprobe wireguard
# 验证是否加载成功
lsmod | grep wireguard
# 验证成功后重启 docker 就可以了
