Привет! Я использую Pihole как свой DNS-сервер и настроил RouterOS на использование DNS от Pihole — всё работает отлично. Но я хочу настроить RouterOS так, чтобы в случае, если Pihole перестанет работать, он автоматически переключался на резервный DNS (от провайдера или любой публичный типа Google). Мне не нужна балансировка нагрузки, просто резерв на случай, если Pihole упадёт, ведь он запущен внутри виртуальной машины. Иногда бывают проблемы с электричеством, иногда Windows обновляется, и рабочая станция дольше перезагружается.
С уважением, Хассан
gmx
Guest
0
19.04.2019 00:42:00
Привет, удалось ли у тебя с этим разобраться?
Sob
Guest
0
19.04.2019 00:57:00
В целом, DNS-резолверы не рассчитаны на такую схему работы. Можно использовать несколько для резервирования, но при этом предполагается, что все они одинаковы, и клиент может использовать любой из них. Но это не подходит для случая, когда нужен особый резолвер, который знает то, чего не знают другие, и хочется пользоваться другими только если этот особый отказал. Не совсем надёжное, но, возможно, достаточно рабочее решение — использовать Netwatch, чтобы мониторить IP-адрес Pihole. Если он перестаёт работать — переключать системные резолверы на публичные. Если он возобновляет работу — возвращать на Pihole.
whitbread
Guest
0
19.04.2019 17:01:00
Тебе нужен хороший скрипт, чтобы сделать то, что ты хочешь.
mu17
Guest
0
19.04.2019 22:27:00
Я изучил функцию Netwatch , и похоже, она отлично справляется с задачей! Netwatch следит за хостом с помощью пингов и запускает скрипт, если хост в сети или офлайн.
/tool netwatch add comment="pi-hole failover" down-script="/ip dhcp-server network set 0 dns-server=""" host=192.168.88.15 up-script="/ip dhcp-server network set 0 dns-server=192.168.88.15"
Мой pi-hole — 192.168.88.15
если хост доступен: /ip dhcp-server network set 0 dns-server=192.168.88.15
если недоступен, очищаем или ставим 1.1.1.1 либо 192.168.88.1: /ip dhcp-server network set 0 dns-server=""
Вот мои настройки сети DHCP.
gotsprings
Guest
0
20.04.2019 11:24:00
Настройте Mikrotik так, чтобы он использовал DNS, отличный от piehole… Например, 8.8.8.8 или 1.1.1.1. Затем в вашем DHCP-сервере установите значение DNS в разделе сети на piehole или Mikrotik. Если piehole не сработает… Клиент будет спрашивать у Mikrotik.
mt99
Guest
0
21.04.2019 23:54:00
Это абсолютно верно, для клиента все DNS-серверы равны, поэтому установка «вторичного» DNS-сервера работает не так, как можно было бы подумать. Я использую Pihole, который работает на Mac Mini 2010 года, и хотя я поставил новый жёсткий диск, меня беспокоила надежность. Поэтому я применяю скрипты с netwatch, чтобы настроить роутер в качестве запасного DNS, и это довольно хорошо работает. Сейчас меня нет в городе, но могу посмотреть скрипт, когда вернусь домой.
mt99
Guest
0
27.04.2019 00:05:00
Все, что начинается с my_*, нужно настроить под вашу среду. Я использую роутер в качестве DNS-сервера, чтобы сохранить контроль и централизованно перенаправлять через правило NAT. Чтобы это работало максимально эффективно, я также рекомендую прописать роутер как вторичный DNS-сервер на всех клиентах. Это работает достаточно быстро, и я получаю все уведомления по почте.
ПРИМЕЧАНИЕ: я понял, что если устройство не падает, Netwatch всегда будет запускать скрипт «Up» при любом изменении (потому что устройство всё ещё «в сети»). Мне не хочется, чтобы это происходило, если pihole не падал, поэтому я добавил проверку, что роутер действительно работает как DNS-сервер, прежде чем что-то делать.
ПРИМЕЧАНИЕ 2: оказалось, что нельзя скриптовать изменение правил файрвола, если сначала не перебрать все правила с помощью print, или не узнать их внутренние ID и использовать их (подробнее здесь: . Я обошёл это просто сделав print, но позже, когда будет время, сделаю по-честному.
Скрипт Netwatch при падении pihole:
# скрипт для включения backupDNS, если pihole не отвечает на пинг # этот скрипт ничего не делает, если core switch тоже не в сети
:log info "BackupDNS: Pihole упал, включаю резервный DNS" # замените на ваши адреса резолверов /ip dns set servers=your_resolver_IP1,your_resolver_IP2 :delay 2 :log info "BackupDNS: резолверы сменены"
# включаем DNS-сервер /ip dns set allow-remote-requests=yes :delay 2 :log info "BackupDNS: сервер запущен"
# предполагается, что у вас есть одно NAT-правило перенаправления и это первое в списке, меняем to-address на IP роутера /ip firewall nat print; /ip firewall nat set to-addresses=your_router_IP numbers=1 :delay 1 :log info "BackupDNS: правило NAT перенаправлено"
# уведомление по почте /tool e-mail send to=$recv subject="$myhost started BackupDNS" body="В $mydate в $mytime $myhost включил BackupDNS, потому что $target не отвечает."
} else={ :log info "BackupDNS: интерфейс core switch $inetinterface не работает, скрипт остановлен" }
Скрипт Netwatch при восстановлении pihole:
# скрипт для отключения резервного DNS, когда pihole снова доступен
:if ([/ip dns get allow-remote-requests]=true) do={
# уведомление по почте /tool e-mail send to=$recv subject="$myhost stopping BackupDNS" body="В $mydate в $mytime $myhost выключает BackupDNS, так как $target снова доступен." :delay 10 :log info "BackupDNS: Pihole в сети, выключаем резервный DNS"
# меняем резолвер обратно на my_pihole /ip dns set servers=my_pihole_IP :delay 1 :log info "BackupDNS: pihole снова установлен как резолвер"
# меняем NAT-правило обратно на pihole (первое в списке) /ip firewall print; /ip firewall nat set to-addresses=my_pihole_IP numbers=1 :delay 1 :log info "BackupDNS: правило NAT возвращено обратно на pihole"
# отключаем DNS-сервер и чистим кэш /ip dns set allow-remote-requests=no :delay 1 /ip dns cache flush :log info "BackupDNS: DNS-сервер выключен, кэш очищен"
} else={ :log info "BackupDNS: Pihole в сети, но роутер не выступал как DNS-сервер, скрипт остановлен" }
Halfeez92
Guest
0
06.05.2019 02:24:00
Это самый простой способ, но, возможно, ты мог бы добавить еще одну строку для отключения правил NAT файрвола, которые делают dst-nat порт 53 udp/tcp на сервер pihole? Потому что некоторые из нас могут ограничивать пользователей в использовании внешних DNS-серверов, поэтому мы перенаправляем все DNS-запросы на pihole, независимо от того, какой IP они пытаются поставить.
meimcounting
Guest
0
28.10.2019 09:25:00
Я так и не смог заставить netwatch срабатывать корректно из-за всех этих ограничений с разрешениями. Для моего домашнего применения проще запускать маленький скрипт раз в минуту через планировщик — работает отлично. У меня в DHCP Server > Networks > DNS Servers стоит адрес шлюза моего роутера MikroTik, чтобы клиентам не пришлось ничего подстраивать. Вот мой скрипт, может, пригодится. Можно настроить адреса fallbackDNS, ip Pi-Hole и resolve url под свои нужды.
# задаём переменные :local fallbackDNS 1.1.1.1,1.0.0.1 :local pihole 192.XXX.XX.XXX; :local currentDNS :set $currentDNS [/ip dns get servers];
:do { :put [resolve google.com server=$pihole]; if ($currentDNS != pihole) do={ :log info "DNS Failover: переключение на Pi-Hole"; ip dns set servers $pihole } else={} } on-error={ :set $currentDNS [/ip dns get servers]; if ($currentDNS != $fallbackDNS) do={ :log info "DNS Failover: переключение на FallbackDNS"; ip dns set servers $fallbackDNS; } else={:log info "DNS Failover: Pi-Hole недоступен"} }
# пытаемся достучаться до google через Pi-Hole # если получилось и у нас сейчас другой DNS — переключаемся на Pi-Hole # если получилось и мы уже на Pi-Hole — ничего не делаем # если не получилось достучаться до google и мы не на FallbackDNS — переключаемся на fallback # если не получилось достучаться через Pi-Hole и мы уже на fallback — логируем, что Pi-Hole недоступен
zilexa
Guest
0
12.04.2020 11:59:00
Это должно работать? Потому что все остальные в этой теме пользуются скриптом... но твое решение было бы умнее, ведь не нужно пинговать свой pihole каждую минуту.
mcb777
Guest
0
27.05.2020 23:54:00
Проблема с netwatch в том, что он просто пингует сервер. Сервер может быть в сети, а Pi-hole — нет. Я написал следующий скрипт и запускаю его каждую минуту. Если Pi-hole не отвечает, запрос не проходит, и выполняется код в блоке on-error. Как только Pi-hole снова работает, он устанавливается как DNS-сервер.
:local servers [/ip dns get servers]; :do { /tool fetch url="http://192.168.1.26:8082/admin/api.php?status"; if ($servers != "192.168.1.26") do={ /ip dns set servers=192.168.1.26; } } on-error { if ($servers != "208.67.220.123;208.67.222.123") do={ /ip dns set servers=208.67.220.123,208.67.222.123; :log error "Pi-hole не работает, переключаюсь на OpenDNS"; } }
mcb777
Guest
0
27.05.2020 23:55:00
Я попробовал это, но не получилось.
gotsprings
Guest
0
28.05.2020 09:49:00
Можешь сказать, где возникает проблема? Это из-за того, что песочник появляется наверху? Или что-то другое?
eworm
Guest
0
28.05.2020 09:59:00
Это не сработает. Клиент будет одновременно использовать piehole и Mikrotik.
mcb777
Guest
0
28.05.2020 15:47:00
Когда я останавливаю Pi-hole (DHCP сервер и DNS), переключения на DNS-серверы, указанные в /ip dns, не происходит, и ничего не разрешается.
gotsprings
Guest
0
29.05.2020 12:39:00
Ваш роутер настроен на разрешение DNS-запросов?
BartoszP
Guest
0
29.05.2020 13:38:00
Пожалуйста, используйте «Post replay» вместо того, чтобы цитировать все предыдущие сообщения целиком. Мы и так умеем следить за темой, нет необходимости постоянно всё цитировать.
ferdytao
Guest
0
15.06.2020 09:43:00
На самом деле я использую это решение вместе со скриптом, чтобы переключаться на публичный DNS, если PiHole не работает. Интересно, можно ли настроить клиентов так, чтобы они напрямую обращались к PiHole, минуя MikroTik, чтобы ускорить запросы. Если я указываю адрес PiHole клиентам через DHCP, приходится ждать обновления аренды, чтобы адреса изменились — есть другие варианты? Может, лучше всего сделать редирект через NAT?
gotsprings
Guest
0
15.06.2020 13:44:00
Хорошо... вот идея. Значит, на практике, если ваш PiHole стоит на 192.168.1.3, настройте ваш DHCP-сервер так, чтобы клиентам выдавались DNS-серверы 8.8.8.8 и 8.8.4.4. Создайте в фаерволе адресный список под названием Google:
Затем настройте NAT, который будет перехватывать любые DNS-запросы, отправленные на эти два DNS-сервера, и направлять их на ваш PiHole. Комментарий для правила — “REDIRECTDNS”: