计算化学公社

标题: 一个低成本实现动态IP映射到固定域名(DDNS)的稳定python脚本 [打印本页]

作者
Author:
独舞的印迹    时间: 2021-6-7 23:46
标题: 一个低成本实现动态IP映射到固定域名(DDNS)的稳定python脚本
本帖最后由 独舞的印迹 于 2021-6-8 00:02 编辑

零:介绍

0.1:18年左右老板受够了某壳不稳定的DDNS服务后让我写的小脚本。刚写完的那一年出过很多bug,修修补补之后,已经稳定运行一年多了。老板多次怀疑我的脚本有问题,事实证明不是断网就是断电了。本人编程水平有限,代码不怎么优美,大佬轻喷。


0.2:
这个帖子除了分享之外,也是为了给实验室以后进来的同学写的,所以会比较啰嗦。

0.3:IP是指形如171.123.5.123的这种地址,计算机接入互联网后就会获得一个ip地址,通过这个地址就可以远程访问计算机。DDNS抽象的作用是指将动态的公网ip映射到一个固定的域名上去。大白话就是可以通过域名访问你的机子,前提是你的机子有公网IP,这个公网IP是动态的公网IP,不付费的公网ip都是动态的,隔几天就变一次。(静态公网IP就不会变,但是巨贵)

一:运行环境
1.1:本脚本使用python3编写,本人使用过python3.7.1/3.7.5/3.7.9运行该脚本,均可运行,理论上3以上的版本都可以。

1.2:一台装有centos且长期不关机断网的服务器。

1.3:本脚本使用centos的计划任务表运行,其他linux发行版本理论上可以使用,其中一些设置可能与centos不同。

1.4:只能在阿里云上购买的域名才可以使用本脚本。

1.5:安装阿里云的sdk


pip3 install aliyun-python-sdk-alidns
pip3 install aliyun-python-sdk-core-v3



二:准备公网IP和端口映射
(确定已有公网ip且可以正常访问的略过)
2.1:准备(动态)公网ip。没有公网ip的同学可以拨打宽带运营商请求开通(动态)公网ip,已知成都电信开通公网ip打客服电话就可以,非常顺利;郑州电信需要写一大堆材料,然而最终还是没开通。


2.2:(非必须,但强烈推荐此选项)建议在路由器中进行PPPOE拨号(即在路由器中输入宽带账号和密码然后联网),这样做即网络稳定又避免多次端口映射。正常来讲在路由器中拨号需要打宽带客服给你的账号授权之后才可以,可以让装维师傅上门操作(实测电信可以)。


2.3:在路由器中找到端口映射、虚拟服务器、外网访问之类的功能(一般都有,如果没有的话得换路由器),将需要外网访问的机子的内网IP添加端口映射到某个非80的端口,如22。不会的可以搜关于端口映射的教程,非常简单。映射完之后可以通过外网ip+你映射的端口访问一下计算机,被映射的计算机是linux的同学直接用xshell之类的连接,被映射的计算机是win的同学可以手机下载个Microsoft Remote Desktop连。能连上这一步就算成功了。
#查询内网ip,形如192.168.1.xxx的为内网ip,192.168.1.1一般是网关,不是内网ip,别认错了。
ifconfig



2.4:只要有一台服务器运行本脚本就可以,同网络下的其他服务器只需要添加端口映射就可以。
三:购买域名和提取密钥
(已有的略过)
3.1:在阿里云上买个域名,选择那种几块钱的域名就行,按照提示进行实名认证。域名续费会涨到几十块每年,第二年可以再申请一个新域名。


3.2:添加一条域名解析。进入控制台-点击域名-点击你购买的那个域名-点击左侧的域名解析-点击添加解析-记录类型为A;主机记录(RRKeyWord)为www(这里是举个例子,其实任意英文字符串都可以);线路默认;记录值随意填一个IP(如:203.184.132.226),不要填你的ip,这里仅仅是为了下一步提取这条主机记录的ID;TTL用默认的,右下角保存。
(, 下载次数 Times of downloads: 110)

3.3:提取3.2中设置的解析记录的ID。进入这个网址-点击调试按钮-在DomainName中输入你的域名(如:mywebsite.com);在RRKeyWord中输入你的主机记录(3.2中设置的)-点击发起调试-下面会输入一个json格式内容,其中会有"RecordId": "00000000000030848"字段,记录下这串值。
(, 下载次数 Times of downloads: 108)

3.4:进入这个网址-点击关于AccessKey的获取-(可能会出来个安全提示,点击继续使用AccessKey就完事了)点击创建AccessKey-按照提示创建,并记录下accessKeyId和accessSecret。


