preface
DDNS 的概念我在前面的文章已经写过了,这篇文章来讲一下在内网里面如何用 DDNS 服务
DDNS 一般是针对不固定的公网 ip 来使用的,注意,即使不固定 ip ,但是这 ip 也是公网的,意味着可以通过互联网直接访问。
我在学校里有时会有这种需求:远程访问我在实验室中的电脑,例如我的笔记本开着 jupyter notebook,然后我此时不在实验室,但又想用一下 python ,我就会用我的 iPad 去连接我的笔记本,这样我就可以访问 jupyter notebook ,在这个过程中,我需要知道我电脑的 ip 地址和端口号,端口号好记,但是 ip 可能是变化的,因为 ip 地址有租期,运气不好 ip 地址变了的话我就连不上了。其实只需要一个域名就能解决这个问题。
看了一些博客和资料之后,我发现原来 DDNS 服务还可以对内网使用,也就是说先获取设备的局域网 ip 再利用 API 获取运营商处域名解析的 ip ,如果发现两者不一样也就是 ip 变化的话就更新域名指向的 ip ,一些路由器上是有这个功能的,我的也有,但是找不到脚本在哪里修改,就去阿里云社区找了个脚本,但这是针对公网的 ipv4 写的脚本,我要修改成内网的脚本,看了小茗大佬的博客,主要就是下面这行(我们学校的局域网是 172 开头的网段)
ifconfig | grep inet | grep -oE '172\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | head -n1
脚本已经上传,可以在我的 GitHub 仓库获取
步骤一,先去买一个域名,然后添加一条指向设备 ip 的记录。步骤二,在需要访问的设备上运行 DDNS 脚本,需要申请阿里云的 AccessKey,然后根据脚本的提示填写相关信息就行了
然后肯定要添加到定时任务了,不然脚本只会运行一次就退出了,达不到 DDNS 的效果,所以通过 Linux 的 crontab 来实现定时任务,就 5 分钟运行一次吧
*/5 * * * * sh /usr/sbin/aliyun_ddns_local.sh run >/dev/null 2>&1
然后不论在哪里,只要接入了校园网,在浏览器中输入我的域名就可以访问到我笔记本中的 jupyter notebook,不管我笔记本的 ip 有没有变,方便了不少
bonus
开始的时候,我在我的路由器上做的实验,路由器 wan 口连接着校园网,ip 是 172.xx.xx.xx ,经过路由器 NAT 转换之后,内部的 ip 是 192.168.xx.xx ,所以我解析的是 172 开头的 ip,这样我可以 远程访问我路由器的管理界面,但是解析之后发现访问不了,一直找原因,最后发现是没有进行端口转发,哎,经过 NAT 转换了,192.168 开头的 ip 段对于校园网来说就相当于是内网了,是无法访问内部的,所以要将路由器的 80 端口映射出来,让外网能够访问,很多内网服务都需要用到端口转发才能被外网访问
attention
有些路由器默认的 shell 是 ash ,用./
方式运行脚本就是用 ash 运行脚本,会报错,要用 sh xx.sh
来运行,马的,这个问题我找了好久,最后发现是 ash 的原因。。
reference
https://blog.51cto.com/11555417/2406781
https://szu17dmy.github.io/site/misc/secure_public_wireless_network_at_school_szu/