最近家里牵了宽带(之前家里没网,因为穷,作为一名嵌入式程序员,这是得有多惨),换了一个华为AX3Pro路由器,开启桥接模式,发现家中的PC和手机均有IPv6的地址,而且用IPv6Test测试,属于公网的IPv6地址。于是乎,家中有了公网。立马把之前的破电脑装上Ubuntu16.04系统(为什么不装Ubuntu20.04,这个也是嵌入式程序猿的痛),在联想到自己有阿里云DNS和域名,就自己用Python写了一个简单的DDNS服务,来实现自己电脑的IP与域名进行绑定。先来看一下效果:
在自己电脑上搭建的宝塔面板,跑了一个网站,还有一个FTP服务器,宝塔面板和FTP服务器都没问题,网站目前还存在一些问题,改了nginx端口后无法访问,用默认80端口只能在家里访问,目前还无界,又知道的小伙伴可以指教一下。
在外网使用SSH连接家中的破电脑:
从上面可以看到,运行了4个DDNS的python程序,因为两个域名,四个前缀。到目前为止,使用IPv6可以实现大多情况下的需求了,满足内网访问和控制等。
接下来就是Python代码了,使用的是阿里云SDK开发,因此需要在电脑上安装阿里的SDK,如果需要实现开机自启,比如在:rc.local中实现,务必在root用户环境中也要安装阿里的SDK,这里我当时找了两个小时的原因才找到,不然无法实现开机自启。
安装阿里的SDK:
pip install aliyun-python-sdk-core
pip install aliyun-python-sdk-alidns
由于这个在国外,速度很慢,因此可以采用国内的点下载,比如:
阿里:https://mirrors.aliyun.com/pypi/simple
中国科学技术大学:https://pypi.mirrors.ustc.edu.cn/simple
pip install –index-url https://pypi.douban.com/simple aliyun-python-sdk-core
pip install –index-url https://pypi.douban.com/simple aliyun-python-sdk-alidns
接下来是主要部分代码:
G_alidns_wait_get_cnt = 0 G_ipv6_ser_addr = [] G_ipv6_dev_addr = [] G_ip6_flg = 0 G_ip6_ali_reload = 0 G_doname = "自己的域名" G_ntype = "AAAA:IPv6 A:IPv4" G_RR = "域名前缀" client = AcsClient('AccessKey Secret', '操作', 'cn-hangzhou') dns_info_str=get_dns_info(G_doname, client) G_ipv6_ser_addr = get_aliyun_ipv6_enable_info(dns_info_str, G_RR) print(G_ipv6_ser_addr, 'len=', len(G_ipv6_ser_addr)) G_ipv6_dev_addr=get_all_devipv6_ginfo() print(G_ipv6_dev_addr) while True: G_ipv6_dev_addr = get_all_devipv6_ginfo() for inx_dev_ip6 in G_ipv6_dev_addr: G_ip6_flg = -1 for inx_ser_ip6 in G_ipv6_ser_addr: if inx_ser_ip6['Value'] == inx_dev_ip6: G_ip6_flg = 1 break # set_aliyun_dns(G_doname, G_RR, G_ntype, inx_dev_ip6, client) if G_ip6_flg != 1: G_ip6_ali_reload = 1 set_aliyun_dns(G_doname, G_RR, G_ntype, inx_dev_ip6, client) for inx_ser_ip6 in G_ipv6_ser_addr: G_ip6_flg = 1 for inx_dev_ip6 in G_ipv6_dev_addr: if inx_ser_ip6['Value'] == inx_dev_ip6: G_ip6_flg = 0 break if G_ip6_flg == 1: G_ip6_ali_reload = 1 del_aliyun_domain(inx_ser_ip6['RecordId'], client) time.sleep(5) G_alidns_wait_get_cnt += 1 # if G_alidns_wait_get_cnt >= 20 or G_ip6_ali_reload == 1: if G_ip6_ali_reload == 1: dns_info_str=get_dns_info(G_doname, client) G_ipv6_ser_addr = get_aliyun_ipv6_enable_info(dns_info_str, G_RR) print('sync ser dns',G_ipv6_ser_addr) G_alidns_wait_get_cnt = 0 G_ip6_ali_reload = 0 print(G_ipv6_dev_addr)
整体逻辑为开机运行会获取一次云端的DNS配置,然后获取本地的IPv6公网地址,与之比对,然后增加或删除阿里云端的DNS解析配置,再更新同步配置,每隔5秒监测一次。
从此再家中搭建服务器不在受IPv4的限制,也不花钱,nice!
完整的程序下载:
https://download.csdn.net/download/qq_18604707/12688723
原文链接:https://blog.csdn.net/qq_18604707/article/details/107812595?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168466843816800197020850%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=168466843816800197020850&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-27-107812595-null-null.blog_rank_default&utm_term=NAS%E3%80%81%E7%BE%A4%E6%99%96%E3%80%81%E9%98%BF%E9%87%8C%E4%BA%91%E3%80%81%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90%E3%80%81%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E3%80%81ipv6%E3%80%81ddns%E3%80%81%E8%BD%BB%E9%87%8F%E7%BA%A7%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E3%80%81%E9%93%81%E5%A8%81%E9%A9%AC%E3%80%81%E5%A8%81%E8%81%94%E9%80%9A%E3%80%81DSM%E3%80%81DSM6.0%E3%80%81%E7%BE%A4%E6%99%96nas%E3%80%81%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E3%80%81%E8%9C%97%E7%89%9B%E6%98%9F%E9%99%85%E3%80%81%E9%BB%91%E7%BE%A4%E6%99%96%E3%80%81docker%E3%80%81%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F%E3%80%81%E5%9F%9F%E5%90%8D%E6%B3%A8%E5%86%8C%E3%80%81%E5%AE%9D%E5%A1%94%E3%80%81%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E3%80%81nginx%E3%80%81frp%E3%80%81%E5%8A%A8%E6%80%81%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90