用阿里云 DNS 做 IPv6 DDNS,我写了个小脚本
IPv6
现在运营商基本都给公网 IPv6 了,电脑、手机、家里路由器基本都有。光猫拨号的话,下面设备拿到的也是公网 IPv6 地址。
这就意味着:你可以直接通过 IPv6 从外面访问家里的设备,不需要内网穿透,不需要 ngrok 之类的玩意。
但问题来了——运营商的 IPv6 前缀会变,设备地址也跟着变。我总不能每次变地址都去阿里云后台改解析吧?
所以就有了这个脚本。
怎么知道你有没有 IPv6
先确认你设备有 IPv6,省得折腾半天发现没有。
Windows:
打开 CMD 或 PowerShell,跑一下:
1 | ipconfig |
看有没有以 2408、240e、2409 开头的地址(移动是 2409,电信 240e,联通 2408)。有就说明你有公网 IPv6 了。
Mac / Linux:
1 | ifconfig | grep inet6 |
或者
1 | ip addr | grep inet6 |
最简单的方法:
浏览器打开 test-ipv6.com,它会告诉你有没有 IPv6,还会显示你的公网 IPv6 地址。
这脚本干啥的
简单说:定期检查你当前的公网 IPv6 地址,如果变了,自动调用阿里云 DNS API 把解析记录更新成新地址。
支持多个子域名,比如你可以同时更新 @.example.org(根域名)和 v6.example.org。
目前支持:
- 多个第三方 IPv6 获取接口(ipify、icanhazip、ident.me 等),一个不行自动换下一个
- 如果外网接口都挂了,会 fallback 到本地 ipconfig 获取
- IP 没变化的时候完全静默,不刷日志
- IP 变化会记录变化前后地址,方便排查
- 交互式控制台,可以手动触发更新或查看状态
安装
环境要求
- Python 3.7 以上(建议 3.11,兼容性最好)
- pip
下载代码
直接把 ipv6_clt.py 下载到本地就行,就一个文件,没有其他依赖项目录。
📥 点此下载脚本 → cloud.cuberliu.xyz
安装依赖
1 | pip install aliyun-python-sdk-core aliyun-python-sdk-alidns requests |
如果报错说 pyOpenSSL 有问题,试试:
1 | pip install pyOpenSSL==24.1.0 cryptography==42.0.5 |
配置
打开 ipv6_clt.py,找到配置区域:
1 | ACCESS_KEY_ID = '你的阿里云 AccessKey ID' |
- AccessKey:去阿里云控制台 → 右上角头像 → AccessKey 管理,创建或查看已有的。建议用 RAM 子账号,只给 DNS 权限。
- DOMAIN_NAME:你的主域名,必须是在阿里云 DNS 托管的。
- SUB_DOMAINS:要更新的子域名列表。
@代表根域名,ipv6就是ipv6.你的域名。支持通配符*.xxx。
注意:确保你的 AccessKey 有 DNS 管理权限(AliyunDNSFullAccess)。
运行
守护进程模式(默认)
直接跑:
1 | python ipv6_clt.py |
脚本会每隔 60 秒检查一次 IP 是否有变化,有变化就更新 DNS。
交互式控制台
1 | python ipv6_clt.py console |
进去之后可以:
status— 查看当前 IP、DNS 记录、统计信息log— 看最近 20 条日志log 50— 看最近 50 条update— 手动触发一次更新quit— 退出
开机自启(Windows)
可以用任务计划程序创建一个任务,触发器选“启动时”,操作选运行 Python 脚本。
或者写个 .bat 文件扔到启动目录也行:
1 | @echo off |
日志文件
脚本会生成三个日志文件:
ddns.log— 主日志,记录所有关键操作ip_changes.log— IP 变化的详细记录,只记变化,不记没变的ip_checks.log— IP 检查记录,也只记变化和错误
想看最近发生了什么,直接打开 ddns.log 就行。
几个常见问题
Q:我怎么知道脚本在正常工作?
A:你可以自己改一下子域名的 AAAA 记录值,等下一轮检查(60 秒内)脚本会自动改回来,日志里会有记录。
Q:更新频率能改吗?
A:可以,改 CHECK_INTERVAL = 60 这个值,单位是秒。
Q:支持多个域名吗?
A:支持,在 SUB_DOMAINS 列表里加就行。
Q:控制台显示 emoji 乱码?
A:Windows 的话用 Windows Terminal,或者 VS Code 的终端。普通 CMD 可能会显示乱码,但不影响功能,日志文件里是正常的。