开启 3 天免费试用
注册即可免费体验全部高级功能。
*仅限新用户;每位用户只能获得一次试用。


wg-easy 部署是在 WireGuard 外增加管理界面,主机安全、路由和恢复仍由你负责。本教程把界面放在 SSH 通道后,为每台设备建立独立身份,并把撤销记录纳入恢复流程。
关键要点
- 对外发布隧道端口,管理端口只绑定主机回环地址。
- 设备配置及其二维码都含有秘密,不能当作普通图片分享。
- 撤销、重启后检查新流量,不凭绿色指示判断成功。
- 先关闭业务入口,再恢复数据并重放后续撤销记录。
先按自建责任清单确定更新、凭据、防火墙和退役的负责人。WireGuard 网页管理界面方便统一创建设备,但不安全的备份或导出也可能泄露全部设备秘密。授予管理权前,先理解WireGuard 的公钥身份模型。
如果只需要日常互联网出口,不想维护服务器,可先比较租用 VPS 与使用托管 VPN 的责任。若实际任务是管理 Xray 入站,则参照限制管理入口的 3x-ui 流程;其凭据和恢复数据不同,不能当作 WireGuard 的另一种界面。
适用范围与证据: Ubuntu 24.04 LTS、带 Compose 插件的 Linux Docker Engine、wg-easy v15.4.0,以及另一台获授权的 WireGuard 客户端。本文依据来源制作,作者未完成端到端部署或性能实测,不提供冒充观察结果的截图或终端输出。固定版本是操作基线,不代表宣称它是最新版。[1]
选择有公网入口的专用主机,或已获授权的上游 UDP 端口映射。确认镜像支持主机架构、Linux 内核支持 WireGuard。本教程不涵盖工作站上的 Docker Desktop 网关。按 Docker 官方发行说明安装 Engine 与 Compose,并检查版本。
私下记录原有接口、路由、DNS、防火墙管理者、Docker 已发布端口和云安全组。实际建立一条新的 SSH 连接,并确认提供商恢复控制台可用。不要把管理连接改到即将建立的隧道上。
预留 UDP 51820 和主机 TCP 51821;已有占用时停止。把 Compose 桥接子网与主机、客户端和局域网路由比较,排除冲突。默认私有 IPv6 桥接网不证明公网 IPv6 出口有效。本次有限 IPv4 验证应使用没有可用 IPv6 默认路由的受控客户端;否则先设计并验证双栈覆盖,不要为了通过检查关闭共享机器的 IPv6。
下载并阅读选定版本的 Compose,保留相互配套的卷、能力、网络及转发设置,不混入 v14 的环境变量。上游文件会发布两个服务端口,因此必须明确修改管理端口。[2]
sudo install -d -m 700 /etc/docker/containers/wg-easy
sudo curl --fail --show-error --location \
https://raw.githubusercontent.com/wg-easy/wg-easy/v15.4.0/docker-compose.yml \
-o /etc/docker/containers/wg-easy/compose.yaml
sudoedit /etc/docker/containers/wg-easy/compose.yaml
在已有 wg-easy 服务内替换以下对应字段。这只是片段,不是完整 Compose;保持原有缩进和其它必要设置,包括 NET_ADMIN 与文档要求的模块处理。不要追加 privileged,也不挂载 Docker socket。
image: ghcr.io/wg-easy/wg-easy:15.4.0
environment:
- INSECURE=true
ports:
- "51820:51820/udp"
- "127.0.0.1:51821:51821/tcp"
restart: "no"
INSECURE=true 允许这个受限界面使用 HTTP,不会关闭 WireGuard 认证,也不授权公开明文管理。本方案中浏览器到服务器的路径由 SSH 保护,不能改用公网 HTTP 管理地址。将来若需要公开网页入口,应另行设计认证和 HTTPS。[4]
项目目录保持仅 root 可访问。下面在 sudo 权限内显式指定 Compose 文件,普通 sudo 管理员无需进入该目录。[7]
通过提供商防火墙及实际负责主机/Docker 策略的管理者放行 UDP 51820,不开放公网 TCP 51821,IPv6 也一样。Docker 发布流量可能绕过人们预期保护普通主机服务的 UFW 规则,单独一条 UFW deny 不足以证明限制成立。不要关闭 Docker 防火墙编程或清空规则表。[3]
sudo docker compose -f /etc/docker/containers/wg-easy/compose.yaml config --quiet
sudo docker compose -f /etc/docker/containers/wg-easy/compose.yaml pull
sudo docker compose -f /etc/docker/containers/wg-easy/compose.yaml up -d
sudo docker compose -f /etc/docker/containers/wg-easy/compose.yaml ps
sudo docker compose -f /etc/docker/containers/wg-easy/compose.yaml port wg-easy 51821
管理映射应显示 127.0.0.1:51821。若出现通配地址或其它地址,立即停止容器,在初始化前修正文件。初次验收使用 restart: "no",完成后面的检查后再启用自动重启策略。
在管理工作站替换下列大写占位符。信任文件必须包含经过独立核验的主机密钥;密钥不匹配应停止,不能关闭校验。工作站本地 51821 也须空闲。
ssh -N -T -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=yes \
-o UserKnownHostsFile=/PATH/TO/VERIFIED_KNOWN_HOSTS \
-L 127.0.0.1:51821:127.0.0.1:51821 ADMIN@SERVER_IP
保持终端运行,浏览 http://127.0.0.1:51821。用独立管理员名称和强密码完成首个用户设置,选择新配置,填写公网隧道入口与 UDP 51820,随后在接口/客户端设置中确定 DNS 和路由。不要把回环地址填成设备 endpoint。官方设置说明区分了新配置与旧安装导入。[5]
新建一台设备,使用能够对应所有者和用途的清晰名称,私下把导出的配置交付到该设备。不同人员不要共用一个 peer 文件,不将它粘到聊天中,不公开二维码。设备与公钥的对应清单应和私钥分开保管。
用于 IPv4 互联网出口时,检查生成配置的 AllowedIPs 是否包含 0.0.0.0/0,并确认 DNS 可达。客户端路由不是服务器端访问控制,也不意味着 VPS 能访问任意私有局域网。确认 endpoint、路由、地址分配和 DNS 符合实际拓扑后再导出。
连接前私下记录客户端原出口,连接新设备并产生新请求。在确实使用 WireGuard 接口的浏览器中核对可见出口 IP,预期 IPv4 应与服务器已知出口一致,同时考虑提供商 NAT。
sudo docker compose -f /etc/docker/containers/wg-easy/compose.yaml exec wg-easy wg show wg0
sudo docker compose -f /etc/docker/containers/wg-easy/compose.yaml restart wg-easy
产生新流量后查看握手时间和传输计数。过去的握手只证明过去发生过交换,不能证明当前请求经过隧道。不要把公钥和入口地址放进共享日志。身份验证失败时,按WireGuard 密钥不匹配的排查顺序比较目标 peer,而不披露任何私钥。
| 读者检查 | 预期条件 | 失败时处理 |
|---|---|---|
| 获授权外部主机访问公网管理地址 | TCP 51821 无管理连接 | 停容器,检查 Docker 绑定及两种地址族 |
| 经 SSH 的新浏览器尚未登录 | 无法执行特权面板操作 | 停止设置,调查认证并移除匿名访问 |
| 有效设备发起新互联网请求 | 新握手、计数增加、出口正确 | 区分入口/UDP 与转发、NAT、DNS、路由 |
| 分别进行 DNS 和应用 UDP 检查 | 解析路径正确,受控 UDP 请求成功 | 独立排查,不以浏览器 TCP 成功代替 |
| 断开隧道 | 实际回退符合明确策略 | 不宣称断线保护,必要时另行设计并验证 |
用自己控制的 DNS 测试检查实际解析路径,另用获授权 UDP 应用验证 UDP。HTTPS 浏览不能代替 UDP 检查。本文没有提供客户端断线保护,全隧道配置断开后可能恢复普通网络,不要拿敏感业务探索这种行为。
保留第二台获授权设备作为对照。在面板禁用或删除第一台,保存变更,确认其公钥不再是运行态接受的 peer。保留旧客户端配置并强制产生新流量,预期不能完成新的有效握手或转发请求。确认对照设备仍能工作,再重启容器,重复两边的检查。
把撤销公钥和日期写进独立于被替换备份的私有台账。删除自己客户端上的文件,无法撤销另一台设备已有的副本;面板截图也不能证明当前接口和下次重启都遵守撤销。
停止容器后制作一致备份。下面带日期的目标目录必须尚不存在,下一份快照应换日期或标签;每条命令确认成功后才继续。复制失败时保留源卷,有意识地恢复服务,不能把失败副本算作可恢复备份。
sudo docker compose -f /etc/docker/containers/wg-easy/compose.yaml stop wg-easy
sudo docker compose -f /etc/docker/containers/wg-easy/compose.yaml cp wg-easy:/etc/wireguard /root/wg-easy-backup-20261011
sudo chmod -R go-rwx /root/wg-easy-backup-20261011
sudo cp /etc/docker/containers/wg-easy/compose.yaml /root/wg-easy-compose-20261011.yaml
sudo chmod 600 /root/wg-easy-compose-20261011.yaml
sudo docker compose -f /etc/docker/containers/wg-easy/compose.yaml start wg-easy
需要整个 /etc/wireguard 持久化目录,包括数据库和生成的密钥。同时保留 Compose、镜像版本及防火墙/恢复通道清单。对异机副本加密并限制访问,检查归档能够读取;复制或列出文件都不能证明恢复成功。
恢复演练先在提供商侧关闭隧道入口,使用专用替代主机或隔离实例。重建同版本,在服务停止时恢复持久化目录及原有所有权、权限,管理界面继续只绑定回环地址。不要往运行中的数据库合并文件,也不要覆盖唯一幸存的备份。
入口关闭时启动,先重放快照之后全部撤销,再核对设备清单。随后只短暂允许获授权测试客户端,重复有效/失效身份检查,重启后再次验证。恢复后已撤销身份重新可用属于恢复失败:关闭入口,从持久化和运行态移除该身份,重新验收后才能恢复正常开放。
SSH 正常而管理员密码丢失时,在获授权主机使用文档规定的交互式重置。不要把新密码放进命令参数或记录输入。[6]
sudo docker compose -f /etc/docker/containers/wg-easy/compose.yaml exec -it wg-easy cli db:admin:reset
界面故障时,经提供商控制台只检查本 Compose 项目的配置和日志,恢复最后已知正确配置,不通过公开 UI 绕过问题。无法安全恢复管理通道时,保持业务入口关闭并停止后续修改。
退役时先关闭本部署 UDP 入口、停止容器,执行 sudo docker compose -f /etc/docker/containers/wg-easy/compose.yaml down;备份保留策略未解决前不带 -v。撤销导出的身份,只移除本项目的提供商规则和预留资源,检查残留监听,并确认新的 SSH 连接及原有服务可用。数据卷须在明确决定保留策略后再删除;停止容器不会停止 VPS 计费。
不会,每台设备仍然需要独立 WireGuard 身份。面板只是管理配置并简化导出,因此更应保护管理员入口和导出资料。
强密码不能代替受控管理入口。本方案只允许经 SSH 到回环地址的 HTTP 访问,不提供公网管理监听。
Docker 的转发和端口发布可能不经过普通主机服务使用的 UFW 路径。应核对真实 Docker 绑定及提供商防火墙,不能只看 deny 记录。
握手只证明某一时刻的 peer 交换。还要分别检查新流量、可见出口、DNS、UDP 和断连行为,才能判断完整路径。
如果快照早于设备删除,就可能复活旧身份。应保留独立撤销台账,在入口关闭时重放后续变更,再进行拒绝验证。
应使用独立身份,丢失一台设备时才可以只撤销它,而不替换其它设备凭据。共用文件也会破坏设备清单与流量归属。
本文不宣称作者已完成端到端实测。命令和预期条件是依据官方资料设计的读者验收流程,请记录自己获授权环境中的实际结果。
来源:
Sources checked 2026 年 10 月 11 日。
延伸阅读:
注册即可免费体验全部高级功能。
*仅限新用户;每位用户只能获得一次试用。