Так случилось, что от прежних админов достался мне сервер Active Directory(далее AD) с доменной зоной заканчивающейся на *.local.ru, все бы ничего, но парой машины которые пытаются войти в домен, напрочь не хотят резолвить этот домен как внутренний и как следствие получают ошибку, с примерной трактовкой что по такому адресу сервера авторизации не прописано.
Дабы избавиться от этой проблемы, было решено во всей сети использовать DNS AD, и вот все бы хорошо, но бывает так что сервер становится не доступным и все бы ничего, но DNS в сети становится тоже не доступным…
Вот и появилась идея, написать маленький скриптик на проверку и переключение DNS, благо везде стоят Mikrotik`и.
Собственно сам скрипт, незамысловатый и простой:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
:local pingcount 5; :local localdns 192.168.1.1; :local googledns 8.8.8.8; :local mydns [/ip dns get servers]; :local result [/ping $localdns count=$pingcount]; :log info "DNS-C: Run"; :log info "DNS-C: DNS $mydns"; :if ($result > 0) do={ :log info "DNS-C: Send:$result/$pingcount AD DNS is alive."; :if ($mydns = $localdns) do={ :log info "DNS-C: DNS Ok!"; } else={ :log info "DNS-C: Change DNS $mydns -> $localdns"; :ip dns set servers=$localdns; } } else={ :log info "DNS-C: Send:$result/$pingcount AD DNS is dead."; :if ($mydns = $googledns) do={ :log info "DNS-C: DNS Ok!"; } else={ :log info "DNS-C: Change DNS $mydns -> $googledns"; :ip dns set servers=$googledns; } } :log info "DNS-C: Finish" |
Основные значения:
pingcount – Сколько ICMP пакетов отправлять для проверки
localdns – Наш DNS сервер
googledns – Сторонний DNS сервер, в скрипте указан DNS гугла 8.8.8.8, но это может быть и DNS яндекса 77.88.8.88, либо какой то Ваш сторонний DNS сервер
Для переодическго запуска добавляем расписание запуска:
1 |
/system scheduler add name=DNS-C start-time=00:00:00 interval=00:00:30 on-event=DNS-C |
Данный скрипт запускается каждые 30 секунд и проверяет состояние DNS в лог падает небольшой отчет.
Mikrotk script debug
На заметку если вдруг чего то не будет работать, часто так бывает что копируя с сайта слетает значение спец.символов. Можно отловить ошибки скрипта следующей командой:
1 |
/system script> print from=DNS-C |
EXPORT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
/system script export # sep/14/2017 16:37:56 by RouterOS 6.39 # software id = # /system script add name=DNS-C owner=kc-admin policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon source=":local pingcount 5;\r\ \n:local localdns 192.168.1.1;\r\ \n:local googledns 8.8.8.8; \r\ \n:local mydns [/ip dns get servers]; \r\ \n:local result [/ping \$localdns count=\$pingcount];\r\ \n\r\ \n:log info \"DNS-C: Run\";\r\ \n:log info \"DNS-C: DNS \$mydns\";\r\ \n:if (\$result > 0) do={\r\ \n\t\t:log info \"DNS-C: Send:\$result/\$pingcount AD DNS is alive.\"; \r\ \n\t\t:if (\$mydns = \$localdns) do={\r\ \n\t\t\t\t:log info \"DNS-C: DNS Ok!\";\r\ \n\t\t\t} else={\r\ \n\t\t\t\t:log info \"DNS-C: Change DNS \$mydns -> \$localdns\"; :ip dns set servers=\$localdns;\r\ \n\t\t\t}\r\ \n\t} else={\r\ \n\t\t:log info \"DNS-C: Send:\$result/\$pingcount AD DNS is dead.\";\r\ \n\t\t:if (\$mydns = \$googledns) do={\r\ \n\t\t\t\t:log info \"DNS-C: DNS Ok!\";\r\ \n\t\t\t} else={\r\ \n\t\t\t\t:log info \"DNS-C: Change DNS \$mydns -> \$googledns\"; :ip dns set servers=\$googledns;\r\ \n\t\t\t}\r\ \n\t}\r\ \n\r\ \n:log info \"DNS-C: Finish\"" /system scheduler add interval=30s name=DNS-C on-event=DNS-C policy=ftp,reboot,read,write,policy,test,password,sniff,sensitive,romon start-date=sep/14/2017 start-time=00:00:00 |
Добавить комментарий