Скрипт обновления Dynamic DNS для Namecheap
Это скрипт для ROS 7 (если не ошибаюсь, команда fetch немного отличается в ROS 6), который проверяет, изменился ли IP для интерфейса, обновляет dynamic DNS на namecheap.com и отправляет вам об этом письмо. Как оказалось, он ещё и полезен, чтобы уведомлять меня, когда после отключения света снова появляется электричество или когда провайдер восстанавливает соединение после сбоя. В ROS теперь есть /ip cloud с собственным ddns от Mikrotik. С этим скриптом и Namecheap можно получить гораздо более крутой и короткий ddns-домен. А ещё это запасной вариант на случай, если /ip cloud вдруг перестанет работать.
Это мой первый скрипт здесь, так что пишите, если что-то можно улучшить. Я пока новичок в Mikrotik. Скрипт изначально взял с вики Mikrotik для другого ddns-провайдера и потом переделал под Namecheap. Инструмент для email надо настроить заранее. Просто поменяйте переменные на ваши. Ошибок при обновлении ddns или отправке почты не отслеживается. Запланируйте выполнение скрипта через нужные интервалы. Для pppoe его можно запускать и через up/down скрипты ppp профиля.
:local "NC_DDNS_SERVER" "dynamicdns.park-your-domain.com"
:local "NC_DDNS_HOSTNAMES_ARRAY" {"host1";"host2"}
:local "NC_DDNS_HOSTNAMES" [:tostr $"NC_DDNS_HOSTNAMES_ARRAY"]
:local "NC_DDNS_DOMAIN" "example.com"
:local "NC_TOKEN" "0123456789abcdef"
:local "TELEGRAM_SERVER" "api.telegram.org"
:local "TELEGRAM_KEY" "bot0123456789abcdef"
:local "TELEGRAM_CHAT_ID" "012345678"
:local "ISP_NAME" "My_ISP"
:local "WAN_INTERFACE" "pppoe-out1"
:local "LOG_FILE_PREFIX" "/disk1/logs/DDNS_NC."
:global "ddns_previous_ip"
:local "ddns_current_ip" [ /ip address get [/ip address find interface=$"WAN_INTERFACE"] address ]
:local "current_date" [/system clock get date]
:local "current_time" [/system clock get time]
:local "system_name" [/system identity get name]
:local "system_uptime" [/system resource get uptime]
:local "system_free_memory" [/system resource get free-memory]
:local "system_cpu_load" [/system resource get cpu-load]
:local "system_version" ("ROS " . [/system/package/get [find name=routeros] version])
# Убираем маску сети из IP-адреса
:set "ddns_current_ip" [:pick $"ddns_current_ip" 0 [:find $"ddns_current_ip" "/"]]
:if ([ :typeof $"ddns_previous_ip" ] = nil) do={ :global "ddns_previous_ip" "0" }
:if ([ :typeof $"ddns_current_ip" ] = nil) do={
:log info ("DDNS: На интерфейсе $"WAN_INTERFACE" нет IP-адреса, проверьте пожалуйста.")
} else={
:if ($"ddns_current_ip" != $"ddns_previous_ip") do={
:foreach hostname in=$"NC_DDNS_HOSTNAMES_ARRAY" do={
:log info ("DDNS: Обновляем $hostname.$"NC_DDNS_DOMAIN" с $"ddns_previous_ip" на $"ddns_current_ip"")
:local str "https://$"NC_DDNS_SERVER"/update?host=$"hostname"&domain=$"NC_DDNS_DOMAIN"&password=$"NC_TOKE N"&ip=$"ddns_current_ip""
#:log info $str
/tool fetch url=$str mode=https dst-path=($"LOG_FILE_PREFIX".$hostname)
}
#:log info $"NC_DDNS_HOSTNAMES"
:log info "DDNS: Отправляем Email"
/tool e-mail send to=myself@example.com subject="$"ISP_NAME" IP $"current_date" $"current_time" $"system_name"" body="$"system_name" $"current_date" $"current_time"\r$"system_version"\rNamecheap: $"NC_DDNS_HOSTNAMES"\rДомен: $"NC_DDNS_DOMAIN"\r$"ISP_NAME" IP: $"ddns_current_ip"\rПредыдущий IP: $"ddns_previous_ip"\rВремя работы: $"system_uptime"\rСвободная память: $"system_free_memory" kb\rЗагрузка CPU: $"system_cpu_load" %"
:log info "DDNS: Отправляем Telegram"
:local str "https://$"TELEGRAM_SERVER"/$"TELEGRAM_KEY"/sendMessage?chat_id=$"TELEGRAM_CHAT_ID"&parse_mode=Markdown&text=$"ISP_N AME" $"system_name" $"system_version"%0ANamecheap: $"NC_DDNS_HOSTNAMES"%0AДомен: $"NC_DDNS_DOMAIN"%0A$"current_date" $"current_time"%0A$"ISP_NAME" IP: $"ddns_current_ip"%0AПредыдущий IP: $"ddns_previous_ip"%0AВремя работы: $"system_uptime"%0AСвободная память: $"system_free_memory" kb%0AЗагрузка CPU: $"system_cpu_load" %"
#:log info $str
/tool fetch url=$str mode=https keep-result=no
:global "ddns_previous_ip" $"ddns_current_ip"
} else={
:log info "DDNS: IP не изменился. Обновление не требуется."
}
}
Ниже фрагмент кода для обновления DNS Digitalocean через их API. Можно использовать его вместо Namecheap в скрипте выше или одновременно с ним. Будем надеяться, что идентификаторы записей DO DNS остаются постоянными.
# Только recordid(s) из DO_DDNS_RECORDID_ARRAY используются в DNS API Digitalocean.
:local "DO_DDNS_RECORDID_ARRAY" {"host1"=123456789;"host2"=987654321}
:local "DO_DDNS_DOMAIN" "example.com"
:local "DO_TTL" 30
:local "DO_TOKEN" "dop_v1_abcdefghijklmn1234567890opqrstuvwxyz"
:local "DO_HEADER" "Content-Type: application/json,Authorization: Bearer $"DO_TOKEN""
:local "DO_LOG_FILE_PREFIX" "/disk1/logs/DDNS_DO."
:local "do_data" "{\"ttl\":$"DO_TTL", \"data\":\"$"ddns_current_ip"\"}"
:foreach hostname,recordid in=$"DO_DDNS_RECORDID_ARRAY" do={
:local "do_url" "https://api.digitalocean.com/v2/domains/$"DO_DDNS_DOMAIN"/records/$"recordid""
:log info $"do_url"
/tool fetch mode=https http-method=put http-header-field=$"DO_HEADER" http-data=$"do_data" url=$"do_url" dst-path=($"DO_LOG_FILE_PREFIX".$hostname)
}
Это скрипт для ROS 7 (если не ошибаюсь, команда fetch немного отличается в ROS 6), который проверяет, изменился ли IP для интерфейса, обновляет dynamic DNS на namecheap.com и отправляет вам об этом письмо. Как оказалось, он ещё и полезен, чтобы уведомлять меня, когда после отключения света снова появляется электричество или когда провайдер восстанавливает соединение после сбоя. В ROS теперь есть /ip cloud с собственным ddns от Mikrotik. С этим скриптом и Namecheap можно получить гораздо более крутой и короткий ddns-домен. А ещё это запасной вариант на случай, если /ip cloud вдруг перестанет работать.
Это мой первый скрипт здесь, так что пишите, если что-то можно улучшить. Я пока новичок в Mikrotik. Скрипт изначально взял с вики Mikrotik для другого ddns-провайдера и потом переделал под Namecheap. Инструмент для email надо настроить заранее. Просто поменяйте переменные на ваши. Ошибок при обновлении ddns или отправке почты не отслеживается. Запланируйте выполнение скрипта через нужные интервалы. Для pppoe его можно запускать и через up/down скрипты ppp профиля.
:local "NC_DDNS_SERVER" "dynamicdns.park-your-domain.com"
:local "NC_DDNS_HOSTNAMES_ARRAY" {"host1";"host2"}
:local "NC_DDNS_HOSTNAMES" [:tostr $"NC_DDNS_HOSTNAMES_ARRAY"]
:local "NC_DDNS_DOMAIN" "example.com"
:local "NC_TOKEN" "0123456789abcdef"
:local "TELEGRAM_SERVER" "api.telegram.org"
:local "TELEGRAM_KEY" "bot0123456789abcdef"
:local "TELEGRAM_CHAT_ID" "012345678"
:local "ISP_NAME" "My_ISP"
:local "WAN_INTERFACE" "pppoe-out1"
:local "LOG_FILE_PREFIX" "/disk1/logs/DDNS_NC."
:global "ddns_previous_ip"
:local "ddns_current_ip" [ /ip address get [/ip address find interface=$"WAN_INTERFACE"] address ]
:local "current_date" [/system clock get date]
:local "current_time" [/system clock get time]
:local "system_name" [/system identity get name]
:local "system_uptime" [/system resource get uptime]
:local "system_free_memory" [/system resource get free-memory]
:local "system_cpu_load" [/system resource get cpu-load]
:local "system_version" ("ROS " . [/system/package/get [find name=routeros] version])
# Убираем маску сети из IP-адреса
:set "ddns_current_ip" [:pick $"ddns_current_ip" 0 [:find $"ddns_current_ip" "/"]]
:if ([ :typeof $"ddns_previous_ip" ] = nil) do={ :global "ddns_previous_ip" "0" }
:if ([ :typeof $"ddns_current_ip" ] = nil) do={
:log info ("DDNS: На интерфейсе $"WAN_INTERFACE" нет IP-адреса, проверьте пожалуйста.")
} else={
:if ($"ddns_current_ip" != $"ddns_previous_ip") do={
:foreach hostname in=$"NC_DDNS_HOSTNAMES_ARRAY" do={
:log info ("DDNS: Обновляем $hostname.$"NC_DDNS_DOMAIN" с $"ddns_previous_ip" на $"ddns_current_ip"")
:local str "https://$"NC_DDNS_SERVER"/update?host=$"hostname"&domain=$"NC_DDNS_DOMAIN"&password=$"NC_TOKE
#:log info $str
/tool fetch url=$str mode=https dst-path=($"LOG_FILE_PREFIX".$hostname)
}
#:log info $"NC_DDNS_HOSTNAMES"
:log info "DDNS: Отправляем Email"
/tool e-mail send to=myself@example.com subject="$"ISP_NAME" IP $"current_date" $"current_time" $"system_name"" body="$"system_name" $"current_date" $"current_time"\r$"system_version"\rNamecheap: $"NC_DDNS_HOSTNAMES"\rДомен: $"NC_DDNS_DOMAIN"\r$"ISP_NAME" IP: $"ddns_current_ip"\rПредыдущий IP: $"ddns_previous_ip"\rВремя работы: $"system_uptime"\rСвободная память: $"system_free_memory" kb\rЗагрузка CPU: $"system_cpu_load" %"
:log info "DDNS: Отправляем Telegram"
:local str "https://$"TELEGRAM_SERVER"/$"TELEGRAM_KEY"/sendMessage?chat_id=$"TELEGRAM_CHAT_ID"&parse_mode=Markdown&text=$"ISP_N
#:log info $str
/tool fetch url=$str mode=https keep-result=no
:global "ddns_previous_ip" $"ddns_current_ip"
} else={
:log info "DDNS: IP не изменился. Обновление не требуется."
}
}
Ниже фрагмент кода для обновления DNS Digitalocean через их API. Можно использовать его вместо Namecheap в скрипте выше или одновременно с ним. Будем надеяться, что идентификаторы записей DO DNS остаются постоянными.
# Только recordid(s) из DO_DDNS_RECORDID_ARRAY используются в DNS API Digitalocean.
:local "DO_DDNS_RECORDID_ARRAY" {"host1"=123456789;"host2"=987654321}
:local "DO_DDNS_DOMAIN" "example.com"
:local "DO_TTL" 30
:local "DO_TOKEN" "dop_v1_abcdefghijklmn1234567890opqrstuvwxyz"
:local "DO_HEADER" "Content-Type: application/json,Authorization: Bearer $"DO_TOKEN""
:local "DO_LOG_FILE_PREFIX" "/disk1/logs/DDNS_DO."
:local "do_data" "{\"ttl\":$"DO_TTL", \"data\":\"$"ddns_current_ip"\"}"
:foreach hostname,recordid in=$"DO_DDNS_RECORDID_ARRAY" do={
:local "do_url" "https://api.digitalocean.com/v2/domains/$"DO_DDNS_DOMAIN"/records/$"recordid""
:log info $"do_url"
/tool fetch mode=https http-method=put http-header-field=$"DO_HEADER" http-data=$"do_data" url=$"do_url" dst-path=($"DO_LOG_FILE_PREFIX".$hostname)
}
