wg-easy-WireGuard管理界面
wg-easy 是一个开源的WireGuard VPN管理界面,提供了Web化的配置管理功能。它简化了WireGuard的部署和管理流程,支持用户管理、配置生成、状态监控等功能,是WireGuard VPN的理想管理工具。
主要特性
🌐 Web管理界面
- 可视化配置: 通过Web界面管理WireGuard配置
- 用户管理: 支持多用户管理和权限控制
- 配置生成: 自动生成客户端配置文件
- 状态监控: 实时监控VPN连接状态
🔧 配置管理
- 服务器配置: 简化WireGuard服务器配置
- 客户端管理: 批量管理客户端配置
- 配置同步: 自动同步配置到所有客户端
- 备份恢复: 支持配置备份和恢复
📊 监控统计
- 连接统计: 显示客户端连接状态和流量统计
- 性能监控: 监控VPN服务器性能指标
- 日志记录: 记录详细的连接和操作日志
- 告警通知: 支持异常情况告警通知
🔒 安全功能
- 访问控制: 基于角色的访问控制
- API安全: 提供安全的RESTful API
- SSL支持: 支持HTTPS安全访问
- 审计日志: 记录所有管理操作
项目地址
wg-easy - Github wg-easy - 文档安装配置
1. Docker部署
# 使用Docker Compose部署
version: '3.8'
services:
wg-easy:
environment:
# 服务器配置
- WG_HOST=YOUR_SERVER_IP
- WG_PORT=51820
- WG_PERSISTENT_KEEPALIVE=25
- WG_DEFAULT_ADDRESS=10.8.0.x
- WG_DEFAULT_DNS=1.1.1.1,8.8.8.8
- WG_MTU=1420
# Web界面配置
- WG_DEFAULT_CONFIG_NAME=wg0
- WG_CONFIG_PATH=/etc/wireguard
- WG_DISABLE_METADATA=false
# 管理界面配置
- WG_ADMIN_USERNAME=admin
- WG_ADMIN_PASSWORD=admin123
- WG_WEBUI_HOST=0.0.0.0
- WG_WEBUI_PORT=5000
# 安全配置
- WG_WEBUI_SECRET_KEY=your-secret-key
- WG_WEBUI_JWT_SECRET=your-jwt-secret
image: weejewel/wg-easy
container_name: wg-easy
restart: unless-stopped
ports:
- "51820:51820/udp"
- "5000:5000/tcp"
volumes:
- ./wg-easy:/etc/wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv4.ip_forward=1
2. 手动安装
# 1. 安装依赖
sudo apt update
sudo apt install -y docker.io docker-compose
# 2. 创建配置目录
mkdir -p ~/wg-easy
cd ~/wg-easy
# 3. 创建docker-compose.yml文件
cat > docker-compose.yml << EOF
version: '3.8'
services:
wg-easy:
environment:
- WG_HOST=$(curl -s ifconfig.me)
- WG_PORT=51820
- WG_PERSISTENT_KEEPALIVE=25
- WG_DEFAULT_ADDRESS=10.8.0.x
- WG_DEFAULT_DNS=1.1.1.1,8.8.8.8
- WG_MTU=1420
- WG_ADMIN_USERNAME=admin
- WG_ADMIN_PASSWORD=admin123
- WG_WEBUI_HOST=0.0.0.0
- WG_WEBUI_PORT=5000
image: weejewel/wg-easy
container_name: wg-easy
restart: unless-stopped
ports:
- "51820:51820/udp"
- "5000:5000/tcp"
volumes:
- ./wg-easy:/etc/wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv4.ip_forward=1
EOF
# 4. 启动服务
docker-compose up -d
# 5. 查看日志
docker-compose logs -f wg-easy
3. 系统配置
# 启用IP转发
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
# 配置防火墙
sudo ufw allow 51820/udp
sudo ufw allow 5000/tcp
# 检查服务状态
docker ps | grep wg-easy
基础配置
1. 环境变量配置
# 基础配置
WG_HOST=your-server-ip # 服务器公网IP
WG_PORT=51820 # WireGuard端口
WG_PERSISTENT_KEEPALIVE=25 # 保活时间
WG_DEFAULT_ADDRESS=10.8.0.x # 客户端IP地址段
WG_DEFAULT_DNS=1.1.1.1,8.8.8.8 # DNS服务器
WG_MTU=1420 # MTU值
# Web界面配置
WG_ADMIN_USERNAME=admin # 管理员用户名
WG_ADMIN_PASSWORD=admin123 # 管理员密码
WG_WEBUI_HOST=0.0.0.0 # Web界面监听地址
WG_WEBUI_PORT=5000 # Web界面端口
# 安全配置
WG_WEBUI_SECRET_KEY=your-secret-key # 密钥
WG_WEBUI_JWT_SECRET=your-jwt-secret # JWT密钥
2. 网络配置
# 网络接口配置
[Interface]
PrivateKey = <server-private-key>
Address = 10.8.0.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
# 客户端配置示例
[Peer]
PublicKey = <client-public-key>
AllowedIPs = 10.8.0.2/32
3. 客户端配置
# 客户端配置文件示例
[Interface]
PrivateKey = <client-private-key>
Address = 10.8.0.2/24
DNS = 1.1.1.1, 8.8.8.8
MTU = 1420
[Peer]
PublicKey = <server-public-key>
Endpoint = your-server-ip:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
高级功能
1. API接口
# API使用示例
import requests
import json
class WgEasyAPI:
def __init__(self, base_url, username, password):
self.base_url = base_url
self.username = username
self.password = password
self.session = requests.Session()
self.login()
def login(self):
"""登录获取token"""
login_data = {
'username': self.username,
'password': self.password
}
response = self.session.post(f"{self.base_url}/api/session", json=login_data)
if response.status_code == 200:
self.token = response.json().get('token')
self.session.headers.update({'Authorization': f'Bearer {self.token}'})
def get_clients(self):
"""获取所有客户端"""
response = self.session.get(f"{self.base_url}/api/wireguard/client")
return response.json()
def create_client(self, name, email=None):
"""创建新客户端"""
client_data = {
'name': name,
'email': email
}
response = self.session.post(f"{self.base_url}/api/wireguard/client", json=client_data)
return response.json()
def delete_client(self, client_id):
"""删除客户端"""
response = self.session.delete(f"{self.base_url}/api/wireguard/client/{client_id}")
return response.status_code == 200
def get_client_config(self, client_id):
"""获取客户端配置"""
response = self.session.get(f"{self.base_url}/api/wireguard/client/{client_id}/configuration")
return response.text
# 使用示例
api = WgEasyAPI('http://your-server:5000', 'admin', 'admin123')
# 获取所有客户端
clients = api.get_clients()
print(f"当前有 {len(clients)} 个客户端")
# 创建新客户端
new_client = api.create_client('test-client', 'test@example.com')
print(f"创建客户端: {new_client['name']}")
# 获取配置
config = api.get_client_config(new_client['id'])
print(f"客户端配置: {config}")
2. 监控脚本
# 监控脚本示例
import time
import requests
from datetime import datetime
class WgEasyMonitor:
def __init__(self, api_url, username, password):
self.api = WgEasyAPI(api_url, username, password)
self.stats = {}
def collect_stats(self):
"""收集统计信息"""
try:
clients = self.api.get_clients()
total_clients = len(clients)
active_clients = len([c for c in clients if c.get('enabled', False)])
self.stats = {
'timestamp': datetime.now().isoformat(),
'total_clients': total_clients,
'active_clients': active_clients,
'inactive_clients': total_clients - active_clients,
'clients': clients
}
return self.stats
except Exception as e:
print(f"收集统计信息失败: {e}")
return None
def check_alerts(self):
"""检查告警条件"""
alerts = []
if self.stats:
# 检查客户端数量
if self.stats['total_clients'] > 100:
alerts.append({
'level': 'warning',
'message': f"客户端数量过多: {self.stats['total_clients']}"
})
# 检查活跃客户端比例
if self.stats['total_clients'] > 0:
active_ratio = self.stats['active_clients'] / self.stats['total_clients']
if active_ratio < 0.5:
alerts.append({
'level': 'warning',
'message': f"活跃客户端比例过低: {active_ratio:.2%}"
})
return alerts
def send_notification(self, alerts):
"""发送通知"""
if alerts:
message = "WireGuard监控告警:\n"
for alert in alerts:
message += f"- [{alert['level'].upper()}] {alert['message']}\n"
# 这里可以集成邮件、短信、钉钉等通知方式
print(message)
def run_monitor(self, interval=300):
"""运行监控"""
print("开始监控WireGuard...")
while True:
try:
stats = self.collect_stats()
if stats:
print(f"统计信息: {stats}")
alerts = self.check_alerts()
if alerts:
self.send_notification(alerts)
time.sleep(interval)
except KeyboardInterrupt:
print("监控停止")
break
except Exception as e:
print(f"监控异常: {e}")
time.sleep(interval)
# 使用示例
monitor = WgEasyMonitor('http://your-server:5000', 'admin', 'admin123')
monitor.run_monitor()
3. 自动化部署
#!/bin/bash
# 自动化部署脚本
set -e
# 配置变量
WG_HOST=$(curl -s ifconfig.me)
WG_PORT=51820
WG_ADMIN_USERNAME=admin
WG_ADMIN_PASSWORD=$(openssl rand -base64 32)
WG_WEBUI_PORT=5000
echo "WireGuard Easy 自动化部署脚本"
echo "服务器IP: $WG_HOST"
echo "WireGuard端口: $WG_PORT"
echo "Web界面端口: $WG_WEBUI_PORT"
# 检查Docker
if ! command -v docker &> /dev/null; then
echo "安装Docker..."
curl -fsSL https://get.docker.com -o get-docker.sh
sh get-docker.sh
sudo usermod -aG docker $USER
fi
# 检查Docker Compose
if ! command -v docker-compose &> /dev/null; then
echo "安装Docker Compose..."
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
fi
# 创建配置目录
mkdir -p ~/wg-easy
cd ~/wg-easy
# 创建docker-compose.yml
cat > docker-compose.yml << EOF
version: '3.8'
services:
wg-easy:
environment:
- WG_HOST=$WG_HOST
- WG_PORT=$WG_PORT
- WG_PERSISTENT_KEEPALIVE=25
- WG_DEFAULT_ADDRESS=10.8.0.x
- WG_DEFAULT_DNS=1.1.1.1,8.8.8.8
- WG_MTU=1420
- WG_ADMIN_USERNAME=$WG_ADMIN_USERNAME
- WG_ADMIN_PASSWORD=$WG_ADMIN_PASSWORD
- WG_WEBUI_HOST=0.0.0.0
- WG_WEBUI_PORT=$WG_WEBUI_PORT
image: weejewel/wg-easy
container_name: wg-easy
restart: unless-stopped
ports:
- "$WG_PORT:$WG_PORT/udp"
- "$WG_WEBUI_PORT:$WG_WEBUI_PORT/tcp"
volumes:
- ./wg-easy:/etc/wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
- net.ipv4.ip_forward=1
EOF
# 启动服务
echo "启动WireGuard Easy..."
docker-compose up -d
# 等待服务启动
echo "等待服务启动..."
sleep 10
# 检查服务状态
if docker ps | grep -q wg-easy; then
echo "部署成功!"
echo "Web界面地址: http://$WG_HOST:$WG_WEBUI_PORT"
echo "管理员用户名: $WG_ADMIN_USERNAME"
echo "管理员密码: $WG_ADMIN_PASSWORD"
echo "WireGuard端口: $WG_PORT"
else
echo "部署失败,请检查日志:"
docker-compose logs wg-easy
exit 1
fi
使用场景
1. 企业VPN
# 企业VPN部署
适用场景:
- 远程办公
- 分支机构连接
- 安全访问内网
- 员工设备管理
功能:
- 用户权限管理
- 连接监控
- 流量统计
- 安全审计
2. 个人VPN
# 个人VPN使用
适用场景:
- 安全上网
- 访问受限资源
- 保护隐私
- 游戏加速
功能:
- 简单配置
- 多设备支持
- 自动重连
- 流量监控
3. 开发测试
# 开发测试环境
适用场景:
- 内网服务测试
- 跨地域部署
- 容器网络
- 微服务通信
功能:
- 快速部署
- 配置管理
- 网络隔离
- 服务发现
性能优化
1. 网络优化
# 网络性能优化
# 优化内核参数
echo 'net.core.rmem_max=2500000' >> /etc/sysctl.conf
echo 'net.core.wmem_max=2500000' >> /etc/sysctl.conf
echo 'net.ipv4.tcp_congestion_control=bbr' >> /etc/sysctl.conf
sysctl -p
# 优化WireGuard配置
[Interface]
PrivateKey = <server-private-key>
Address = 10.8.0.1/24
ListenPort = 51820
MTU = 1420
# 启用硬件加速(如果支持)
PostUp = ethtool -K eth0 tx off rx off || true
PostDown = ethtool -K eth0 tx on rx on || true
2. 数据库优化
-- 数据库优化(如果使用外部数据库)
-- 创建索引
CREATE INDEX idx_clients_name ON clients(name);
CREATE INDEX idx_clients_email ON clients(email);
CREATE INDEX idx_clients_created_at ON clients(created_at);
-- 优化查询
SELECT * FROM clients WHERE enabled = 1 ORDER BY created_at DESC LIMIT 10;
3. 缓存策略
# 缓存配置
import redis
from functools import wraps
redis_client = redis.Redis(host='localhost', port=6379, db=0)
def cache_result(expire_time=300):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
cache_key = f"{func.__name__}:{hash(str(args) + str(kwargs))}"
# 尝试从缓存获取
cached_result = redis_client.get(cache_key)
if cached_result:
return json.loads(cached_result)
# 执行函数并缓存结果
result = func(*args, **kwargs)
redis_client.setex(cache_key, expire_time, json.dumps(result))
return result
return wrapper
return decorator
# 使用缓存
@cache_result(expire_time=60)
def get_client_stats():
# 获取客户端统计信息
pass
常见问题
Q: 如何备份WireGuard配置?
A: 备份/etc/wireguard
目录,或使用wg-easy的导出功能备份配置。
Q: 客户端连接不上怎么办?
A: 检查防火墙设置、端口开放、网络配置和客户端配置是否正确。
Q: 如何限制客户端流量?
A: 使用iptables规则限制流量,或集成第三方流量控制工具。
Q: 如何实现高可用部署?
A: 使用负载均衡器、多服务器部署和配置同步机制。
总结
wg-easy 是一个优秀的WireGuard管理工具,具有以下优势:
- ✅ 完全免费开源
- ✅ 易于部署
- ✅ 功能完善
- ✅ 界面友好
- ✅ 安全可靠
- ✅ 扩展性强
wg-easy 特别适合需要简化WireGuard管理的用户和企业。
使用wg-easy时请确保网络安全,定期更新密码,监控异常连接。