一、云端服务器端
1.wireguard 安装
version: "3.8"
services:
wg-easy:
image: ghcr.io/wg-easy/wg-easy:15
container_name: wg-easy
environment:
# 在 v15 中,绝不能写 PASSWORD 和 WG_ 变量!仅保留以下两项基础运行设定:
- INSECURE=true
- DISABLE_IPV6=true
volumes:
- /opt/1panel/docker/compose/wg-easy/data:/etc/wireguard
- /lib/modules:/lib/modules:ro
ports:
- "51820:51820/udp"
- "51821:51821/tcp"
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
# 底层彻底关闭 IPv6
- net.ipv6.conf.all.disable_ipv6=1
restart: unless-stopped2.wireguard 管理面板设置
2.1 允许的IP
192.168.2.0/2410.8.0.0/242.2 DNS
223.5.5.5114.114.114.1142.3 保活间隔
253.云端服务器部署与自动化(SSH 连接)
3.1创建自动化监听脚本
cat << 'EOF' > /opt/wg-route-auto.sh
#!/bin/bash
# 核心节点与路由参数
CONTAINER_NAME="wg-easy"
RELAY_IP="10.8.0.4/32"
TARGET_ROUTE="192.168.2.0/24"
inject_route() {
# 等待几秒钟,确保 wg-easy 容器内部的网络接口已经完全初始化
sleep 3
PUBKEY=$(docker exec $CONTAINER_NAME wg show wg0 dump 2>/dev/null | awk -v ip="$RELAY_IP" '$4==ip {print $1}')
if [ -n "$PUBKEY" ]; then
# 注入局域网网段规则
docker exec $CONTAINER_NAME wg set wg0 peer "$PUBKEY" allowed-ips "$RELAY_IP,$TARGET_ROUTE"
# 写入底层 Linux 路由表
docker exec $CONTAINER_NAME ip route add "$TARGET_ROUTE" dev wg0 2>/dev/null
echo "$(date): Successfully injected routes for Star node"
fi
}
# 脚本启动时先执行一次(应对服务器刚开机的情况)
inject_route
# 核心守护逻辑:利用 docker events 实时监听容器状态
# 只要监测到 wg-easy 发生了 start (启动/重启) 事件,就自动执行一次注入
docker events --filter "container=$CONTAINER_NAME" --filter 'event=start' --format '{{.Action}}' | while read event
do
inject_route
done
EOF3.2赋予脚本执行权限
chmod +x /opt/wg-route-auto.sh3.3将脚本注册为系统服务 (Systemd)
cat << 'EOF' > /etc/systemd/system/wg-route-auto.service
[Unit]
Description=Auto Inject WireGuard Routes for wg-easy
After=docker.service
Requires=docker.service
[Service]
Type=simple
ExecStart=/bin/bash /opt/wg-route-auto.sh
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
EOF3.4启动并启用自动化服务
systemctl daemon-reloadsystemctl enable wg-route-auto.servicesystemctl start wg-route-auto.service3.4重启 wg-easy(如失效注入以下代码)
docker exec wg-easy wgdocker exec wg-easy wg set wg0 peer IXxM5pkLUVU9c9rSzMimfu/TcwKNf35BH+a9nOItxjA= allowed-ips 10.8.0.4/32,192.168.2.0/24docker exec wg-easy ip route add 192.168.2.0/24 dev wg0第二阶段:家庭本地网络端
1.本地配置文件修改
[Interface]
PrivateKey = oKrMoX9aErj/MG4A4PR2tK5ZEAui2N2TtkgvXG8t+VE=
Address = 10.8.0.4/32
MTU = 1420
DNS = 223.5.5.5, 114.114.114.114
# --- 新增:流量伪装 (NAT)。让家里的设备能顺利把回包交还给 VPN 隧道 ---
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
[Peer]
PublicKey = 5EOzqbZHUFna/uy2glMsb6bgrzmdoUbK8q70hvebO3E=
PresharedKey = Z1EKSCanblwI9FVDdChWDfR4vVl1tksHDqxn4lvP82s=
Endpoint = 140.245.127.223:51820
# --- 核心修改:为了防止家里服务器断网,这里必须把 192.168.2.0/24 删掉 ---
AllowedIPs = 10.8.0.0/24
# 全局已经有了,保持原样即可
PersistentKeepalive = 252. 在家里 1Panel 部署客户端(家庭服务器需开启 IP 转发)
2.1上传配置
进入家里 1Panel 的「主机 - 文件」,新建目录 /opt/1panel/docker/compose/wg-client/config。将刚才的 wg0.conf 文件上传至该文件夹。
2.2创建编排
进入 1Panel 的「容器 - 编排」,新建编排,名称严格填入简洁标准名称:wg-client。
2.3编排代码
services:
wireguard-client:
image: lscr.io/linuxserver/wireguard:latest
container_name: wg-client
network_mode: host
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- /opt/1panel/docker/compose/wg-client/config:/config
- /lib/modules:/lib/modules:ro
restart: unless-stopped