ROS+DNSPod实现动态内网IP端口映射+DDNS笔记

/

前言:

为什么需要动态内网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服务商等。总之选择自己最合适的就好了。

参考文章:

1. ROS软路由 | ROS动态IP映射端口

2. 利用DNSPod实现动态域名解析DDNS

Chris 2020.9.26


Leave a Reply

Your email address will not be published. Required fields are marked *