『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 8130|回复: 3

[基础教程] 使用DNSPOD的动态域名解析服务DDNS

[复制链接]

1

主题

18

帖子

112

积分

论坛积极会员

积分
112
金钱
94
HASS币
0
发表于 2019-1-8 00:07:21 | 显示全部楼层 |阅读模式
本帖最后由 seaprince 于 2019-1-8 06:55 编辑

自从大神们告知N1的神奇魅力之后,立马在PDD下单,70收了一个当矿机废弃的N1回家,开始我的N1之旅。

在论坛前辈的指引下,完成下面几步:
  • 降级,矿机都是最新版本了,必须降级
  • 刷官改,这步完了就可以当电视盒子用了。(然而并不是我的目标啦)
  • 刷armbian,到此就有了一个Ubuntu Linux环境,是我们的主战场了


那么问题来了,虽然从4G或办公室都可以通过家里的外网IP访问到家里的N1,但家里的IP老变,怎么知道最新的IP地址呢?
这就是本文解决的问题。

论坛里有许多alidns的教程了,但我更喜欢怀旧,我的域名依然是Dnspod解析的(目前腾讯云也是Dnspod)。

1. 首先,登陆Dnspod后台,生成一个API Token. 你会得到一个ID和一长串的Token,两个都要。
https://www.dnspod.cn/console/user/security
然后把ID和Token用逗号连接,得到一个login_token串,存储备用。再创建一个新的A记录,用于以后访问家里路由器

2. 其次,用如下命令获取你的domain_id和record_id:
#这里的login_token由上一步获得,从结果中找你的域名,拿到domain_id
curl -k [url=https://dnsapi.cn/Domain.List]https://dnsapi.cn/Domain.List[/url] -d "login_token=12345,b0c540bb26ef7331874ed123123abcde&format=xml"

# 这里的domain_id从上一步获得,找到刚才新加的A记录的record_id
curl -k [url=https://dnsapi.cn/Record.List]https://dnsapi.cn/Record.List[/url] -d "login_token=12345,b0c540bb26ef7331874ed123123abcde&format=xml&domain_id=333333"


3. 下来,就是要找到自己的外网IP地址了,可以百度搜索ip得到,或通过ip138.com,ip111.cn这样的第三方网站拿到,或者自己有服务器的话,在服务器放这样的一个php脚本:
<?php
echo $_SERVER['REMOTE_ADDR'];


4. 最后,调用Dnspod的API把ip刷上去:
#这里的login_token由上一步获得
curl -k [url=https://dnsapi.cn/Domain.List]https://dnsapi.cn/Domain.List[/url] -d "login_token=12345,b0c540bb26ef7331874ed123123abcde&format=xml"

# 这里的login_token、domain_id、result_id、ip均从上述步骤获得
# sub_domain是你想用来做动态解析的子域名
# record_line_id是解析线路,0是默认
# value就是ip
curl -k [url=https://dnsapi.cn/Record.Ddns]https://dnsapi.cn/Record.Ddns[/url] -d "login_token=12345,b0c540bb26ef7331874ed123123abcde&format=xml&domain_id=333333&record_id=4444444&sub_domain=home&record_line_id=0&value=2.2.2.2"


重复以上3、4两步即可更新IP地址到域名上,以后就可以随便玩了。比如搭个网站、远程访问hassio、SSH远程连接看下。

什么,还是不知道怎么弄?那直接拷下面代码,保存为 /root/ddns.py
import urllib
import re

login_token = '12345,b0c540bb26ef7331874ed123123abcde'
domain_id = '333333'
record_id = '4444444'
sub_domain = 'home'

f = open('/var/run/ddns.ip', 'r+')
cip = f.readline()

u = urllib.urlopen('http://ip111.cn/')
html = u.read()
rip = re.findall(r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", html)[0]

def setip(ip):
        global f, login_token, domain_id, record_id, sub_domain
        
        uri = 'https://dnsapi.cn/Record.Ddns'
        data = {
                'login_token': login_token,
                'format': 'json',
                'domain_id': domain_id,
                'record_id': record_id,
                'sub_domain': sub_domain,
                'record_line_id': '0',
                'value': ip,
        }
        params = urllib.urlencode(data)
        ret = urllib.urlopen(uri, params)
        code = ret.getcode()
        resp = ret.read()

        f.write(ip)
        print(resp)

print 'Local cache ip is ' + cip
print 'Remote detected ip is ' + rip
if (cip != rip):
        print 'IP changed'
        setip(rip)
else:
        print 'IP is not changed'


添加到crontab,定时执行:
#命令行输入
crontab -e

# 弹出的编辑器中写入,含意是每5分钟看一次IP变了没
*/5 * * * * python /root/ddns.py >/dev/null 2>&1


大功告成!!

评分

参与人数 2金钱 +30 收起 理由
+ 20 大神666!
windgo + 10 厉害了word楼主!

查看全部评分

回复

使用道具 举报

8

主题

2073

帖子

6053

积分

论坛元老

流水无味

Rank: 8Rank: 8

积分
6053
金钱
3980
HASS币
145

灌水之王

发表于 2019-1-8 07:35:31 | 显示全部楼层
支持下! 如果路由器支持动态解析建议直接上路由器的
回复

使用道具 举报

8

主题

870

帖子

5218

积分

论坛元老

Rank: 8Rank: 8

积分
5218
金钱
4348
HASS币
0
发表于 2019-1-8 09:49:54 | 显示全部楼层
谢谢分享
回复

使用道具 举报

1

主题

18

帖子

112

积分

论坛积极会员

积分
112
金钱
94
HASS币
0
 楼主| 发表于 2019-1-8 21:39:00 | 显示全部楼层
xieahui 发表于 2019-1-8 07:35
支持下! 如果路由器支持动态解析建议直接上路由器的

刚好我家的路由不支持。。不过,可以用自己的域名好处也不少。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-24 14:05 , Processed in 0.093626 second(s), 28 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表