字体预加载
Home
avatar

翻过墙

翻过墙

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时请确保网络安全,定期更新密码,监控异常连接。

wg-easy WireGuard VPN 开源 工具 免费