好久没来了,送个礼:ROS动态域名+UPNP脚本
:if (=1) do={:log info "DDNS: Creating Dynamic DNS update system."
:beep frequency=500
:global username "yourusername"
:global password "yourpassword"
:global domainname "yourdomainname"
:global domainzone "yourdomainzone"
}
:if (="") do={
:beep frequency=500 length=2s
:delay 4
:beep frequency=500 length=2s
:log warning "DDNS: No PPPoE is running."
} else={
:set intLocal [ /interface find type=pppoe-out running=yes ]
:set ipResolve ([:resolve ($domainname . "." . $domainzone)] . "/32")
:set ipLocal [ /ip address get [ /ip address find interface=$intLocal ] address ]
:if ($ipLocal != $ipResolve) do={
:log info ("DDNS: Resolved IP address : " . $ipResolve )
:log info ("DDNS: Local IP address : " . $ipLocal )
:log info ("DDNS: Sending Dynamic DNS update to server")
/tool dns-update zone=$domainzone name=$domainname key=$password key-name=$username address=[:pick $ipLocal 0 ([:len $ipLocal] - 3)]
/ip upnp set enabled=no
:delay 2
/ip upnp interfaces remove
/ip upnp interfaces remove
:delay 2
/ip upnp interfaces add interface= name] type=external
/ip upnp interfaces add interface=LAN type=internal
:delay 2
/ip upnp set enabled=yes
/ip upnp set allow-disable-external-interface=no
/ip upnp set show-dummy-rule=no
:delay 2
/ip fi man set dst-address=$ipLocal
:beep frequency=500
}
}简单说明一下作用:
由于我使用的是包小时的宽带,但又想包月上网,所以就使用别人的宽带帐号了。这样我就不得不在ros里添加大量pppoe-client,说不定哪个就能播上去,也说不定哪个就会掉线了。掉线之后WAN IP也随着变化,接着UPNP就会失效,所以我编写了这个脚本。这个脚本能够发现外网IP变化之后,进行域名更新,并重新开启UPNP,pppoe失效蜂鸣提示;使用大概一年了,没什么问题,发上来与各位探讨一下。
注意,我是直接在scheduler里添加的,并没有在scheduler 添加个计划任务,然后计划任务的内容是运行xxx脚本,我觉得这样很是多次一举,为什么不直接新建个计划任务然后内容就是要执行的脚本呢?还有“:if (=1) do={”这句话表明了,计划任务一定要命名为"DDNS"才能顺利执行。
简单说明下原理::if (=1) do={ //如果是第一次运行,则执行下面初始化,蜂鸣并记录日志
:log info "DDNS: Creating Dynamic DNS update system."
:beep frequency=500
:global username "yourusername"
:global password "yourpassword"
:global domainname "yourdomainname"
:global domainzone "yourdomainzone"
}
:if (="") do={ //如果没有拨号成功的pppoe-client,蜂鸣并记录日志
:beep frequency=500 length=2s
:delay 4
:beep frequency=500 length=2s
:log warning "DDNS: No PPPoE is running."
} else={ //否则(就是有拨号成功的pppoe-client)执行下面代码
:set intLocal [ /interface find type=pppoe-out running=yes ] //返回成功拨号的pppoe-client接口索引
:set ipResolve ([:resolve ($domainname . "." . $domainzone)] . "/32") //解析域名对应IP
:set ipLocal [ /ip address get [ /ip address find interface=$intLocal ] address ] //获得拨号成功的pppoe-client接口IP
:if ($ipLocal != $ipResolve) do={ //如果获得的IP和解析的IP不一致
:log info ("DDNS: Resolved IP address : " . $ipResolve )
:log info ("DDNS: Local IP address : " . $ipLocal )
:log info ("DDNS: Sending Dynamic DNS update to server") //记录日志
/tool dns-update zone=$domainzone name=$domainname key=$password key-name=$username address=[:pick $ipLocal 0 ([:len $ipLocal] - 3)] //进行域名更新
/*
[:pick $ipLocal 0 ([:len $ipLocal] - 3)]
这句的作用是去掉$ipLocal变量中后面的3个字符,在程序里就是去掉例如"111.222.33.44/32"后面的"/32"
这个位置当时留下个小问题,如果获得的子网掩码是"/8"之类的(2位字符宽度),那么可能会连IP最后一位一同去掉,但在我这里不会发生这个问题,所以也没考虑。
用:find是不是可以解决这个问题我没有试验。
*/
/ip upnp set enabled=no //关闭UPNP
:delay 2
/ip upnp interfaces remove
/ip upnp interfaces remove //删除UPNP内、外接口
:delay 2
/ip upnp interfaces add interface= name] type=external //添加拨号成功的接口为UPNP外接口
/ip upnp interfaces add interface=LAN type=internal //添加LAN接口为UPNP内接口
:delay 2
/ip upnp set enabled=yes //重新启用UPNP
/ip upnp set allow-disable-external-interface=no //设置“允许关闭外部接口”为no
/ip upnp set show-dummy-rule=no //啊!这个?!不明白,望高人赐教。。。。。。
:delay 2
/ip fi man set dst-address=$ipLocal //这个,更改回流的外网IP,回流我使用manage做的,我想这样比较好,这个下次再说
:beep frequency=500
}
} 忘了说了,我的ROS是2927,置顶那个。 怎么没有用。我前面的没有用。只有后面的UPNP没有反应 弄个3.0能用的动态域名啊。。。 看看怎么样.
页:
[1]