四:使用脚本
4.1:修改参数。用文本编辑器打开updateip.py文件,将第一行中的路径改为要运行这个脚本的服务器的python3路径;accessKeyId和accessSecret填入第11行accessKey=['填这里','填这里']中;将RecordId填入第12行RecordId='填这里'中;将主机记录填入第13行RR='填这里'中;保存,上传到服务器。在服务器上运行一次这个脚本,看看能不能运行成功。


#查找python路径
which python3

4.2:将脚本添加到系统任务中。
#打开任务计划表
crontab -e
#添加计划,1代表每1分钟运行一次该脚本;第一个路径为python3的路径;第二个路径为本脚本的路径
*/1 * * * * /usr/local/anaconda3/bin/python3 /your_path/updateip.py


4.2:检查任务表是否启动。

#等待一分钟,打开当前用户的mail,没有报错就没问题
vi /var/spool/mail/当前用户
(, 下载次数 Times of downloads: 101)


4.3:进行最后的修改。将运行脚本的周期修改为5分钟,且由于任务计划功能每次运行都会给用户发mail,时间久了会打,因此添加参数禁止发邮件。保存退出。
#打开任务表
crontab -e
#添加以下内容
*/5 * * * * /usr/local/anaconda3/bin/python3 /your_path/your_file.py >/dev/null 2>&1

4.5:大功告成!


研二开学要评奖学金,做实验的组的同学蹭了一大堆一区二区的二作,然鹅我还没有一篇,要哭了。所以想问一下各位大佬,实现这种小功能的脚本能申请软件著作权吗?我写了一大堆这种脚本。












作者
Author:
sobereva    时间: 2021-6-8 06:59
著作权申请不了,代码量不够
作者
Author:
abin    时间: 2021-6-8 07:45
我的简单用法是,
买一个阿里云机器,学生价5元的那种,
会有一个公网IP。

服务器上,连接阿里,建立ssh通道。

然后经由阿里跳转已经建立的ssh通道。

不过这个方案,使用微软平台,
可能比较麻烦,估计MobaXterm能支持。

Mac Linux下面都是一行指令的事情。
作者
Author:
独舞的印迹    时间: 2021-6-8 08:23
abin 发表于 2021-6-8 07:45
我的简单用法是,
买一个阿里云机器,学生价5元的那种,
会有一个公网IP。

你说的这种是内网穿透吗?之前用nps之类的工具搞过内网穿透,但是学生机带宽太低了,稍微加点带宽就是一个月几百。
作者
Author:
独舞的印迹    时间: 2021-6-8 08:29
sobereva 发表于 2021-6-8 06:59
著作权申请不了,代码量不够

懂了,谢谢卢老师

作者
Author:
abin    时间: 2021-6-8 09:22
独舞的印迹 发表于 2021-6-8 08:23
你说的这种是内网穿透吗?之前用nps之类的工具搞过内网穿透,但是学生机带宽太低了,稍微加点带宽就是一 ...

ssh tunnel

你的方案很棒哦。

某些路由器 就有DDNS功能, 注册一个服务就可以用了。

作者
Author:
Accelerator    时间: 2021-6-8 15:26
内网穿透我的做法是购买阿里云服务器(每年20左右)结合frp,每台机器都可以通过这台阿里云服务器的IP结合不同端口来进行访问,非常方便。
作者
Author:
biogon    时间: 2021-6-9 08:25
内网穿透还可以用zerotier这样的p2p穿透,传输速度取决于网络上行速度,一般是比租用服务器要快很多的,有没有公网ip都能搞
作者
Author:
123qwertybobo    时间: 2021-6-9 23:11
Accelerator 发表于 2021-6-8 15:26
内网穿透我的做法是购买阿里云服务器(每年20左右)结合frp,每台机器都可以通过这台阿里云服务器的IP结合 ...

现在20可没有了吧?当然这个方案比较安全。
作者
Author:
liyuanhe211    时间: 2021-6-10 00:56
用免费的DDNS服务,比如www.dynu.com等(这个官网需要梯子,但是后续解析不要梯子,使用四年稳定),也有对应的API,稍微修改一下脚本POST就可以了。不用花钱,而且不用阿里云管你要身份证这些幺蛾子。小缺点是只有二级域名(比如xxxxxx.dynu.net),不过没什么大影响。

路由器没有公网IP的话(或者不愿意折腾动态IP这一套的话)推荐Zerotier,形式上形成了内网固定IP,可以基本跑满带宽(200Mbps网络15 MB/s左右)




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3