路由器(K3)动态更新 namesilo DNS

2021-05-06 更新: 之后安装了 OpenWrt(LEDE), 直接弄了个插件, 打包进固件


家里申请了公网 IP, 然后路由器暴露一些服务到外网, 虽然有用了公云的 DDNS, 但是不能做一些子域名的映射, 有诸多限制, 所以在 namesilo 上注册了一个个人域名, 用来访问内网的一些服务.

但是 K3 路由器没有 namesilo 的动态域名插件, 所以自己结合了网上的一些脚本, 制定了一个自己的 DDNS 更新脚本.

网上的脚本基本都是通 curl 一些外网 API 来获取公网 IP 的, 因为我是直接在路由器上面使用, 所以可以通过 ifconfig 来获取公网 IP. 以下是脚本内容:

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#!/bin/sh

IPDIR="$(cd "$(dirname "$0")";pwd)/IP" # store last ip in script folder
APIKEY="your_api_key"
DOMAIN="your_domain" # world.com
HOST="your_host" # hello
IP="$(ifconfig | sed -n "s/.*:\(.*\)P-t-P.*/\1/p")" # get public ip by ifconfig
API='https://www.namesilo.com/api'

if [ -f $IPDIR ]; then
LASTIP="$(cat $IPDIR)"
else
LASTIP="0.0.0.0"
fi

if [[ "$IP" != "$LASTIP" ]]; then
echo $IP > $IPDIR

if [ -z "$HOST" ]; then
FULLDOMAIN=$DOMAIN
else
FULLDOMAIN="\\$HOST.$DOMAIN"
fi

# Fetch DNS record ID
RESPONSE="$(curl -s --insecure "$API/dnsListRecords?version=1&type=xml&key=$APIKEY&domain=$DOMAIN")"
RECORD_ID="$(echo $RESPONSE | sed -n "s/^.*<record_id>\(.*\)<\/record_id>.*<host>$FULLDOMAIN<\/host>.*$/\1/p")"

# Update DNS record in Namesilo
RESPONSE="$(curl -s --insecure "$API/dnsUpdateRecord?version=1&type=xml&key=$APIKEY&domain=$DOMAIN&rrid=$RECORD_ID&rrhost=$HOST&rrvalue=$IP&rrttl=3600")"

# Check whether the update was successful
echo $RESPONSE | grep -E "<code>(280|300)</code>" &>/dev/null

if [ $? -eq 0 ]; then
echo 'IP Update Success!'
else
echo 'IP Update Failed!'
fi

else
echo 'IP Not Need Update!'
fi

定时更新

1
*/5 * * * * /your_path_to_script/your_script_name.sh # every five minutes