Настройка условной пересылки DNS-запросов в Mikrotik RouterOS

Чтобы настроить пересылку dns-запросов для определенного домена на определенный dns-сервер (Conditional DNS forwarding), можно использовать возможность инспектирования пакетов на Уровне 7 (Layer7 Protocols) в Firewall RouterOS.

Пример:

Имеем роутер MikroTik, версия RouterOS 6.27, ip-адрес dns-сервера на Микротике 192.168.15.1, требуется перенаправлять запросы для domain.local на dns-сервер домена Active Directory 192.168.55.2.

Для решения указанной задачи нужно выполнить в консоли RouterOS следующие команды:

/ip firewall layer7-protocol add name=domain.local regexp=domain.local
/ip firewall mangle add chain=prerouting dst-address=192.168.15.1 layer7-protocol=domain.local action=mark-connection new-connection-mark=domain.local-fwd protocol=tcp dst-port=53
/ip firewall mangle add chain=prerouting dst-address=192.168.15.1 layer7-protocol=domain.local action=mark-connection new-connection-mark=domain.local-fwd protocol=udp dst-port=53
/ip firewall nat add action=dst-nat chain=dstnat connection-mark=domain.local-fwd to-addresses=192.168.55.2
/ip firewall nat add action=masquerade chain=srcnat connection-mark=domain.local-fwd
Последнюю строку можно не добавлять, если у вас у вас уже есть каким либо образом настроенная маршрутизация пакетов в подсеть целевого dns-сервера.
Если нужно добавить еще домены, нужно выполнить аналогичный набор команд для каждого домена, заменив имя домена и адрес dns-сервера на соответствующие.
Wdivin
04.05.2015 07:43:32
Огромное спасибо ))) нужно было для дома добавить статические DNS в микротике - в паре с Вашими рекомендациями и связь с офисом удалось не потерять )))
AlexsandeR
23.07.2015 10:30:10
Благодарю автора! Давно ищу такое решение. Но если можно подскажите, как реализовать для 2х DNS- серверов одного домена. Пробовал путем добавления правила  

/ip firewall nat add action=dst-nat chain=dstnat connection-mark=domain.local-fwd to-addresses=192.168.ХХХ.ХХ

Результат отрицательный.
Если заглушить первый, а второй включить то конструкция работает.
24.07.2015 10:55:11
То, что вы хотите, возможно сделать, если у клиента два DNS указано. Если первый вернет ошибку, то он попробует второй (в теории), и на микротике можно соответственно перенаправить запрос: дополнительно смотреть по адресу назначения  - если на первый, то туда, если на второй, то сюда.
 Если по приведенному примеру, то: на микротик вешается второй IP - 192.168.15.2, например (он указывается на клиенте в качестве второго DNS). Проверяется, что по нему так же работает DNS. Добавляются аналогичные правила для адреса 192.168.15.2:
/ip firewall mangle add chain=prerouting dst-address=192.168.15.2 layer7-protocol=domain.local action=mark-connection new-connection-mark=domain.local-fwd-2 protocol=tcp dst-port=53
/ip firewall mangle add chain=prerouting dst-address=192.168.15.2 layer7-protocol=domain.local action=mark-connection new-connection-mark=domain.local-fwd-2 protocol=udp dst-port=53
/ip firewall nat add action=dst-nat chain=dstnat connection-mark=domain.local-fwd-2 to-addresses=192.168.55.3 
/ip firewall nat add action=masquerade chain=srcnat connection-mark=domain.local-fwd-2
AlexsandeR
27.07.2015 16:29:54
Валерий, Благодарю!
Воспользовался вашим решением -- все успешно.

Единственное, что был жутко удивлен работой NSLOOKUP в Win7 как, оказалось, может обманывать в том плане, что обрабатывает только предпочитаемый DNS-сервер (kerio-rus.ru/forum/showthread.php?t=7396 и sysadmins.ru/topic354321.html).
Chupaka
06.10.2015 22:48:20
Строчку про "protocol=tcp dst-port=53" можно убрать: в этот момент tcp-соединение уже установлено, поэтому правила NAT на него не подействуют
Василий
07.05.2016 18:01:11
Можно ли в Микротике для конкретной клиентской машины прописать отдельный ДНС сервер? То есть все клиенты используют роутер в качестве ДНС, а одно устройство использует, например, 8.8.8.8?
27.05.2016 13:33:17
Можно. Для WinBox:

Зайти в IP->DHCP Server

dhcp_1.jpg

Найти нужный компьютер на вкладке Leases, открыть на нём контекстное меню и выбрать Make Static

Меню_001.jpg

После этого на вкладке Networks нужно добавить назначенный IP, где можно будет выбрать другие параметры:
dhcp_2.jpg
Рамиль
02.07.2016 16:19:48
Долго искал как сделать... Ваша статья помогла. Спасибо!
sdaww
22.12.2016 21:52:13
Для того, чтобы работало достаточно одного правила в NAT, помечать соединение не нужно - смысла нет. Сразу перенаправлять запросы и всё

/ip firewall nat add chain=dstnat protocol=udp port=53 layer7-protocol=domain.local action=dst-nat to-addresses=192.168.55.2
Kaa
18.11.2017 17:01:19
Сделал правило, как вы написали, счетчик тикает, но компьютеры в центральном офисе не пингуются из филиала по именам. Пинги по ip-адресам ходят в обе сети (VPN L2TP). Какие еще нужны условия чтобы появились пинги по именам из другой сети? Внутри каждой сети всё пингуется как надо. Нужно ли в настройках DNS на контроллере домена в закладке "Сервер пересылки" указывать ip-адрес микротика?
bammbr
10.02.2018 07:53:23
Слишком примитивно
То, что предлагаете вы, будет безусловной пересылкой всех запросов на определённый сервер. В таком случае и вообще не стоит огород городить: поставить нужный адрес в качестве вышестоящего ДНС и абзац!
Здесь же рассматривается случай, когда перенаправление запроса идет по условию "если запрос касается имени из зоны domain.local", то перенаправлять их и только их.
bammbr
10.02.2018 08:07:31
И обратите внимание, что присутствие regexp=domain.local в первой строке позволяет перенаправлять запросы и на все вложенные зоны *.domain.local
Kaa
18.11.2017 00:55:16
После установки VPN соединения с центральным офисом имена не резолвятся. Пинги по ip-адресам ходят между двумя сетями, а по именам нет. Нужно ли на контроллере домена в DNS пересылке указывать микротик?  
Air
20.08.2018 20:13:05
Спасибо Вам большое! То, что искал.