字
字节笔记本
2026年7月20日
用 wg-easy + Docker 部署 WireGuard VPN:从服务端到多平台客户端
API中转
¥120
用 wg-easy + Docker 部署 WireGuard VPN:从服务端到多平台客户端
WireGuard 是一种现代的 VPN 协议,代码量少、性能高、配置简单。wg-easy 是一个带 Web 管理界面的 WireGuard Docker 镜像,几行配置就能搭建好 VPN 服务。
服务端部署
docker-compose.yml
yaml
version: '3'
services:
wg-easy:
image: weejewel/wg-easy
container_name: wg-easy
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- WG_HOST=your_server_public_ip
- WG_PASSWORD_HASH=your_password_hash
- WG_DEFAULT_ADDRESS=10.10.10.x
- WG_DEFAULT_DNS=114.114.114.114
- WG_ALLOWED_IPS=10.10.10.0/24
- WG_PERSISTENT_KEEPALIVE=25
ports:
- "51820:51820/udp" # VPN 流量
- "51821:51821/tcp" # Web 管理界面
restart: unless-stopped
volumes:
- ./config:/etc/wireguard
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv4.ip_forward=1关键参数说明
| 参数 | 说明 | 示例 |
|---|---|---|
WG_HOST | 服务器公网 IP 或域名 | 43.139.113.195 |
WG_DEFAULT_ADDRESS | 客户端 IP 分配范围 | 10.10.10.x |
WG_DEFAULT_DNS | 推送的 DNS 服务器 | 114.114.114.114 或 8.8.8.8 |
WG_ALLOWED_IPS | VPN 路由的 IP 范围 | 10.10.10.0/24 表示仅 VPN 内网 |
WG_PERSISTENT_KEEPALIVE | 保活间隔(秒) | 25(NAT 穿透需要) |
WG_ALLOWED_IPS 设为 0.0.0.0/0 则所有流量走 VPN(全局代理),设为 10.10.10.0/24 则仅 VPN 内部通信走隧道。
密码设置
推荐用 bcrypt hash 设置管理密码,而不是明文:
bash
# 生成密码 hash
docker run -it ghcr.io/wg-easy/wg-easy wgpw 'your-password'
# 输出类似:$2b$12$xxxxx...
# 填入配置
- WG_PASSWORD_HASH=$2b$12$xxxxx...启动服务
bash
mkdir -p ~/wireguard/config
cd ~/wireguard
# 写入上面的 docker-compose.yml
docker-compose up -d启动后访问 http://your_server_ip:51821 打开 Web 管理界面。
防火墙放行
bash
# Ubuntu/Debian
ufw allow 51820/udp
ufw allow 51821/tcp
# CentOS/RHEL
firewall-cmd --permanent --add-port=51820/udp
firewall-cmd --permanent --add-port=51821/tcp
firewall-cmd --reload如果用的是云服务器,还需要在安全组/防火墙规则中放行这两个端口。
客户端配置
在 Web 管理界面点击「New Client」创建客户端,然后下载配置文件或扫描二维码。
Mac
bash
# 安装 WireGuard
brew install wireguard-tools
# 导入配置文件(从 Web 界面下载的 .conf 文件)
cp client.conf /usr/local/etc/wireguard/wg0.conf
# 启动连接
sudo wg-quick up wg0
# 查看状态
sudo wg show
# 断开连接
sudo wg-quick down wg0也可以直接从 App Store 安装 WireGuard GUI 客户端,导入配置文件即可。
Mac 自动重连
用 LaunchDaemon 实现 WireGuard 开机自动连接:
bash
sudo tee /Library/LaunchDaemons/com.wireguard.wg0.plist << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.wireguard.wg0</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/wg-quick</string>
<string>up</string>
<string>wg0</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
EOF
sudo chown root:wheel /Library/LaunchDaemons/com.wireguard.wg0.plist
sudo chmod 644 /Library/LaunchDaemons/com.wireguard.wg0.plist
sudo launchctl load /Library/LaunchDaemons/com.wireguard.wg0.plistLinux
bash
# Ubuntu/Debian
apt install wireguard resolvconf
# CentOS/RHEL
yum install epel-release
yum install wireguard-tools
# 导入配置
cp client.conf /etc/wireguard/wg0.conf
# 启动
wg-quick up wg0
# 开机自启
systemctl enable wg-quick@wg0
# 查看日志
journalctl -u wg-quick@wg0 -fWindows
- 从 wireguard.com 下载安装包
- 打开 WireGuard 应用
- 点击「Import tunnel(s) from file」选择 .conf 文件
- 点击「Activate」连接
iOS / Android
- 在 App Store / Google Play 搜索「WireGuard」安装
- 打开应用,通过摄像头扫描 Web 界面上的二维码
- 或通过 AirDrop / 文件传输导入 .conf 文件
- 点击连接
运维与故障排查
查看连接状态
bash
# 服务端
docker exec wg-easy wg show
# 或在宿主机
sudo wg show输出会显示每个客户端的公钥、IP 地址、最近握手时间、收发字节数。
客户端无法连接检查清单
- 服务器端口是否放行:确认 51820/udp 在云平台安全组和系统防火墙都已放行
- 服务器 IP 是否正确:
WG_HOST必须是服务器的公网 IP - 配置文件是否匹配:客户端的 Endpoint 地址和端口要正确
- NAT 穿透:如果客户端在 NAT 后面,确保
WG_PERSISTENT_KEEPALIVE=25已设置 - Docker 容器是否正常运行:
docker ps确认容器状态
常用运维命令
bash
# 重启服务
docker-compose restart
# 查看日志
docker-compose logs -f
# 更新镜像
docker-compose pull
docker-compose up -d安全建议
- 设置管理密码:不要裸奔
51821端口的 Web 界面 - 定期轮换密钥:WireGuard 的密钥对可以随时重新生成
- 限制路由范围:如果只需要访问内网,
WG_ALLOWED_IPS不要设成0.0.0.0/0 - 关闭不必要的端口:Web 管理界面可以只在需要时开放
- 备份配置:
./config目录包含所有密钥和配置,定期备份
总结
wg-easy 把 WireGuard 的部署简化到了极致:一个 docker-compose 文件、两个端口放行、客户端扫码导入就能用。适合个人或小团队搭建私有 VPN 网络,用于安全访问远程服务、跨区域组网等场景。
分享: