У меня были проблемы с тем, чтобы отлавливать (и блокировать) любые устройства, которые пытались вручную задать DNS-запросы в моей сети. Домашняя сеть, но я не хочу, чтобы устройства выходили в интернет неправильным путём, если они внутри моей сети. Поэтому я сделал две вещи, которые для кого-то могут показаться чрезмерными, но всё же... Итак, главное: мой основной роутер находится по адресу 192.168.1.1, а DNS — по адресу 192.168.1.10.
Сначала я определяю любую попытку обращения к DNS-порту (53) и помечаю её:
/ip firewall mangle add action=mark-connection chain=prerouting comment="trap dns queries" connection-mark=no-mark dst-address=!192.168.1.10 dst-port=53 in-interface-list=lans new-connection-mark=dns-route passthrough=yes protocol=udp src-address=!192.168.1.10
/ip firewall mangle add action=mark-connection chain=prerouting comment="trap dns queries" connection-mark=no-mark dst-address=!192.168.1.10 dst-port=53 in-interface-list=lans new-connection-mark=dns-route passthrough=yes protocol=tcp src-address=!192.168.1.10
Потом я перенаправляю такие запросы на адрес pi-hole и делаю srcnat/dstnat соответствующим образом:
/ip firewall nat add action=masquerade chain=srcnat comment="SNAT to PI-Hole" connection-mark=dns-route to-addresses=192.168.1.10
/ip firewall nat add action=dst-nat chain=dstnat comment="DNAT to PI-Hole" connection-mark=dns-route to-addresses=192.168.1.10
Некоторые говорят, что достаточно только маскарадинга, но у меня такой подход не сработал. И вы сами можете увидеть в списке соединений файрвола, что любой запрос на любой DNS по заданным портам будет перенаправлен на ваш DNS и корректно обработан при возврате ответа.
Плюс, у меня в доме три провайдера, поэтому я распределяю DNS-запросы между всеми подключенными ISP. Это повышает надёжность, хотя и не обязательно. Просто привёл в пример.
Важно: lans — это список всех интерфейсов локальной сети, а WAN#_conn — правило маршрутизации, которое направляет любой помеченный пакет через соответствующий интерфейс, если он активен, иначе использует основную таблицу маршрутизации.
/ip firewall mangle add action=mark-connection chain=prerouting comment="Nth DNS to WAN1 out of 3" connection-mark=no-mark dst-address-type=!local dst-port=53 in-interface-list=lans new-connection-mark=WAN1_conn nth=3,1 passthrough=yes protocol=udp