V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
dynaguy
V2EX  ›  Linux

Namesilo 的 DDNS

  •  
  •   dynaguy · 2016-04-26 04:33:38 +08:00 · 11109 次点击
    这是一个创建于 2919 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    #!/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"
    
    ##Saved history pubic IP from last check
    IP_FILE="/var/log/MyPubIP"
    
    ##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"
    else
      logger -t IP.Check -- NO IP change
    fi
    
    exit 0
    

    详情: http://blog.pztop.com/2016/04/25/Namesilo-with-DDNS/

    第 1 条附言  ·  2016-11-30 02:07:37 +08:00
    23 条回复    2018-01-17 11:32:31 +08:00
    kuxiazi
        1
    kuxiazi  
       2016-04-26 06:30:45 +08:00 via Android
    域名在 dnspod 解析的 就用的 dnspod
    dynaguy
        2
    dynaguy  
    OP
       2016-04-26 06:33:51 +08:00
    @kuxiazi 墙里边的 DNS ,还是算了吧~~
    kuxiazi
        3
    kuxiazi  
       2016-04-26 06:37:43 +08:00
    @dynaguy 墙外的慢
    Tink
        4
    Tink  
       2016-04-26 07:44:20 +08:00 via iPhone
    这样解析不慢吗?
    c3538378
        5
    c3538378  
       2016-04-26 07:59:22 +08:00
    大哥, DDNS provider 不提供自己的域名是吧?你 cname 一下不就完事了!
    kuxiazi
        6
    kuxiazi  
       2016-04-26 08:06:07 +08:00 via Android
    @c3538378 之前我就是这样用花生壳的 后来换的路由器固件自带 dnspod 的脚本 就直接用了 反正域名也在那
    miaomiao888
        7
    miaomiao888  
       2016-04-26 08:21:43 +08:00
    changeip.com 的可以,然后用自己的域名 CNAME 一下 OK ,秒解析
    mjever
        8
    mjever  
       2016-04-26 08:50:13 +08:00
    namecheap 的 DDNS 免费还支持自己的域名,用了很久了!
    dynaguy
        9
    dynaguy  
    OP
       2016-04-26 11:11:11 +08:00
    楼上各位用 CNAME 的,那不是多了一层解析吗?
    EPr2hh6LADQWqRVH
        10
    EPr2hh6LADQWqRVH  
       2016-04-26 11:15:14 +08:00
    我不明白为什么这么麻烦。。。
    我是 openwrt 上跑 He.net 的 DDNS 服务,自己域名切了一个子域给 he 那边的 DNS ,
    然后自己其他域名再 CNAME 上去。
    非常顺滑
    dynaguy
        11
    dynaguy  
    OP
       2016-04-26 11:17:01 +08:00
    @miaomiao888 既然 changeip 的 DDNS 服务是免费的,竟然还要信用卡信息,呵呵了!
    cxh116
        12
    cxh116  
       2016-04-26 11:34:56 +08:00
    dnspod 有接口,目前自己是用 dnspod 的接口每小时更新一下. 直接用 wget 命令

    需要提前调用接口获取到 domain_id record_id

    wget -O /tmp/ddns.log --post-data 'login_token=id,token&format=json&domain_id=111&record_id=111&record_line=默认&sub_domain=openwrt' https://dnsapi.cn/Record.Ddns
    lwd2136
        13
    lwd2136  
       2016-11-29 23:20:20 +08:00
    一直错误 108...
    dynaguy
        14
    dynaguy  
    OP
       2016-11-30 02:06:04 +08:00
    @lwd2136
    108 在那个地方出现的?
    用"bash -x yourscript.sh" 看一下。
    lwd2136
        15
    lwd2136  
       2016-11-30 09:05:31 +08:00
    @dynaguy 隐去了些特定信息
    + DOMAIN=abc.com
    + HOST=edgeos
    + APIKEY=123
    + IP_FILE=/var/log/MyPubIP
    + RESPONSE=/tmp/namesilo_response.xml
    ++ curl -s http://icanhazip.com
    + CUR_IP=223.5.5.5
    + '[' 0 -ne 0 ']'
    + '[' -f /var/log/MyPubIP ']'
    + KNOWN_IP=
    + '[' 223.5.5.5 '!=' '' ']'
    + echo 223.5.5.5
    + logger -t IP.Check -- Public IP changed to 223.5.5.5
    + curl -s 'https://www.namesilo.com/api/dnsListRecords?version=1&type=xml&key=a123&domain=abc.com'
    ++ xmllint --xpath '//namesilo/reply/resource_record/record_id[../host/text() = '\''edgeos.abc.com'\'' ]' abc.com.xml
    ++ grep -o '(?<=<record_id>).*?(?=</record_id>)'
    + RECORD_ID=
    + curl -s 'https://www.namesilo.com/api/dnsUpdateRecord?version=""
    ++ xmllint --xpath '//namesilo/reply/code/text()' /tmp/namesilo_response.xml
    + RESPONSE_CODE=108
    + case $RESPONSE_CODE in
    + logger -t IP.Check -- DDNS update 'failed!'
    + exit 0
    dynaguy
        16
    dynaguy  
    OP
       2016-11-30 12:23:46 +08:00
    @lwd2136
    貌似你在第一个 curl 没有拿到 RECORD_ID.

    你有
    + curl -s 'https://www.namesilo.com/api/dnsListRecords?version=1&type=xml&key=a123&domain=abc.com'
    这里为啥 key=a123, 而前面 APIKEY=123
    lwd2136
        17
    lwd2136  
       2016-11-30 15:35:39 +08:00
    @dynaguy 后面那个是一致的,我只是抹掉 apikey 没抹干净
    我也看到似乎是 record_ID 没有拿到 但是没有搞定怎么解决
    dynaguy
        18
    dynaguy  
    OP
       2016-12-01 00:55:04 +08:00
    @lwd2136
    那你手动运行一下那个 curl 命令,看看有没有拿到 xml 文件反馈:
    curl -s 'https://www.namesilo.com/api/dnsListRecords?version=1&type=xml&key=a123&domain=abc.com'

    将 key 和 domain 替换成你自己的。

    如果你没有得到 xml 文件,那你的APIKEY有问题。
    dynaguy
        19
    dynaguy  
    OP
       2016-12-01 01:02:21 +08:00
    像这样(只贴了开头一小部分):
    curl "https://www.namesilo.com/api/dnsListRecords?version=1&type=xml&key=441ff78e1271520db34e2&domain=pztop.com"
    <?xml version="1.0"?>
    <namesilo><request><operation>dnsListRecords</operation><ip>205.205.98.198</ip></request><reply><code>300</code><detail>success</detail><resource_record><record_id>145fadda5adefaf71fb082ddbab7c568</record_id>....
    lwd2136
        20
    lwd2136  
       2016-12-01 08:42:00 +08:00
    @dynaguy 拿到了 没有问题
    <code>300</code><detail>success</detail>
    lwd2136
        21
    lwd2136  
       2016-12-01 09:59:46 +08:00
    @dynaguy 谢谢 最后搞定了,原系统 grep 命令有问题,我改过参数,修改回来就好了
    Remember
        22
    Remember  
       2018-01-17 02:51:49 +08:00
    域名不在 namesilo 可以用他家解析服务吗
    dynaguy
        23
    dynaguy  
    OP
       2018-01-17 11:32:31 +08:00
    @Remember 不行
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1038 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 19:11 · PVG 03:11 · LAX 12:11 · JFK 15:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.