原创  局域网自己搭建服务器之DDNS(动态域名解析),基于阿里域名api+python实现

分类:运维 2020-07-07T23:15:53    487人阅读   

背景

    一般家里的内部网络都是通过路由器然后再接几台电脑。这种结构只有路由器有一个公网IP,而且这个公网IP也是会不定期的变化,连接路由器的内部电脑都是由路由器分配局域网内部IP。所以要想将内部电脑作为服务器暴露到公网让别人可以访问,需要解决如下问题。

问题

    1、路由器接受到的访问如何映射到局域网内指定服务器电脑(路由器转发)

    2、变化路由器IP如何暴露到公网 即DDNS (公网IP寻址)

我们来看看访问链路以理解以上问题:

    客户端(如浏览器)输入域名==>域名服务器将域名解析为公网IP==>公网IP对应路由器接收到客户端请求==>路由器将请求转发给内部服务器电脑

解决问题1(路由器转发)

    设置路由器静态分配IP,即MAC绑定到IP,然后在NAT中设置当路由器某端口接收到数据时转发给那个IP和端口,至此问题1解决。

    (扩展,内部可以在被转发服务器上使用nginx代理到内部任意电脑


解决问题2(公网IP寻址)

    域名解析到IP只需要域名解析服务有我们的域名和IP的映射关系就行。由于我们路由器IP是动态变化的,所以我们要做的就是当路由器IP发生变化时,重新进行域名解析,即:动态域名解析 

    思路 

        本机调用公网IP查询接口获取本机公网IP(此IP即为路由器IP),比如百度查IP,https://api.ipify.org/?format=json等

        通过调用阿里域名解析接口进行动态域名解析。此接口免费,只需要AccessKeyId、AccessKeySecret 验证访问权限。


实践

    阿里云解析接口文档:https://help.aliyun.com/document_detail/29749.html?spm=a2c4g.11186623.2.16.25c84256xV2YBe

    AccessKeyId、AccessKeySecret 获取,登录阿里云,鼠标放在头像上可以看到accessKey 管理,点进去就是了

    

小编封装了一套python脚本 ,http://yy123.ink/codeDetail/5

config中配置多个需要解析的域名:


model 配置数据库连接:


数据库中配置一个域名需要解析为那些二级域名或主记录域名:



部署

服务器安装好python3.x ,本套脚本只会进行一次域名解析,所以需要借助 linux crontab 定时任务 定时执行脚本

编写python 执行脚本 ddnsRuner.sh (小编为了防止 linux python 冲突的麻烦,python3使用的虚拟环境,以便隔离)

!/bin/bash
cd /opt/code
source env/bin/activate
cd ./ddns
python DDNS.py

crontab制定定时任务:

0 */1 * * * sh /opt/code/sysSchedul/ddnsRuner.sh &> /dev/null


项目文件下运行日志如下:

2020-07-07 04:00:21,951 - DDNS.py[line:111] - ERROR: www fail,reason The DNS record already exists.
2020-07-07 04:00:24,202 - DDNS.py[line:57] - INFO: {"type": "A", "ip": "113.104.239.59"}
2020-07-07 04:00:24,356 - DDNS.py[line:111] - ERROR: www fail,reason The DNS record already exists.
2020-07-07 04:00:25,478 - DDNS.py[line:57] - INFO: {"type": "A", "ip": "113.104.239.59"}
2020-07-07 04:00:25,632 - DDNS.py[line:111] - ERROR: blog fail,reason The DNS record already exists.
2020-07-07 05:00:01,953 - DDNS.py[line:93] - INFO: DDNS service running...
2020-07-07 05:00:04,122 - DDNS.py[line:57] - INFO: {"type": "A", "ip": "113.104.236.122"}
2020-07-07 05:00:04,749 - DDNS.py[line:109] - ERROR: ddns:success!
2020-07-07 05:00:05,881 - DDNS.py[line:57] - INFO: {"type": "A", "ip": "113.104.236.122"}
2020-07-07 05:00:06,732 - DDNS.py[line:109] - ERROR: blog:success!
2020-07-07 05:00:07,811 - DDNS.py[line:57] - INFO: {"type": "A", "ip": "113.104.236.122"}
2020-07-07 05:00:08,379 - DDNS.py[line:109] - ERROR: pay:success!


路由器不一定独立绑定了外网IP,此时联系运营商客服处理


有问题请加页脚下方 qq群沟通












分享到: