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 管理的。
    20220213014434
    20220213014155
  • Q:更新密码要怎么找?
    A:在 HE.NET 控制台进行设置。HE.NET 注册地址:https://dns.he.net/
    20220213014555
  • Q:ROS 要更新的接口在哪看?
    A:WinBox 可见,位置在 IPv6/Address。如下图,接口名称就是:pppoe-out
    20220213014837
  • Q:脚本放哪?
    A:System/Scripts 这个位置。