系列文章:
1、原理 :局域网自己搭建服务器之DDNS(动态域名解析),基于阿里域名api+python实现
4、frp 0.52.3 内网穿透配置(nginx+frp)及ipv6内网穿透介绍 (frp模式无需配置路由)
背景
一般家里的内部网络都是通过路由器然后再接几台电脑。这种结构只有路由器有一个公网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,此时联系运营商客服处理。
比如默认情况下可以看到电信光猫的IP是一个内网IP,这是因为电信使用了虚拟地址,此时联系10000要求绑定为外网IP就好
有问题请加页脚下方 qq群沟通