一、云端服务器端

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-stopped

2.wireguard 管理面板设置

2.1 允许的IP

192.168.2.0/24
10.8.0.0/24

2.2 DNS

223.5.5.5
114.114.114.114

2.3 保活间隔

25

3.云端服务器部署与自动化(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
EOF

3.2赋予脚本执行权限

chmod +x /opt/wg-route-auto.sh

3.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
EOF

3.4启动并启用自动化服务

systemctl daemon-reload
systemctl enable wg-route-auto.service
systemctl start wg-route-auto.service

3.4重启 wg-easy(如失效注入以下代码)

docker exec wg-easy wg
docker exec wg-easy wg set wg0 peer IXxM5pkLUVU9c9rSzMimfu/TcwKNf35BH+a9nOItxjA= allowed-ips 10.8.0.4/32,192.168.2.0/24
docker 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 = 25

2. 在家里 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


心之所向 素履以往