侧边栏壁纸
博主头像
知识旅途 博主等级

项目经理&三流程序员

  • 累计撰写 29 篇文章
  • 累计创建 15 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Debian/Ubuntu下Wireguard断线重连配置指南

Administrator
2025-06-19 / 0 评论 / 2 点赞 / 609 阅读 / 0 字

如果家里是动态公网IP,长期连接VPN的异地设备需要使用脚本重启wg,因为wg客户端只有在点击连接的时候才进行域名解析,当家里的公网IP变化后wg就会失联,此时就需要用到本文描述的脚本。

📂 开始准备

1. 创建配置目录

sudo mkdir -p /etc/wireguard/dynamic-clients
sudo chmod 700 /etc/wireguard/dynamic-clients

🛠️ 核心配置

2. 创建动态更新脚本

sudo nano /usr/local/bin/wg-dynamic-update

脚本内容:

#!/usr/bin/env bash
# 修复版本:2024.04.28
# 修复内容:日志静默/精准匹配/时区规范

CONFIG_DIR="/etc/wireguard/dynamic-clients"
LOG_FILE="/var/log/wg-dynamic-update.log"

export PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

current_time() {
  TZ='Asia/Shanghai' date "+%Y-%m-%d %H:%M:%S %Z" 2>/dev/null || echo "N/A"
}

for CLIENT_CONFIG in "$CONFIG_DIR"/*.conf; do
  [ -f "$CLIENT_CONFIG" ] || continue

  CLIENT_NAME=""
  INTERFACE=""
  DOMAIN=""
  PORT=""
  PUBLIC_KEY=""
  . "$CLIENT_CONFIG" >/dev/null 2>&1

  if [[ -z "$CLIENT_NAME" || -z "$INTERFACE" || -z "$DOMAIN" || -z "$PORT" || -z "$PUBLIC_KEY" ]]; then
    echo "[$(current_time)] ERROR: $CLIENT_CONFIG 配置参数不完整" >> "$LOG_FILE"
    continue
  fi

  NEW_IP=$(dig +short "$DOMAIN" A | grep -m1 -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}')
  if [ -z "$NEW_IP" ]; then
    echo "[$(current_time)] ERROR: $CLIENT_NAME DNS解析失败" >> "$LOG_FILE"
    continue
  fi

  CURRENT_IP=$(wg show "$INTERFACE" endpoints | awk -v pubkey="$PUBLIC_KEY" '$1 == pubkey {print $2}' | cut -d: -f1)
  
  if [[ "$NEW_IP" != "$CURRENT_IP" ]]; then
    if wg set "$INTERFACE" peer "$PUBLIC_KEY" endpoint "${NEW_IP}:${PORT}" >/dev/null 2>&1; then
      echo "[$(current_time)] INFO: $CLIENT_NAME 端点更新成功 ${NEW_IP}:${PORT}" >> "$LOG_FILE"
    else
      echo "[$(current_time)] ERROR: $CLIENT_NAME WireGuard命令执行失败" >> "$LOG_FILE"
    fi
  else
    echo "[$(current_time)] INFO: $CLIENT_NAME IP未变化 ${NEW_IP}:${PORT}" >> "$LOG_FILE"
  fi
done

设置执行权限

# 设置执行权限
sudo chmod 700 /usr/local/bin/wg-dynamic-update

创建日志目录并赋予权限

sudo touch /var/log/wg-dynamic-update.log
sudo chmod 644 /var/log/wg-dynamic-update.log

📝 客户端配置

3. 创建客户端参数文件

sudo nano /etc/wireguard/dynamic-clients/wg0-client.conf

内容模板,根据自己实际情况修改动态域名、端口和公钥:

CLIENT_NAME="wg0-client"       # 自定义名称
INTERFACE="wg0"                # 必须与WireGuard接口名一致
DOMAIN="你的动态域名"       # 你的动态域名
PORT="服务端端口"                   # 服务端端口
PUBLIC_KEY=""  # 服务端公钥【Peer】的PublicKey,在隧道文件上找

权限设置:

sudo chmod 600 /etc/wireguard/dynamic-clients/*.conf

🔧 系统配置

4. 安装依赖工具

sudo apt update && sudo apt install -y dnsutils

5. 配置定时任务

sudo crontab -e

添加内容:

# 每分钟检查一次(测试阶段建议保持此频率)
* * * * * /usr/local/bin/wg-dynamic-update
# 每周清空日志
@weekly truncate -s 0 /var/log/wg-dynamic-update.log

# 可选:生产环境可调整为每5分钟
# */5 * * * * /usr/local/bin/wg-dynamic-update

重启服务:

sudo systemctl restart cron

✅ 验证流程

6. 手动测试

# 强制运行脚本
sudo /usr/local/bin/wg-dynamic-update

# 查看实时日志
tail -f /var/log/wg-dynamic-update.log
# 成功日志示例:
# 2025年 04月 28日 12:00:01 CST [OK] wg0-client: 更新端点→175.164.28.233:14333

# 检查WireGuard状态
wg show wg0 endpoints

7. 模拟IP变化测试

# 在另一台机器上更新域名解析(如修改DDNS记录)
# 等待1分钟后观察日志是否自动更新

⚙️ 维护管理

8. 扩展新客户端

# 新建配置文件
sudo nano /etc/wireguard/dynamic-clients/office-client.conf
# 内容格式参考 wg0-client.conf

9. 日志管理

# 手动清理日志
sudo truncate -s 0 /var/log/wg-dynamic-update.log

# 配置日志轮替(可选)
sudo nano /etc/logrotate.d/wg-dynamic

📌 重点备忘

组件

路径/命令

作用

动态更新脚本

​/usr/local/bin/wg-dynamic-update​

核心IP更新逻辑

客户端配置目录

​/etc/wireguard/dynamic-clients/​

存放各客户端参数文件

定时任务配置

​sudo crontab -e​

控制检查频率

实时日志监控

​tail -f /var/log/wg-dynamic-update.log​

快速排错

2

评论区