Скрипт для автоматичного оновлення DDNS для No-IP

Прочитавши безліч керівництв і прикладів написання скрипта для роботи Mikrotik з сервісом noip.com так і не вдалося знайти готового рішення.
Що не влаштовувало в інших посібниках, наприклад, тут:
при написанні необхідно прямо в тексті скрипта вказувати ім'я інтерфейсу, з якого він буде отримувати зовнішній IP-адресу, а що якщо інтерфейсів два, три чи десять?
В моєму випадку є 2 каналу: pppoe-client і ethernet без пароля, але з динамічно одержуваним адресою…

Також в роутах є 2 записи з «dst. address» рівним «0.0.0.0/0» з дистанціями «1» і «2» відповідно.

image

Спочатку необхідно перебрати всі роуты, знайшовши в них запису «dst. address» рівним «0.0.0.0/0», після цього провести перевірку активності інтерфейсу ( :if ([get $counter active] = true) ).
Таким чином, ми отримаємо ім'я активного інтерфейсу і запам'ятовуємо його в локальну змінну «activeInterface».

:local activeInterface;
/ip route {
:local gwintarray;
:local counter;
:local intfinder;
:foreach counter in=[find dst-address=0.0.0.0/0] do={
:if ([get $counter active] = true) do={
:set $activeInterface [get $counter gateway];
}
}
}


Після цього нам необхідно перебрати всі записи таблиці /ip address і знайти одну з назвою потрібного інтерфейсу.
Отриманий адресу буде містити маску підмережі, яку ми відразу ж і відсічемо.

:local activeAddress;
/ip address {
:set $activeAddress [get [find interface=$activeInterface] address];
:set $activeAddress [:pick $activeAddress 0 [:find $activeAddress "/"]];
}


image

Після цього пропишемо дані для підключення до сервісу NO-IP:

:local ddnsuser "your_no-ip_user";
:local ddnspass "your_no-ip_pass";
:local ddnshost "hostname.no-ip.org";

:local str "/nic/update?hostname=$ddnshost&myip=$activeAddress";
/tool fetch url="http://dynupdate.no-ip.com/$str" mode=http user=$ddnsuser password=$ddnspass \ dst-path=("/ServiceDNS.".$ddnshost);


де:
ddnsuser — логін в системі NO-IP
ddnspass — пароль в системі NO-IP
ddnshost — доменне ім'я, для якого необхідно оновити IP-адресу

І передамо інформацію на сервіс, скачавши файл з відповіддю:

:local str "/nic/update?hostname=$ddnshost&myip=$activeAddress";
/tool fetch url="http://dynupdate.no-ip.com/$str" mode=http user=$ddnsuser password=$ddnspass \ dst-path=("/ServiceDNS.".$ddnshost);


Після цього очікуємо 2 секунди і виводимо вміст файлу (статус оновлення IP-адреси), після чого видалимо його.

delay 2;
:local str [/find file name="ServiceDNS.$ddnshost"];
:log info [/file get $str contents];
/remove file $str


УВАГА! керівництві використовується глобальна змінна "previousIP", запам'ятовує попередній IP-адреса.
Якщо адреса глобальної змінної збігається з знову отриманими, скрипт нічого оновлювати на сервісі не буде.

МІНУС такого методу: заходимо на сайт noip.com і вручну міняємо IP-адресу. А скрипт микротика це ніяк не відстежує. Так що в моєму прикладі ця змінна просто виключена.

Повний код скрипта можна взяти тут
# Отримуємо ім'я користувача
# Get interface name
:local activeInterface;
/ip route {
:local gwintarray;
:local counter;
:local intfinder;
:foreach counter in=[find dst-address=0.0.0.0/0] do={
:if ([get $counter active] = true) do={
:set $activeInterface [get $counter gateway];
}
}
}

# Пролучаем IP адреса активного інтерфейсу
# Get IP-address of interface actived
:local activeAddress;
/ip address {
:set $activeAddress [get [find interface=$activeInterface] address];
:set $activeAddress [:pick $activeAddress 0 [:find $activeAddress "/"]];
}

# Інформація про обліковий запис NO-IP
# No-IP User account info
:local ddnsuser "your_no-ip_user";
:local ddnspass "your_no-ip_pass";
:local ddnshost "hostname.no-ip.org";

# Оновлюємо дані
# Updating data on NO-IP
:local str "/nic/update?hostname=$ddnshost&myip=$activeAddress";
/tool fetch url="http://dynupdate.no-ip.com/$str" mode=http user=$ddnsuser password=$ddnspass \ dst-path=("/ServiceDNS.".$ddnshost);

# Чекаємо 2 секунди
# Wait 2 seconds
delay 2

# Виводимо інформацію про статус оновлення і видаляємо скачаний файл
# Displays information about the status of the update and delete the file downloaded
:local str [/find file name="ServiceDNS.$ddnshost"];
:log info [/file get $str contents];
/remove file $str



Нижче інформація для новачків
Для додавання сценарію Mikrotik потрібно відкрити меню «System» > «Scripts» і додати новий скрипт, натиснувши на значок «плюс», і називаємо скрипт, наприклад, "update-ddns"

image

Залишилося додати правило запуску скрипта в планувальник. Для цього йдемо в «System» > «Scheduler» і натискаємо на знайомий нам «плюс».
В імені вказуємо ім'я правила в планувальнику.
У полі "On Event" вказуємо ім'я нашого скрипта — "update-ddns", виставляємо правила запуску і натискаємо "OK".

В моєму випадку запуск скрипта проводиться кожну 61 секунду.

image

P. S.: Скрипт тестувався на Mikrotik RB850Gx2 (ядро powerpc) з прошивкою версії 6.33.5.
Також без всяких проблем запускається Mikrotik RB450G та RB951G-2HnD з прошивкою версії 6.33.5.

На цьому все!

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.