疫情期间为了看剧,搭了个只能通过WireGuard内网访问的DNS流媒体解锁服务器,但是这个服务器的公网IP是动态IP,为了方便连接,自己配了DDNS,但是发现RouterOS不会自动更新DDNS解析IP,只好自己写个脚本用计划任务定期更新RouterOS上的WireGuard Endpoint IP。

WireGuard DDNS更新脚本

单接口单Peer脚本

单接口且单个Peer,可以通过查找指定接口名,并更新接口Peer的IP。

:local wgInterface
:local wgPeerDns

:set wgInterface "your_interface_name"
:set wgPeerDns "your_ddns_domain"

:if ([interface wireguard peers get number=[find interface="$wgInterface"] value-name=endpoint-address] != [resolve $wgPeerDns]) do={
  interface wireguard peers set number=[find interface="$wgInterface"] endpoint-address=[/resolve $wgPeerDns]
}

单接口多Peer脚本

如果WireGuard接口有多个Peer,可以给每个Peer添加Comment,然后通过Comment找到指定Peer并更新其IP。

:local wgPeerComment
:local wgPeerDns

:set wgPeerComment "Peer #1 Comment (Your comment)"
:set wgPeerDns "your_ddns_domain"

:if ([interface wireguard peers get number=[find comment="$wgPeerComment"] value-name=endpoint-address] != [resolve $wgPeerDns]) do={
  interface wireguard peers set number=[find comment="$wgPeerComment"] endpoint-address=[/resolve $wgPeerDns]
}

脚本及计划任务权限

本着不提供不必要权限的原则,给脚本和计划任务设置了Read、Write、Test权限。

DDNS更新脚本 权限
DDNS脚本计划任务 权限

相关参考资料

https://blog.spaps.de/mikrotik-routeros-wireguard-dynamic-dns-endpoint-refresh/