首页/技术/文章阅读

国内将国内动态IP定时同步到阿里云DDNS的脚本

技术 2024-06-25 32 0

有人喜欢是用cloudflare,有人喜欢国内服务商,区别就在于CF是全球商家,而国内自然是阿里好用一点。

目前只使用了阿里云,因为我的域名在阿里,后面也许会迁移到腾讯云或者其他商家,到时候再说。

测试日志:

阿里云DDNS脚本代码:

#!/bin/bash
set -e

#================================================================================================================#

功能:用于更新阿里云域名 IP,实现 DDNS 功能

#

https://www.gebi1.com/forum.php?mod=viewthread&tid=287344&page=1&_dsign=8f94f74c 提供的脚本文件基础上修改的.# ghui, modified 12/2/2019

在 N1 debian Buster with Armbian Linux 5.3.0-aml-g12 手动执行 / 定时任务 (crontab) 执行测试通过

#================================================================================================================# #

使用方法:

方法 1. 外部参数

修改源码,将对应参数 修改为 \(1,\)2,\(3,\)4,\(5,\)6

aliddns.sh <aliddns_ak> <aliddns_sk> <aliddns_subdomain> <aliddns_domain> <aliddns_iptype> <aliddns_ttl>

示例(A 代表 IPv4,AAAA 代表 IPv6):

执行:aliddns.sh “xxxx” “xxx” “test” “mydomain.site” “A” 600

执行:aliddns.sh “xxxx” “xxx” “test” “mydomain.site” “AAAA” 600

#

方法 2. 内部参数

修改源码,将 \(1,\)2,\(3,\)4,\(5,\)6 替换为对应参数

#

示例:

aliddns_ak=“xxxx”

aliddns_sk=“xxx”

aliddns_subdomain=“test”

aliddns_domain=“mydomain.site”

aliddns_iptype=“A”

aliddns_ttl=600

执行:aliddns.sh

# #================================================================================================================#

#————————————————————–

参数

#

(*)阿里云 AccessKeyId

aliddns_ak= 自行搜索获取

(*)阿里云 AccessKeySecret

aliddns_sk= 自行搜索获取

(*)域名:test.mydomain.com

aliddns_subdomain= 二级域名的前缀 #‘test’ aliddns_domain= 输入你的一级域名 #‘mydomain.com’

(*)ip 地址类型:’A’ 或 ‘AAAA’,代表 ipv4 和 ipv6

aliddns_iptype=A # ‘A’ 或 ‘AAAA’,代表 ipv4 和 ipv6

TTL 默认 10 分钟 = 600 秒

aliddns_ttl=600 #“600”

#————————————————————–

machine_ip=““ddns_ip=”” aliddns_record_id=““if [”\(aliddns_subdomain"="@"] then aliddns_name=\)aliddns_domain else aliddns_name=\(aliddns_subdomain.\)aliddns_domain fi

now=date echo “**************************************************” echo “\(now" echo "\)aliddns_name”

function getMachine_IPv4() {echo $(/usr/bin/wget -qO- -t1 -T2 https://ip.3322.net) }

function getMachine_IPv6() {ipv6=ip addr | grep "inet6.*global" | grep -v "deprecated" | awk '{print $2}' | awk -F"/" '{print $1}' | sed -n '1,1p' echo $ipv6 }

function getDDNS_IP() {current_ip=nslookup -query=$aliddns_iptype $aliddns_name | grep "Address" | grep -v "#53" | awk '{print $2}' echo $current_ip }

function urlencode() {

urlencode <string>

out=“” while read -n1 c do case \(c in [a-zA-Z0-9._-]) out="\)out\(c" ;; *) out="\)outprintf'%%%02X'"'$c"” ;; esac done echo -n $out }

function enc() {echo -n “$1” | urlencode}

function send_request() {

local args=“AccessKeyId=\(aliddns_ak&Action=\)1&Format=json&\(2&Version=2015-01-09" local hash=\)(echo -n “GET&%2F&\((enc"\)args”)” | openssl dgst -sha1 -hmac “\(aliddns_sk&" -binary | openssl base64) curl -s "https://alidns.aliyuncs.com/?\)args&Signature=\((enc"\)hash”)” }

function get_recordid() {grep -Eo ‘“RecordId”:“[0-9]+”’ | cut -d’:’ -f2 | tr -d ‘“’ }

function query_recordid() {send_request “DescribeSubDomainRecords” “SignatureMethod=HMAC-SHA1&SignatureNonce=\(timestamp&SignatureVersion=1.0&SubDomain=\)aliddns_name&Timestamp=\(timestamp&Type=\)aliddns_iptype”}

function update_record() {send_request “UpdateDomainRecord” “RR=\(aliddns_subdomain&RecordId=\)1&SignatureMethod=HMAC-SHA1&SignatureNonce=\(timestamp&SignatureVersion=1.0&TTL=\)aliddns_ttl&Timestamp=\(timestamp&Type=\)aliddns_iptype&Value=\((enc \)machine_ip)” }

function add_record() {send_request “AddDomainRecord&DomainName=\(aliddns_domain" "RR=\)aliddns_subdomain&SignatureMethod=HMAC-SHA1&SignatureNonce=\(timestamp&SignatureVersion=1.0&TTL=\)aliddns_ttl&Timestamp=\(timestamp&Type=\)aliddns_iptype&Value=\((enc \)machine_ip)” }

if [“$aliddns_iptype” = ‘A’] then echo “ddns is IPv4.”

machine_ip=echo "$(getMachine_IPv4)" echo “machine_ip = $machine_ip”

aliddns_record_id=$aliddnsipv4_record_id else echo “ddns is IPv6.”

machine_ip=echo "$(getMachine_IPv6)" echo “machine_ip = $machine_ip”

aliddns_record_id=$aliddnsipv6_record_id fi

ddns_ip=echo "$(getDDNS_IP)" echo “ddns_ip = $ddns_ip”

if [“$machine_ip” = “”] then echo “machine_ip is empty!” exit 0 fi

if [”\(machine_ip" = "\)ddns_ip”] then echo “skippingn” exit 1 fi

echo “start update…”

timestamp=date -u "+%Y-%m-%dT%H%%3A%M%%3A%SZ"

if [”\(aliddns_record_id" = ""] then aliddns_record_id=`query_recordid | get_recordid` echo "----------------" \)aliddns_record_id “n”

if [”\(aliddns_iptype" = 'A'] then aliddnsipv4_record_id=\)aliddns_record_id else aliddnsipv6_record_id=$aliddns_record_id fi fi

#add support */%2A and @/%40 record if [“$aliddns_record_id” = “”] then echo “add record starting”

aliddns_record_id=add_record | get_recordid

if [”\(aliddns_record_id" = ""] then echo "aliddns_record_id is empty. n" else if ["\)aliddns_iptype” = ‘A’] then aliddnsipv4_record_id=\(aliddns_record_id else aliddnsipv6_record_id=\)aliddns_record_id fi

echo “added record \(aliddns_record_id n" fi else echo "update record starting" update_record \)aliddns_record_id echo “updated record $aliddns_record_id n” fi

定时执行:

*/2 * * * * /root/ddns/addns.sh >> /root/ddns/addns.log 2>&1

定点清除log日志:

0 0 * * * > /root/ddns/addns.log
同样,别忘记了addns.sh 和 addns.log 文件的权限,644改成755,赋予root权限即可。

正文结束

将动态IP同步到Cloudflare使用ddns服务开启ufw利用ssh端口转发来访问不适合公之于众的服务

评论区

还没有评论,来坐沙发吧。