RouterOS 的 Cloud 其实是支持 Push IPv6 地址的,会很“智能”的推送默认 IPv6 的前缀地址,但如果网络环境是多线的情况下,这个智能就显得比较鸡肋。所以我们一般把 Cloud 的 IPv6 Support 关掉,找第三方的服务去做 DDNS。
如何干掉 ROS 原生的 DDNSv6
以下脚本可以帮助你将 ROS 某个接口的 IPv6 地址,推送给 HE.NET 的 DDNS 上。这是完全依赖 ROS 命令和 HE.NET 官方接口的,无需借助第三方服务器,安全可靠。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| :global hostname "xxxx.ddns6.16iot.cn" :global password "p@ssw0rd2022" :global intv6 "pppoe-out"
:log info ("[ipv6_ddns]" . $intv6 . " is running.") :global "address_v6" [/ipv6 address get [find interface=$intv6 global ] address ] :global "my_ipv6" [:pick $"address_v6" 0 [:find $"address_v6" "/"]]
:if ([:len $"my_ipv6"] >8) do={ :log info ("[ipv6_ddns]" . $intv6 . " ipv6 address is " . $"my_ipv6") :global "recode_now" [:resolve $hostname] :log info ("[ipv6_ddns]" . $hostname . " AAAA record is " . $"recode_now") :if ($"recode_now" !=$"my_ipv6") do={ :log info ("[ipv6_ddns]" . $hostname . " begin to change AAAA record") :global "ddns_status" [/tool fetch url="https://dyn.dns.he.net/nic/update" http-data="hostname=$hostname&password=$password&myip=$"my_ipv6"" output="none"] :delay 5s :log info ("[ipv6_ddns]" . $hostname . " : the record has changed") } else={ :log info ("[ipv6_ddns]" . $hostname . " : the record has not changed") }; } else={ :log error ("[ipv6_ddns]" . $intv6 . " ipv6 address is less than 8") };
|
解释:
- hostname:域名,就是你要把 AAAA 记录推给谁。这个记录一定是 HE.NET 已经有的记录。
- password:更新密码,HE.NET 记录更新密码。
- intv6:哪个接口,就是你要把哪个接口的 IPv6 地址推给域名。
解释 2:
- Q:要把域名的 DNS 换到 HE.NET 吗?
A:并不需要把主域加给 HE,你可以把某个子域委派给 HE.NET,例如我的 ddns6.16iot.cn,这个意思就是说,*.ddns6.16iot.cn 只有这一个子域是给 HE 管理的。


- Q:更新密码要怎么找?
A:在 HE.NET 控制台进行设置。HE.NET 注册地址:https://dns.he.net/

- Q:ROS 要更新的接口在哪看?
A:WinBox 可见,位置在 IPv6/Address。如下图,接口名称就是:pppoe-out

- Q:脚本放哪?
A:System/Scripts 这个位置。