Namesilo with DDNS

家里的公网IP地址有时会变化,这使得我的某些依赖域名的服务(网站,VPN,rsync备份等)随之陷入瘫痪。原来我是在我的路由器上用免费的DDNS功能,但这种免费服务一般不能使用自己的域名,又或者必须将域名迁移到DDNS的服务商那里。总之很是不爽。

在V2EX看到很多人推荐,我把域名也转到了Namesilo。 (拜拜了,狗带!)Namesilo不仅价格合理,而且我发现竟然还有API接口支持!惊喜之后上网搜索有关Namesilo的DDNS方案,不料大失所望!只发现有在WINDOWS的POWERSHELL下的一个方案。

好吧,那就自己动手解决吧。

家里反正有一个CentOS 7服务器在7X24运行,想在这上运行个Script脚本就行了。 下面就是具体的步骤:

生成API密钥 (API Key)

登录Namesilo账号, 进到“API Manager”, 生成API Key。 注意不要限制IP,否则等于搬起石头砸自己的脚。

c40031261ee449037a4b4

把这个存好,后面要用到。

Bash脚本

这个脚本首先检查IP对比以前的记录是否有变化。如果有变,就利用API接口去改动对应的IP地址。

#!/bin/bash

##Domain name:
DOMAIN="mydomain.tld"

##Host name.
##If you want manage host "myhost.mydomain.tld", then
HOST="myhost"

##APIKEY obtained from Namesilo:
APIKEY="c40031261ee449037a4b4"

## Do not edit lines below ##

##Saved history pubic IP from last check
IP_FILE="/var/log/MyPubIP"

##Response from Namesilo
RESPONSE="/tmp/namesilo_response.xml"

##Get the current public IP
CUR_IP=$(curl -s http://icanhazip.com)

##Exit if curl failed
if [ $? -ne 0 ]; then
exit 1
fi

##Check file for previous IP address
if [ -f $IP_FILE ]; then
KNOWN_IP=$(cat $IP_FILE)
else
KNOWN_IP=
fi

##See if the IP has changed
if [ "$CUR_IP" != "$KNOWN_IP" ]; then
echo $CUR_IP > $IP_FILE
logger -t IP.Check -- Public IP changed to $CUR_IP

##Update DNS record in Namesilo:
curl -s "https://www.namesilo.com/api/dnsListRecords?version=1&type=xml&key=$APIKEY&domain=$DOMAIN" > $DOMAIN.xml
RECORD_ID=`xmllint --xpath "//namesilo/reply/resource_record/record_id[../host/text() = '$HOST.$DOMAIN' ]" $DOMAIN.xml | grep -oP '(?<=<record_id>).*?(?=</record_id>)'`
curl -s "https://www.namesilo.com/api/dnsUpdateRecord?version=1&type=xml&key=$APIKEY&domain=$DOMAIN&rrid=$RECORD_ID&rrhost=$HOST&rrvalue=$CUR_IP&rrttl=7207" > $RESPONSE
RESPONSE_CODE=`xmllint --xpath "//namesilo/reply/code/text()" $RESPONSE`
case $RESPONSE_CODE in
300)
logger -t IP.Check -- Update success. Now $HOST.$DOMAIN IP address is $CUR_IP;;
280)
logger -t IP.Check -- Duplicate record exist. No update necessary;;
*)
logger -t IP.Check -- DDNS update failed!;;
esac

else
logger -t IP.Check -- NO IP change
fi

exit 0

cronjob

最后,将这个script设置成cronjob,每小时运行一次。

验证

首先在Namesilo的DNS Manager里加一个A记录。随机填HOST及IP地址,比如mytest映射到1.2.3.4
核实一下:

dig mytest.domain.tld @ns1.dnsowl.com

结果应该解析成1.2.3.4
(ns1.dnsowl.com, ns2.dnsowl.com, ns3.dnsowl.com 都是Nemesilo的DNS服务器。可以都试一下。)

然后建一个IP历史记录文件:

echo > /var/log/MyPubIP

我这里是生成了一个空文件。实际上这个文件里可以是任何内容,只要不是你的公网IP地址就行。否则script就不会去更新DNS记录。

运行script (要将其中的HOST, DOMAIN设定好)

HOST="mytest"
DOMAIN="domain.tld"

然后运行即可.

验证结果

dig mytest.domain.tld @ns1.dnsowl.com

结果应该解析成你的公网IP地址。 (如果你的结果还是1.2.3.4,可以换一个DNS服务器验证。毕竟DNS同步需要一点时间)

安全

开始对将API Key用明码写在URL里有些顾忌,后来看到所有请求都有HTTPS加密,这才放心。

另外,API Key一定要妥善保管,否则你懂的~~

如果本文对您所有帮助,并您对Namesilo也有好感,请按此链接注册或迁移域名:
https://www.namesilo.com/?rid=606fd18nb


Submitted to Github:
https://github.com/pztop/namesilo_ddns