如果家里是动态公网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
评论区