Проблема
У вас есть роутер Mikrotik и домашний сервер. Ваша семья ожидает 100% доступности интернета, но вы хотите пойти дальше и поставить Pi-Hole или что-то подобное (я предпочитаю Blocky) на домашний сервер. Однако этот сервер сломался, и DNS больше не работает для всех дома! Либо вы хотели его перезагрузить, либо обновить что-то, и Pi-Hole стал недоступен. Идея с вторым сервером для Pi-Hole есть, но это уже перебор... Естественно, вы выбираете один из двух вариантов:
- Настроить DHCP-сервер так, чтобы он выдавал DHCP-лейсинг с DNS-адресом, указывающим напрямую на Pi-Hole.
- Настроить DNS-сервер Mikrotik на Pi-Hole и DHCP-сервер так, чтобы он выдавал DNS-адрес, указывающий на сам Mikrotik.
Второй вариант несколько «так себе» — вы используете два DNS-перенаправляющих сервера, и запросы DNS будут работать медленнее, чем если бы был один сервер. В любом случае, если Pi-Hole упадет — будет (хотя бы частичное) недоступность!
Решение
Благодаря скриптовым возможностям Mikrotik и свободе настройки можно реализовать автоматическое переключение на резерв, при этом всё равно используя Pi-Hole напрямую.
Вот идея:
- Mikrotik «порт-форвардит» DNS-запросы к Pi-Hole, если он работает.
- Если Pi-Hole не работает — Mikrotik самостоятельно обрабатывает DNS-запросы (например, через 1.1.1.2,1.0.0.2).
Это позволяет совмещать лучшее из двух миров: использовать Pi-Hole, если он доступен, или временно DNS-сервер Mikrotik, пока Pi-Hole не запустится.
Инструкция
Для справки: в приведённых ниже шагах я использую «Blocky», поэтому в комментариях есть это ключевое слово.
1. Настройка роутера
Сначала укажите каждому устройству в сети использовать роутер как DNS-сервер. Затем отключите DNS-сервер Mikrotik:
/ip/dns/set allow-remote-requests=no
Теперь создайте NAT-правила, чтобы трафик tcp/udp на порт 53 направлялся на сервер с pi-hole (у меня это 192.168.72.10):
/ip firewall nat add action=dst-nat chain=dstnat comment=Blocky dst-port=53 protocol=tcp src-address-list=LANs dst-address-list=LANs to-addresses=192.168.72.10
/ip firewall nat add action=dst-nat chain=dstnat comment=Blocky dst-port=53 protocol=udp src-address-list=LANs dst-address-list=LANs to-addresses=192.168.72.10
Проверьте, работает ли DNS:
$ nslookup mikrotik.com 192.168.72.1
Server: 192.168.72.1
Address: 192.168.72.1#53
Non-authoritative answer:
...
Если не работает (таймаут или отказ) — скорее всего, у вас нет правил hairpin NAT. Вот что у меня:
/ip firewall mangle add action=mark-connection chain=prerouting comment="Отметить соединения для hairpin NAT - LAN IP" dst-address-list=LANs new-connection-mark="Hairpin NAT" passthrough=yes src-address-list=LANs
/ip firewall nat add action=masquerade chain=srcnat comment="Hairpin NAT" connection-mark="Hairpin NAT"
Попробуйте снова — теперь должно работать. При попытке резолва через DNS роутера вы на самом деле используете Pi-Hole, а не сам роутер. Если всё ок, включите обратно DNS-сервер на роутере:
/ip/dns/set allow-remote-requests=yes
И переходите к следующему разделу…
2. Добавление запланированного скрипта
Добавьте этот скрипт в /system/scheduler (через GUI). Отредактируйте его при необходимости:
# Указать фильтры для NAT-правил
:local tcpRuleId [/ip firewall nat find comment="Blocky" protocol="tcp"]
:local udpRuleId [/ip firewall nat find comment="Blocky" protocol="udp"]
# Найти IP Blocky из NAT-правила
:local toAddresses [/ip firewall nat get $tcpRuleId to-addresses]
# Указать домен для проверки
:local queryDomain "www.google.com"
:if ([/ip firewall nat get $tcpRuleId disabled] = false) do={
:do {
:resolve $queryDomain server=$toAddresses
} on-error={
/ip firewall nat set $tcpRuleId disabled=yes
/ip firewall nat set $udpRuleId disabled=yes
}
} else={
:do {
:resolve $queryDomain server=$toAddresses
/ip firewall nat set $tcpRuleId disabled=no
/ip firewall nat set $udpRuleId disabled=no
} on-error={}
}
Обратите внимание на логику — если NAT-правила отключены, используется DNS-сервер Mikrotik. Если NAT-правила включены — трафик перенаправляется на Pi-Hole.
Запланируйте запуск скрипта каждые 10-30 секунд и забудьте о жалобах, когда Pi-Hole временно не работает.
У вас есть роутер Mikrotik и домашний сервер. Ваша семья ожидает 100% доступности интернета, но вы хотите пойти дальше и поставить Pi-Hole или что-то подобное (я предпочитаю Blocky) на домашний сервер. Однако этот сервер сломался, и DNS больше не работает для всех дома! Либо вы хотели его перезагрузить, либо обновить что-то, и Pi-Hole стал недоступен. Идея с вторым сервером для Pi-Hole есть, но это уже перебор... Естественно, вы выбираете один из двух вариантов:
- Настроить DHCP-сервер так, чтобы он выдавал DHCP-лейсинг с DNS-адресом, указывающим напрямую на Pi-Hole.
- Настроить DNS-сервер Mikrotik на Pi-Hole и DHCP-сервер так, чтобы он выдавал DNS-адрес, указывающий на сам Mikrotik.
Второй вариант несколько «так себе» — вы используете два DNS-перенаправляющих сервера, и запросы DNS будут работать медленнее, чем если бы был один сервер. В любом случае, если Pi-Hole упадет — будет (хотя бы частичное) недоступность!
Решение
Благодаря скриптовым возможностям Mikrotik и свободе настройки можно реализовать автоматическое переключение на резерв, при этом всё равно используя Pi-Hole напрямую.
Вот идея:
- Mikrotik «порт-форвардит» DNS-запросы к Pi-Hole, если он работает.
- Если Pi-Hole не работает — Mikrotik самостоятельно обрабатывает DNS-запросы (например, через 1.1.1.2,1.0.0.2).
Это позволяет совмещать лучшее из двух миров: использовать Pi-Hole, если он доступен, или временно DNS-сервер Mikrotik, пока Pi-Hole не запустится.
Инструкция
Для справки: в приведённых ниже шагах я использую «Blocky», поэтому в комментариях есть это ключевое слово.
1. Настройка роутера
Сначала укажите каждому устройству в сети использовать роутер как DNS-сервер. Затем отключите DNS-сервер Mikrotik:
/ip/dns/set allow-remote-requests=no
Теперь создайте NAT-правила, чтобы трафик tcp/udp на порт 53 направлялся на сервер с pi-hole (у меня это 192.168.72.10):
/ip firewall nat add action=dst-nat chain=dstnat comment=Blocky dst-port=53 protocol=tcp src-address-list=LANs dst-address-list=LANs to-addresses=192.168.72.10
/ip firewall nat add action=dst-nat chain=dstnat comment=Blocky dst-port=53 protocol=udp src-address-list=LANs dst-address-list=LANs to-addresses=192.168.72.10
Проверьте, работает ли DNS:
$ nslookup mikrotik.com 192.168.72.1
Server: 192.168.72.1
Address: 192.168.72.1#53
Non-authoritative answer:
...
Если не работает (таймаут или отказ) — скорее всего, у вас нет правил hairpin NAT. Вот что у меня:
/ip firewall mangle add action=mark-connection chain=prerouting comment="Отметить соединения для hairpin NAT - LAN IP" dst-address-list=LANs new-connection-mark="Hairpin NAT" passthrough=yes src-address-list=LANs
/ip firewall nat add action=masquerade chain=srcnat comment="Hairpin NAT" connection-mark="Hairpin NAT"
Попробуйте снова — теперь должно работать. При попытке резолва через DNS роутера вы на самом деле используете Pi-Hole, а не сам роутер. Если всё ок, включите обратно DNS-сервер на роутере:
/ip/dns/set allow-remote-requests=yes
И переходите к следующему разделу…
2. Добавление запланированного скрипта
Добавьте этот скрипт в /system/scheduler (через GUI). Отредактируйте его при необходимости:
# Указать фильтры для NAT-правил
:local tcpRuleId [/ip firewall nat find comment="Blocky" protocol="tcp"]
:local udpRuleId [/ip firewall nat find comment="Blocky" protocol="udp"]
# Найти IP Blocky из NAT-правила
:local toAddresses [/ip firewall nat get $tcpRuleId to-addresses]
# Указать домен для проверки
:local queryDomain "www.google.com"
:if ([/ip firewall nat get $tcpRuleId disabled] = false) do={
:do {
:resolve $queryDomain server=$toAddresses
} on-error={
/ip firewall nat set $tcpRuleId disabled=yes
/ip firewall nat set $udpRuleId disabled=yes
}
} else={
:do {
:resolve $queryDomain server=$toAddresses
/ip firewall nat set $tcpRuleId disabled=no
/ip firewall nat set $udpRuleId disabled=no
} on-error={}
}
Обратите внимание на логику — если NAT-правила отключены, используется DNS-сервер Mikrotik. Если NAT-правила включены — трафик перенаправляется на Pi-Hole.
Запланируйте запуск скрипта каждые 10-30 секунд и забудьте о жалобах, когда Pi-Hole временно не работает.
