跳至主要內容

手搓IPV6 DDNS脚本食用教程

keiko233大约 4 分钟

手搓IPV6 DDNS脚本食用教程

能找到的脚本感觉都不好用,就只能自己搓一条了。

安装

Github地址:https://github.com/keiko233/Script/blob/main/ddns/ipv6.shopen in new window

首先下载到本地。

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,找到Globalopen in new window 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的防火墙创建一个通信规则。

alt image

点击新增,名字随意填写即可,其余项不用做修改,直接保存应用即可。

alt image

打开路由的Shell,接下来我们需要用uci命令操作。输入 uci show firewall 查看全部的防火墙规则,找到 name='刚刚写的名字' 这一行,前面的中括号写的就是防火墙规则ID,例如 firewall.@rule[10].name='刚刚写的名字' 这里防火墙的ID就是10。

测试运行

全部填写完成后 chmod +x /etc/ddns/ipv6.sh && /etc/ddns/ipv6.sh 运行即可,首次运行会检查依赖项目安装。

后续的运行效果截图如下

alt image

接下来添加到自动任务即可。crontab -e编辑,加入一行* * * * * /etc/ddns/ipv6.sh每分钟执行一次即可。

多提一句

脚本没什么技术含量,我也没什么技术含量,写出来只要我自己够用就行(,所以有问题请提PR,谢谢合作。

上次编辑于:
贡献者: keiko233