# dynv6ddnsupdate_TSIG **Repository Path**: shujtool/dynv6ddnsupdate_-tsig ## Basic Information - **Project Name**: dynv6ddnsupdate_TSIG - **Description**: 使用TSIG方式更新dynv6 ddns,支持ipv6,ipv4解析 - **Primary Language**: Shell - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-04-10 - **Last Updated**: 2025-09-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: ddns ## README # 简介 ​ 该脚本通过多保险获取本机IPv4/IPv6地址,与缓存对比,变化时用nsupdate更新Dynv6的DNS记录,并搭配Systemd定时器实现秒级检测。特点:3 IP源防失效、缓存减少冗余请求、TSIG密钥安全认证、随机延迟避免并发,确保动态域名实时解析。 # 平台注册 [注册账号](https://dynv6.com/users/sign_in) [创建域名](https://dynv6.com/zones) [获取dynv6 TSIG密钥信息](https://dynv6.com/keys#tsig-keys) 点击 `Add TSIG Key `添加 --> 选择你创建的(Zone)域名及 **Algorithm** ,Algorithm选hmac-sha256 --> 点击`Generate TSIG Key`创建 --> 最后点击 `Details`查看密钥Secret就是dynkey # 安装依赖环境 1. **Debian/Ubuntu** 通过安装BIND软件包获取nsupdate: ```bash sudo apt update sudo apt install bind9 ``` 2. **CentOS/RHEL/Fedora** 安装`bind-utils`工具包(包含nsupdate): ```bash sudo yum install bind-utils # RHEL/CentOS 7及以下 sudo dnf install bind-utils # CentOS 8+/Fedora ``` # 更新脚本编写 ```bash #!/bin/bash # ---------- 配置区 ---------- cache_file="/tmp/dynv6_ip_cache.conf" # 键值对缓存文件 dyndoman="baxxan.dynv6.net" # 动态域名 dynname="tsig-978242.dynv6.com" # TSIG密钥名称 dynkey="xKwU11ZB1CzE4waE2aiL==" # TSIG密钥 enable_ipv4=1 # 启用IPv4更新 (1启用/0禁用) enable_ipv6=1 # 启用IPv6更新 (1启用/0禁用) # --------------------------- # 定义DNS更新函数必须前置 execute_update4() { echo "正在更新IPv4记录..." nsupdate -v <&1 server ns1.dynv6.com zone $dyndoman update delete $dyndoman A update add $dyndoman 60 A $ipv4addr key hmac-sha256:$dynname $dynkey send EOF local ret=$? [ $ret -eq 0 ] && echo "IPv4更新成功" || echo "IPv4更新失败(code:$ret)" return $ret } execute_update6() { echo "正在更新IPv6记录..." nsupdate -v <&1 server ns1.dynv6.com zone $dyndoman update delete $dyndoman AAAA update add $dyndoman 60 AAAA $ipv6addr key hmac-sha256:$dynname $dynkey send EOF local ret=$? [ $ret -eq 0 ] && echo "IPv6更新成功" || echo "IPv6更新失败(code:$ret)" return $ret } # ---------- 主程序 ---------- # 获取当前IP ipv4addr=$(curl -4 -s https://ipv4.ident.me || curl -4 -s https://ipinfo.io/ip || curl -s https://4.ipw.cn) ipv6addr=$(curl -6 -s https://ipv6.ident.me || curl -6 -s https://ipinfo.io/ip || curl -s https://6.ipw.cn) # 读取缓存函数 read_cache() { if [[ -f "$cache_file" ]]; then old_ipv4=$(grep '^old_ipv4=' "$cache_file" | cut -d'=' -f2) old_ipv6=$(grep '^old_ipv6=' "$cache_file" | cut -d'=' -f2) else old_ipv4="" old_ipv6="" fi } # 主逻辑 read_cache # 读取旧IP echo "[DEBUG] 缓存IPv4: ${old_ipv4:-无}" echo "[DEBUG] 缓存IPv6: ${old_ipv6:-无}" echo "[DEBUG] 当前IPv4: $ipv4addr" echo "[DEBUG] 当前IPv6: $ipv6addr" # 初始化新IP变量 new_ipv4="$old_ipv4" new_ipv6="$old_ipv6" any_success=0 # 检测到变化才执行更新 if [[ $enable_ipv4 -eq 1 && "$ipv4addr" != "$old_ipv4" || $enable_ipv6 -eq 1 && "$ipv6addr" != "$old_ipv6" ]]; then echo "检测到IP变化,开始更新..." # IPv4更新逻辑 if [[ $enable_ipv4 -eq 1 && "$ipv4addr" != "$old_ipv4" ]]; then if execute_update4; then new_ipv4="$ipv4addr" any_success=1 fi fi # IPv6更新逻辑 if [[ $enable_ipv6 -eq 1 && "$ipv6addr" != "$old_ipv6" ]]; then if execute_update6; then new_ipv6="$ipv6addr" any_success=1 fi fi # 缓存写入逻辑 if [[ $any_success -eq 1 ]]; then printf "old_ipv4=%s\nold_ipv6=%s\n" "$new_ipv4" "$new_ipv6" > "$cache_file" echo "成功更新缓存" else echo "所有更新均失败,缓存未修改" fi else echo "IP未变化,无需操作" fi ``` ```bash chmod +x /your_path/updatedynv6ddns.sh ``` 以下是完整的 **Systemd 服务+定时器配置方案**,实现秒级检测: # 添加服务 ## 创建服务 通过单条命令快速创建两个文件,注意要修改ExecStart参数: ```bash # 创建服务文件 sudo tee /etc/systemd/system/ddns.service >/dev/null <<'EOF' [Unit] Description=Dynamic DNS Updater Service After=network.target [Service] Type=oneshot ExecStart=/bin/bash /your_path/updatedynv6ddns.sh # 修改ExecStart 指定绝对路径 User=root EOF # 创建定时器文件 sudo tee /etc/systemd/system/ddns.timer >/dev/null <<'EOF' [Unit] Description=Run DDNS Update Every 30~60 Seconds [Timer] OnBootSec=30s OnUnitActiveSec=30s AccuracySec=1s RandomizedDelaySec=30s [Install] WantedBy=timers.target EOF # 激活配置 sudo systemctl daemon-reload sudo systemctl enable --now ddns.timer ``` ## 修改配置 ```bash sudo systemctl daemon-reload sudo systemctl restart ddns.timer ``` ## 卸载服务 ```bash sudo systemctl stop ddns.timer ddns.service \ && sudo systemctl disable ddns.timer \ && sudo rm /etc/systemd/system/ddns.{service,timer} \ && sudo systemctl daemon-reload ``` ## 查看日志 通过以下命令查看 Systemd 服务的详细日志: --- ### 一、查看服务执行日志(核心命令) ```bash # 查看 ddns 服务的完整日志(包含历史记录) journalctl -u ddns.service # 实时追踪最新日志(类似 tail -f) journalctl -u ddns.service -f # 按时间范围筛选(例如最近 10 分钟) journalctl -u ddns.service --since "10 minutes ago" ``` --- ### 二、查看定时器状态 ```bash # 检查定时器触发状态 systemctl status ddns.timer # 查看定时器日志(触发时间点记录) journalctl -u ddns.timer ``` --- ### 三、过滤关键信息 ```bash # 只显示 ERROR 级别日志 journalctl -u ddns.service -p err # 按关键词过滤(例如 "ERROR" 或 "Updated") journalctl -u ddns.service | grep -iE "error|updated" ``` --- ### 四、日志解读技巧 1. **时间戳格式转换** 默认显示UTC时间,转换为本地时间: ```bash journalctl -u ddns.service --utc -o short-iso ``` 2. **输出详细信息** 显示进程ID和优先级: ```bash journalctl -u ddns.service -o verbose ``` --- ### 五、日志存储位置 Systemd 日志默认存储在 `/var/log/journal/`,可通过以下命令确认: ```bash journalctl --disk-usage ``` --- ### 六、常见问题排查 | 现象 | 检查命令 | 解决方案 | | ------------------ | -------------------------------- | ---------------------------- | | 无日志输出 | `systemctl is-active ddns.timer` | 确保定时器状态为 `active` | | 日志显示权限错误 | `ls -l /path/to/your_script.sh` | 用 `chmod +x` 添加执行权限 | | IP未变化但频繁更新 | `journalctl -u ddns.service` | 检查脚本中的缓存逻辑是否生效 | --- **提示**:如果脚本中有 `echo` 或 `printf` 输出,这些内容会直接记录在日志中,建议在调试时添加状态标记: ```bash echo "$(date) - 检测到IP变化,开始更新DNS记录" ```