手搓IPV6 DDNS脚本食用教程
手搓IPV6 DDNS脚本食用教程
能找到的脚本感觉都不好用,就只能自己搓一条了。
安装
Github地址:https://github.com/keiko233/Script/blob/main/ddns/ipv6.sh
首先下载到本地。
mkdir /etc/ddns
cd /etc/ddns
wget https://raw.githubusercontent.com/keiko233/Script/main/ddns/ipv6.sh
编辑脚本,主要修改的内容如下。
#!/bin/bash
# Cloudflare账号的邮箱地址
CLOUDFALRE_USER_MAIL=""
# Cloudflare全局API密钥
CLOUDFALRE_GLOBAL_API=""
# Cloudflare对应域名的Zone ID
CLOUDFALRE_ZONES_ID=""
# 需要使用DDNS的域名
CLOUDFALRE_DOMAIN=""
# 域名的DNS ID
CLOUDFALRE_DNS_RECORD_ID=""
# IPv6网卡的名字
INTERFACE_NAME=""
# 获取第几个IPv6地址
GET_NTH_ADDRESS=""
# Openwrt路由器的地址
OPENWRT_ADDRESS=""
# 路由器用户
OPENWRT_USERNAME=""
# 路由器防火墙规则ID
OPENWRT_FIREWALL_RULE_ID=""
接下来我们一个一个完成修改
修改运行配置
Cloudflare全局API密钥
打开 https://dash.cloudflare.com/profile/api-tokens,找到Global API Key,复制到脚本中粘贴。
域名Zone ID
打开你的域名面板,在右侧栏就可以看到,中文翻译叫区域ID。
域名的DNS ID
这个稍微有点难度,我们使用Cloudfalre的API来获取。首先你需要确保创建了一个DNS解析,并且设置为AAAA记录,值随便写一个,例如::1。
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/<刚才获取的Zone ID>/dns_records?type=AAAA&name=<DDNS 域名>&content=127.0.0.1&page=1&per_page=100&order=type&direction=desc&match=any" \
-H "X-Auth-Email: <Cloudflare账号的邮箱地址>" \
-H "X-Auth-Key: <全局API密钥>" \
-H "Content-Type: application/json"
修改上述命令后到有curl的机器上运行,返回值是json格式的,稍做格式化如下。
{
"result": [
{
"id": "e4f7221f1b7c92bb12a977445562bec1", // 这里的ID即为DNS ID
"zone_id": "******",
"zone_name": "******",
"name": "******",
"type": "AAAA",
"content": "******",
"proxiable": true,
"proxied": false,
"ttl": 1,
"locked": false,
"meta": {
"auto_added": false,
"managed_by_apps": false,
"managed_by_argo_tunnel": false,
"source": "primary"
},
"comment": null,
"tags": [],
"created_on": "2022-11-05T20:55:33.524501Z",
"modified_on": "2023-01-19T12:26:02.72629Z"
}
],
"success": true,
"errors": [],
"messages": [],
"result_info": {
"page": 1,
"per_page": 100,
"count": 1,
"total_count": 1,
"total_pages": 1
}
}
IPv6网卡
在脚本执行的机器输入 ip a,查看你需要获取地址的网卡,常见的有eth0 eno1等。
获取第几个IPv6地址
一般来说IPv6地址下发的都比较多,我的建议是获取scope global非动态的地址,也就是/128的那个。根据你的实际情况填写即可。
例如我的网卡是这样的。
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:1a:bd:c7:24:19 brd ff:ff:ff:ff:ff:ff
altname enp6s18
inet 10.0.0.48/16 brd 10.0.255.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fd49:be19:7465::2be/128 scope global
valid_lft forever preferred_lft forever
inet6 114:514:1919:810::2be/128 scope global
valid_lft forever preferred_lft forever
inet6 fd49:be19:7465:0:501a:bdff:fec7:2419/64 scope global dynamic mngtmpaddr
valid_lft forever preferred_lft forever
inet6 114:514:1919:810:501a:bdff:fec7:2419/64 scope global dynamic mngtmpaddr
valid_lft 193313sec preferred_lft 106913sec
inet6 fe80::501a:bdff:fec7:2419/64 scope link
valid_lft forever preferred_lft forever
首先第一个IPv6地址 fd49:be19:7465::2be/128 就不能用,这是一个本地局域网地址。第二个 114:514:1919:810::2be/128 就很符合我们的要求,所以 GET_NTH_ADDRESS 我写 2。
Openwrt路由器的地址
这个也不用过多解释吧,一般都是 192.168.1.1,根据自己实际情况修改即可
路由器用户
默认root即可,但是需要注意的是,你需要在这两台机器之间配置好SSH密钥登录,也就是免密登录,具体教程可以自行搜索。
路由器防火墙规则ID
这个也稍微麻烦一点,首先我们需要去Openwrt的防火墙创建一个通信规则。
点击新增,名字随意填写即可,其余项不用做修改,直接保存应用即可。
打开路由的Shell,接下来我们需要用uci命令操作。输入 uci show firewall
查看全部的防火墙规则,找到 name='刚刚写的名字'
这一行,前面的中括号写的就是防火墙规则ID,例如 firewall.@rule[10].name='刚刚写的名字'
这里防火墙的ID就是10。
测试运行
全部填写完成后 chmod +x /etc/ddns/ipv6.sh && /etc/ddns/ipv6.sh
运行即可,首次运行会检查依赖项目安装。
后续的运行效果截图如下
接下来添加到自动任务即可。crontab -e
编辑,加入一行* * * * * /etc/ddns/ipv6.sh
每分钟执行一次即可。
多提一句
脚本没什么技术含量,我也没什么技术含量,写出来只要我自己够用就行(,所以有问题请提PR,谢谢合作。