标签归档:脚本

Mikrotik动态更新从PPPOE获得的dns服务器

手里的那只RB750Gr3之前给几个出租屋的房间配置dhcp的时候,都是将客户端的dns指向RB750Gr3自己作为网关的ip地址,这样,RouterOS会作为一个DNS代理,查询和缓存DNS请求。这样设置其实没啥问题,只是这几天又突发奇想,想着要不直接分发运营商的DNS服务器地址给用户,如此一来,可以稍微的降低一下路由器的负载(其实没多少)。

Mikrotik的脚本功能其实比较强大,但是相关的文档就惨不忍睹,好在论坛上有好心人回答问题,给我提供了一些思路。以下是我写的脚本。

:local dynamic (([/ip dns print as-value]) -> "dynamic-servers" );
:local dns

:set dynamic [:tostr $dynamic]

:for i from=0 to=([:len $dynamic] - 1) do={ 
 :local char [:pick $dynamic $i]
 :if ($char = ";") do={
  :set $char ","
 }
 :set dns ($dns . $char)
}

/ip dhcp-server network set [ find comment=UserNet ] dns-server=$dns

简单的解释以下脚本内容:

  • 1.从/ip dns里面读取“dynamic-servers”的内容,这些ip地址是pppoe拨号之后,从pppoe服务器上获取到的。
  • 2.要将dynamic的内容填充到dhcp-server里面,但是因为读取到的内容是一个array,用”;”分隔,没法直接套用,所以,需要转换成string类型。
  • 3.然后将”;”替换成”,”,然后就可以在修改配置的命令行里面调用了。
  • 因为配置里面,包含了多个dhcp-server,而我不需要修改全部的network的配置,所以,我给需要修改配置的network,写了一个备注,内容是“UserNet”。这样脚本就会只修改备注内容是“UserNet”的network配置了。

脚本做好之后,就是调用了,可以选择定时执行脚本或者是在pppoe会话起来的时候执行,我选择的是在pppoe会话起来的时候执行。找到pppoe调用的ppp profile,在scripts里面调用就行了。