RouterOS搭建私有DDNS服务
这个突发奇想,又让RouterOS来完成不正经的事情!
DNS实际就是将域名和IP地址绑定,DDNS就是动态DNS,需实时自动的更新域名和IP的绑定关系,通常动态获取IP的主机需要实时的向DDNS服务器上报自己的IP,如果IP变动,就更新该主机域名的IP地址。
按照这个思路,首先DDNS服务器,需要为绑定域名做A记录解析,RouterOS的DNS是支持的是static下配置A记录的,那我们要求节点的RouterOS上报自己的IP地址,如果变动就修改DNS下的A记录IP。下面是通过RouterOS完成一个私有域名的DDNS解析操作拓扑:
上面拓扑是节点RouterOS是动态公网IP,客户端RouterOS需要通隧道连接到节点,假设在没有其他DDNS服务器的情况下,建立私有的DDNS域名解析,私有域名为yus.ros,通过搭建一台RouterOS作为DDNS服务器。
在设计时,上报IP我最先想到的是通过fetch提交,因为ddns提交都用这个,但这个方式需要RouterOS打开FTP服务,并上传文本,感觉不安全,操作繁琐。要让DDNS知道节点RouterOS的IP地址,其实可以建立一个pptp、l2tp或者sstp隧道,在DDNS RouterOS上搭建隧道服务器,通过caller-id来判断节点RouterOS的IP是否变动,而且ppp profile有现成的登录脚本触发功能,caller-id变了就去改A记录,每个用户在ppp下创建一个账号,并给账号加上comment注释记录IP。
节点RouterOS和DDNS RouterOS之间沟通解决了,有人会说这个不是公共的DNS服务器,如何完成公网的域名解析,域名我采用的是私有域名,只能在这套RouterOS网络完成,客户端的RouterOS需要将私有域名转发到DDNS RouterOS上,仅仅需要通在IP DNS 下配置FWD转发就ok。
特别说明:
虽然有MikroTik官方的cloud功能,但有时候还是需要一套自己的解决方案,这套DDNS解析设计目的建立一个区域网络的私有服务上,仅仅是私有域名解析,非公共域名解析,请大家一定要明白是私有DDNS,例如一个企业多个异地办公之间的DDNS服务,建立一个内部私有域名解析,也就是建立一个内部的DDNS服务,当然也可以继续扩展就看各位如何发挥。
DDNS RouterOS配置
作为DDNS服务的RouterOS,首先需要一个固定的公网IP地址,建立隧道服务,这里我选择的是SSTP,这个实例中DDNS的IP假设是2.2.2.2,在实际应用中可以找一台VPS。
配置sstp服务器,用户客户端上报连接IP,先创建一个profile,local address随便写,remote-address也可以随便创建一个pool的地址池(/ip pool下创建),能不能上网不是重要,只要连通到RouterOS就行,上报下对端的IP。
限制账号仅能同时登录一次和带宽
在ppp secret创建账号a1(账号名称可以和后面使用到的域名对应),设置密码123,并添加一个comment注释预设值IP地址 9.9.9.9:
启用SSTP服务,当然可以选择其他隧道PPTP、L2TP等,根据自己网络环境配置
隧道服务搭建完成后,进入IP DNS配置DNS缓存和添加A记录
- 开启allowed remote request
- 进入static
- 点加号添加一个记录,与账号a1对应,设置a1.yus.ros的私有域名,如果有多个账号可以依次与域名对应。
- 初始化a1.yus.ros的A记录IP地址为9.9.9.9,TTL值我修改为1小时,尽量缩短时间。
DNS配置完成后,就是编写脚本,在system script下,创建一个ddns脚本
脚本如下:
:local oldip [/ppp secret get [find name="$user"] comment] :log info "oldip = $oldip" :log info "current remote is $"remote-address"" :log info "current caller ip is $"caller-id"" :log info "current user is $user" :if ($oldip != "$"caller-id"") do={ :log info "dns ip has changed!" /ppp secret set [find name=$user] comment="$"caller-id"" :log info "file has changed!" :foreach n in=[/ip dns static find name=($user . ".yus.ros")] do={ /ip dns static set $n address=$"caller-id" log info "IP updated" } } else={ :log info "$user's ip is not change!"}
然后把这个脚本添加到ppp profile的ddns规则的on-up脚本下
DDNS的RouterOS配置完成。
节点RouterOS
节点RouterOS只需要配置连接到DDNS RouterOS的隧道客户端即可。如果你是多线出口的话,需要在ip route下配置静态路由,将2.2.2.2的DDNS服务器IP走指定出口访问,以便DDNS RouterOS记录到正确的出口IP。
连接DDNS服务器,并配置账号和密码分别是a1和123
节点RouterOS配置完成
客户端RouterOS
客户端RouterOS只需要将域名a1.yus.ros解析转发到2.2.2.2服务器,同样需要客户端RouterOS在ip dns下启用allowed-remote-request
由于节点RouterOS是动态IP,客户端需要连接节点RouterOS的隧道协议,就可以使用a1.yus.ros这个域名进行访问,
这个算不算建立了软件定义网络的概念,个人感觉也很模糊,但至少RouterOS提供的这些功能是可以组合在一起,达到我们想要的结果。