前言:
为什么需要动态内网IP端口映射和动态域名解析?和内网穿透的比较?
- 在家庭宽带有公网IP的时候,实现远程通过固定域名+端口号来访问家庭局域内网服务:如NAS,监控设备,SSH某设备等。
- 只有在无公网IP的情况才需要做内网穿透,必须依赖第三方服务器(包括自己VPS搭建服务或诸如花生壳等提供的服务,特别是后者提速/绑定自己的域名都要加$),所以有条件的尽量获取公网IP做DDNS才是最佳方案。
一、本地环境:
- ESXi: ROS+OPENWRT
- Pubic IP (必须!否则需要做内网穿透。)
- Domain Service (managed by DNSPod)
二、需要的软件:
- WinBox
- SSH/SFTP Client
三、ROS下建立动态内网IP端口映射
这一步的目的就是即便你的公网IP在变动,也能够实现与内网IP端口映射的自动更新绑定。
1、运行WinBox建立端口映射:IP –> Firewall –> NAT,添加一条dstnat策略,目标地址查询并填入自己的公网IP,目标端口填写映射后公网端口 (如 xxx.xxx.xxx.xxx : xx) 。
2、Action选项卡下:Action选择dst-nat,地址和端口选择需映射的内网服务的IP和端口(如192.168.1.yyy : yy),并且为其添加一条评论备注。至此公网和内网服务的端口映射已经建立。
xxx.xxx.xxx.xxx : xx <–>192.168.1.yyy : yy
3、由于国内普通家庭宽带即便有公网IP也非固定的,所以端口映射建立好之后需要利用脚本实现公网动态IP地址与内网服务的绑定。WinBox中选择System –> Scripts,新建一个脚本,脚本名称自定义,如scr1,插入以下代码,并按图修改PPPoE名称和防火墙策略评论备注 (如pppoe-out1, comment1)。
:global ipaddr [/ip address get [/ip address find interface=pppoe-out1] address]
:set ipaddr [:pick $ipaddr 0 ([len $ipaddr] -3)]
:global oldip [/ip firewall nat get [/ip firewall nat find comment="comment1"] dst-address]
:if ($ipaddr != $oldip) do={
:log info [/ip firewall nat set [/ip firewall nat find comment="comment1"] dst-address=$ipaddr]
}
4、WinBox选择System –> Scheduler,新建一个Schedule: 按照下图设置,启动时间为开机自启动,运行脚本间隔按照自己需求填写(推荐1分钟-5分钟,根据自己需求制定),执行计划添加下面的代码,并将引号内的文本改为上一步中设定的脚本名称,如scr1。
:execute "scr1"
到此动态内网IP端口映射完成。下一步需要实现DDNS。
四、利用DNSPod实现动态域名解析
这里只写DNSPod的方法,域名在哪里买的不重要,只要能讲域名解析服务托管到DNSPod上就可以了。
1、注册登录DNSPod,将自己的域名解析服务器更换到DNSPod之后,进入DNSPod管理控制台 ,添加一条A记录,可以是直接解析主域名@,也可以添加子域名,记录值随便填写一个IP,如127.0.0.1。(这一步一定要做,因为后面的脚本是基于“更新”非“添加”解析。)
2、到DNSPod账号管理中心创建密钥添加API Token,妥善记录保管好自己密钥中的ID和Token,因为它只会完整显示一次。
3、下载ArDNSPod客户端并修改配置文件:
项目地址:https://github.com/imki911/ArDNSPod
备份存档:
解压后只需要 ddnspod.sh 和 dns.conf 两个文件,首先利用文本编辑器配置dsn.conf:arToken键入上一步中DNSPod中密钥信息,arDdnsCheck中的两项分别填入你的主域名和子域名(如果是直接解析则删掉“subdomain”即可)
# 1. Combine your token ID and token together as follows
arToken="12345,7676f344eaeaea9074c123451234512d"
# 2. Place each domain you want to check as follows
# you can have multiple arDdnsCheck blocks
arDdnsCheck "test.org" "subdomain"
4、将 ddnspod.sh 和编辑好之后的 dsn.conf通过SFTP传到openwrt的系统中,如/root路径。可以通过以下代码测试脚本:
sh /root/ddnspod.sh
如果一切顺利脚本将会自动获取本机公网IP并通过API更新DNSPod上域名的解析记录值,如下图(@记录,初始解析为127.0.0.1已更新公网IP成功):
5、利用crontab实现计划任务,定期自动更新dns,实现DDNS功能。
关于crontab:
centOSs安装cron
yum install vixie-cron
yum install crontabs
ubuntu安装cron
apt-get install cron
启动:service cron start
检查状态:service cron status
重新启动:service cron restart
查询cron可用的命令:service cron
查看用户计划:crontab -l
编辑crontab:crontab -e
首先编辑计划任务的配置,执行:
crontab -e
如提示需要选择的文本编辑器,按需选取即可,加入如下代码:
*/5 * * * * sh /root/ddnspod.sh
#具体规则不再细说,有兴趣的可以查看说明文档。
#第一个参数*/5代表每5分钟执行一次后面的命令,即每5分钟检测并更改DNS记录。按需更改。
#sh文件的绝对路径也按需更改。
编辑完成后,退出文本编辑器,执行:
service cron restart
到此就实现了动态内网IP端口映射及DDNS所有配置,并且根据自设的时间间隔进行自动更新。可以利用域名加端口的方式访问内网服务了。
五、结语
本文只是对自己实机配置进行一次整理记录,方法借助于各位互联网大佬。
当然还有其他实现方案,如阿里云的域名管理直接对接ROS脚本,又或者国外有免费的DDNS服务商等。总之选择自己最合适的就好了。
参考文章:
Chris 2020.9.26
Leave a Reply