Я написал скрипт, который отслеживает, когда Pi-Hole перестаёт работать, и автоматически переключается на публичные DNS 1.1.1.2, 1.0.0.2. Отступление: я знаю, что можно указать несколько DNS-серверов, но чтобы Pi-Hole работал, нужно указывать только IP-адрес Pi-Hole. Сценарий использования: Настройка Mikrotik и RPI с Pi-Hole. Когда RPI падает, у всех в локальной сети интернет «отваливается», а этого никому не хочется. Добавьте скрипт на Mikrotik, который определит, что Pi-Hole перестал резолвить запросы, и переключит все DNS-настройки на Mikrotik на публичные DNS, например, 1.1.1.2, 1.0.0.2. А ещё уведомит вас, что RPI не работает. Второй RPI стоит денег и не приносит пользы, кроме высокой доступности, так что этот вариант не подходит.
Вариант 1 — меняет только DNS-сервер у роутера. Предполагается, что все устройства используют роутер как единственный DNS-сервер:
:local currentDNS [/ip dns get server]
:local piholeDNS "192.168.0.50"
:local backupDNS "1.1.1.2,1.0.0.2"
:local testDomain "www.google.com"
:if ($currentDNS = $piholeDNS) do={
:do {
:resolve $testDomain server $piholeDNS
} on-error={
/ip dns set servers=$backupDNS
}
} else={
:do {
:resolve $testDomain server $piholeDNS
/ip dns set servers=$piholeDNS
} on-error={}
}
Вариант 2 — меняет только DNS-сервер у роутера + уведомляет вас о падении Pi-Hole через Telegram-бота. Предполагается, что все устройства используют роутер как единственный DNS-сервер:
:local telegramBotKey "XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
:local chatID "XXXXXXXXX"
:local currentDNS [/ip dns get server]
:local piholeDNS "192.168.0.50"
:local backupDNS "1.1.1.2,1.0.0.2"
:local testDomain "www.google.com"
:if ($currentDNS = $piholeDNS) do={
:do {
:resolve $testDomain server $piholeDNS
} on-error={
/ip dns set servers=$backupDNS
/tool fetch "https://api.telegram.org/bot$telegramBotKey/sendmessage?chat_id=$chatID&text=Pi-Hole не работает! Смена DNS с $currentDNS на $backupDNS." keep-result=no
}
} else={
:do {
:resolve $testDomain server $piholeDNS
/ip dns set servers=$piholeDNS
/tool fetch "https://api.telegram.org/bot$telegramBotKey/sendmessage?chat_id=$chatID&text=Pi-Hole снова работает. Смена DNS с $currentDNS на $piholeDNS." keep-result=no
} on-error={}
}
Вариант 3 — меняет DNS-сервер у роутера и во всех сетях (IP → DHCP Server → Networks). В зависимости от времени аренды, DNS обновится не сразу у всех клиентов, зато Pi-Hole сможет показывать, кто им пользуется:
:local currentDNS [/ip dns get server]
:local piholeDNS "192.168.0.50"
:local backupDNS "1.1.1.2,1.0.0.2"
:local testDomain "www.google.com"
:if ($currentDNS = $piholeDNS) do={
:do {
:resolve $testDomain server $piholeDNS
} on-error={
/ip dns set servers=$backupDNS
/ip dhcp-server network set [find] dns-server=$backupDNS;
}
} else={
:do {
:resolve $testDomain server $piholeDNS
/ip dns set servers=$piholeDNS
/ip dhcp-server network set [find] dns-server=$piholeDNS;
} on-error={}
}
Вариант 4 — меняет DNS-сервер у роутера и во всех сетях (IP → DHCP Server → Networks) + уведомляет вас через Telegram-бота, когда Pi-Hole падает. Обновление DNS у клиентов зависит от времени аренды, но позволяет Pi-Hole показывать, кто им пользуется:
:local telegramBotKey "XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
:local chatID "XXXXXXXXX"
:local currentDNS [/ip dns get server]
:local piholeDNS "192.168.0.50"
:local backupDNS "1.1.1.2,1.0.0.2"
:local testDomain "www.google.com"
:if ($currentDNS = $piholeDNS) do={
:do {
:resolve $testDomain server $piholeDNS
} on-error={
/ip dns set servers=$backupDNS
/ip dhcp-server network set [find] dns-server=$backupDNS;
/tool fetch "https://api.telegram.org/bot$telegramBotKey/sendmessage?chat_id=$chatID&text=Pi-Hole не работает! Смена DNS с $currentDNS на $backupDNS." keep-result=no
}
} else={
:do {
:resolve $testDomain server $piholeDNS
/ip dns set servers=$piholeDNS
/ip dhcp-server network set [find] dns-server=$piholeDNS;
/tool fetch "https://api.telegram.org/bot$telegramBotKey/sendmessage?chat_id=$chatID&text=Pi-Hole снова работает. Смена DNS с $currentDNS на $piholeDNS." keep-result=no
} on-error={}
}
Использование: В системе → планировщик → добавить. Интервал поставить 00:00:30, любое имя, и вставить скрипт в поле «On Event:». Не забудьте заменить значения переменных под свой IP-адрес Pi-Hole.
ИЗМЕНЕНИЕ: Обновил скрипты согласно комментариям и предложил больше вариантов.
Вариант 1 — меняет только DNS-сервер у роутера. Предполагается, что все устройства используют роутер как единственный DNS-сервер:
:local currentDNS [/ip dns get server]
:local piholeDNS "192.168.0.50"
:local backupDNS "1.1.1.2,1.0.0.2"
:local testDomain "www.google.com"
:if ($currentDNS = $piholeDNS) do={
:do {
:resolve $testDomain server $piholeDNS
} on-error={
/ip dns set servers=$backupDNS
}
} else={
:do {
:resolve $testDomain server $piholeDNS
/ip dns set servers=$piholeDNS
} on-error={}
}
Вариант 2 — меняет только DNS-сервер у роутера + уведомляет вас о падении Pi-Hole через Telegram-бота. Предполагается, что все устройства используют роутер как единственный DNS-сервер:
:local telegramBotKey "XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
:local chatID "XXXXXXXXX"
:local currentDNS [/ip dns get server]
:local piholeDNS "192.168.0.50"
:local backupDNS "1.1.1.2,1.0.0.2"
:local testDomain "www.google.com"
:if ($currentDNS = $piholeDNS) do={
:do {
:resolve $testDomain server $piholeDNS
} on-error={
/ip dns set servers=$backupDNS
/tool fetch "https://api.telegram.org/bot$telegramBotKey/sendmessage?chat_id=$chatID&text=Pi-Hole не работает! Смена DNS с $currentDNS на $backupDNS." keep-result=no
}
} else={
:do {
:resolve $testDomain server $piholeDNS
/ip dns set servers=$piholeDNS
/tool fetch "https://api.telegram.org/bot$telegramBotKey/sendmessage?chat_id=$chatID&text=Pi-Hole снова работает. Смена DNS с $currentDNS на $piholeDNS." keep-result=no
} on-error={}
}
Вариант 3 — меняет DNS-сервер у роутера и во всех сетях (IP → DHCP Server → Networks). В зависимости от времени аренды, DNS обновится не сразу у всех клиентов, зато Pi-Hole сможет показывать, кто им пользуется:
:local currentDNS [/ip dns get server]
:local piholeDNS "192.168.0.50"
:local backupDNS "1.1.1.2,1.0.0.2"
:local testDomain "www.google.com"
:if ($currentDNS = $piholeDNS) do={
:do {
:resolve $testDomain server $piholeDNS
} on-error={
/ip dns set servers=$backupDNS
/ip dhcp-server network set [find] dns-server=$backupDNS;
}
} else={
:do {
:resolve $testDomain server $piholeDNS
/ip dns set servers=$piholeDNS
/ip dhcp-server network set [find] dns-server=$piholeDNS;
} on-error={}
}
Вариант 4 — меняет DNS-сервер у роутера и во всех сетях (IP → DHCP Server → Networks) + уведомляет вас через Telegram-бота, когда Pi-Hole падает. Обновление DNS у клиентов зависит от времени аренды, но позволяет Pi-Hole показывать, кто им пользуется:
:local telegramBotKey "XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
:local chatID "XXXXXXXXX"
:local currentDNS [/ip dns get server]
:local piholeDNS "192.168.0.50"
:local backupDNS "1.1.1.2,1.0.0.2"
:local testDomain "www.google.com"
:if ($currentDNS = $piholeDNS) do={
:do {
:resolve $testDomain server $piholeDNS
} on-error={
/ip dns set servers=$backupDNS
/ip dhcp-server network set [find] dns-server=$backupDNS;
/tool fetch "https://api.telegram.org/bot$telegramBotKey/sendmessage?chat_id=$chatID&text=Pi-Hole не работает! Смена DNS с $currentDNS на $backupDNS." keep-result=no
}
} else={
:do {
:resolve $testDomain server $piholeDNS
/ip dns set servers=$piholeDNS
/ip dhcp-server network set [find] dns-server=$piholeDNS;
/tool fetch "https://api.telegram.org/bot$telegramBotKey/sendmessage?chat_id=$chatID&text=Pi-Hole снова работает. Смена DNS с $currentDNS на $piholeDNS." keep-result=no
} on-error={}
}
Использование: В системе → планировщик → добавить. Интервал поставить 00:00:30, любое имя, и вставить скрипт в поле «On Event:». Не забудьте заменить значения переменных под свой IP-адрес Pi-Hole.
ИЗМЕНЕНИЕ: Обновил скрипты согласно комментариям и предложил больше вариантов.
