DNS в Mikrotik
Кэширующий DNS в микротике это хорошо и просто. Настраивается быстро, используется легко и непринужденно. Опишу на примере и чуток поделюсь опытом.
Итак, начнем. Если вы используете winbox, то первый этап выполняется в несколько кликов: IP->DNS. В появившемся окне указываете серверы пересылки, не забыв при этом поставить галку “Allow remote requests”.
…или в терминале выполнить
1 2 3 4 | /ip dns set allow—remote—requests=yes servers=77.88.8.8,77.88.8.1,8.8.8.8 |
Этого достаточно, чтобы Mikrotik стал принимать DNS-запросы из локальной сети, пересылать их на указанные серверы и возвращать IP-адреса любимых сайтов конечным пользователям в вашей локалке. Т.е. с этого момента вы можете указывать ваш роутер не только шлюзом но и сервером DNS в настройке соединения.
Конечно, не все запросы будут пересылаться, для этого есть кэш. Он же cache. О проблеме с кэшем (мелочь, а неприятно), с которой я столкнулся, напишу ниже.
Все работает, но… Есть моменты, на которых я хотел бы заострить внимание.
Давайте не будем использовать только дефолт. Обезопасим себя и роутер от лишнего и абсолютно ненужного траффика.
При такой дефолтной настройке mikrotik будет отвечать на DNS запросы по всем интерфейсам. (Конечно же в том случае, если вы еще не настроили firewall) Нужны ли такие “левые” запросы? Конечно нет.
Поэтому в настройке firewall до “всеобщего DROP” в цепочке INPUT надо либо явно указать интерфейсы, с которых принимать DNS запросы (по одному правилу на интерфейс), либо указать диапазон IP, с которого принимать эти запросы):
1 2 3 4 5 6 7 8 9 | /ip firewall filter # еще какие-то разрешающие правила # разрешим DNS-запросы с интерфейса ether2, который «смотрит» в локалку add chain=input comment=«Allow DNS from ether2» dst—port=53 in—interface=ether2 protocol=udp #мы уверены, что все нужное разрешили выше #поэтому запретим весь остальной траффик в цепочке INPUT add action=drop chain=input comment=«Drop Another INPUT» |
Либо разрешить DNS на всех интерфейсах, кроме “внешнего”. Вот так, например:
1 2 3 4 | # разрешим везде, кроме myISP, «внешнего» интерфейса add chain=input comment=«Allow DNS from ether2» dst—port=53 in—interface=!myISP protocol=udp |
Либо… Либо… Способов много, firewall заслуживает отдельной большой темы даже для базовой настройки. Поэтому углубляться я тут не буду. Просто изложу принципы.
Допустим, мы написали нужные правила, определили откуда можно присылать DNS-запросы, все остальное отсекли. И тут DNS перестал работать. Все верно, т.к. мы забыли очень важную вещь: мы забыли разрешить серверам пересылки отвечать нашему роутеру. Т.е. mikrotik получает запрос из локалки, пересылает запрос, например, гуглу (8.8.8.8), гугл пытается ответить нашему роутеру и этот ответ отсекается последним правилом
1 2 3 4 5 6 7 8 9 | /ip firewall filter #… #… #… #поэтому запретим весь остальной траффик в цепочке INPUT # следующее правило отправит ответ гугла в небытие… add action=drop chain=input comment=«Drop Another INPUT» |
Нехорошо. Надо разрешить. Добавляем еще правило перед последним. Здесь я разрешу только серверу 8.8.8.8 ответить на запрос нашего роутера. Это для примера. Можно не указывать src-address, если вы не хотите писать отдельное правило для каждого сервера.
1 2 3 | add chain=input comment=«Allow DNS request» in—interface=myISP protocol=udp src—address=8.8.8.8 src—port=53 |
Обратите внимание, что надо указывать src-port=53 а не dst-port=53. Наш роутер обратится к 8.8.8.8 с произвольного порта, а вот гугл будет отвечать именно с 53-го.
В конечном виде правила будут выглядеть следующим образом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | /ip firewall filter # еще какие-то правила # … # разрешим DNS-запросы с интерфейса ether2, который «смотрит» в локалку # в первом примере было так: # add chain=input comment=»Allow DNS from ether2″ dst-port=53 in-interface=ether2 protocol=udp # здесь я поступлю немного по-другому. Запрещу DNS запросы со всех интерфейсов, кроме ether2 add action=drop chain=input comment=«Drop DNS from !ether2» dst—port=53 in—interface=!ether2 protocol=udp # теперь разрешу всем DNS-серверам отвечать своему роутеру (уберу src-address=8.8.8.8) add chain=input comment=«Allow DNS request» in—interface=myISP protocol=udp src—port=53 #теперь мы точно уверены, что все нужное разрешили выше #поэтому запретим весь остальной траффик в цепочке INPUT add action=drop chain=input comment=«Drop Another INPUT» |
Кто-то пытливый обратил внимание, что в примерах отсутствуют action=accept. Accept используется по-умолчанию. Поэтому, когда мы хотим что-то разрешить, явно указывать “разрешаю” не обязательно.
Если у вас в локалке есть какие-то ресурсы, которым вы хотите присвоить имя, то вы можете добавить запись IP->DNS->Static. Когда это нужно? Да повсеместно. Например, у вас в сети есть файловый сервер или другой внутренний-ресурс, который постоянно мигрирует по разным IP-адресам и вам лень каждый раз перенастраивать подключение у каждого клиента.
Нажимаете “Static” и устанавливаете взаимосвязь между IP и именем хоста. Чтобы не листать наверх, вот вам еще раз рисунок из начала страницы:
Увидите следующее окно и, нажимая “+”, добавляйте свои записи. Вот, собственно:
Или через терминал:
1 2 3 4 5 6 | /ip dns static add address=192.168.1.5 name=file—serv—1.lcl add address=192.168.1.7 name=media—serv—1.lcl add address=192.168.1.6 name=file—serv—2.lcl |
Гораздо легче будет потом жить. Ваши пользователи будут обращаться к file-serv-1.lcl, а вы втихую менять его IP на микротике в случае переезда сервера.
Есть еще кнопка Cache, нажав которую, вы увидите, что в данный момент закешировал mikrotik и сможете этот кеш очистить, нажав в открывшемся окне Flush cache.
С настройкой вкратце все. Теперь мелкая неприятность, с которой я как-то столкнулся. Кроется она во взаимодействии кэша DNS микротика и статических записей. Не знаю, на каких версиях это еще проявляется, я словил на CCR1036-8G-2S+ RouterOS v6.15. Может, я вообще единственный, кто это наблюдал. Но, тем не менее, поделюсь. Вдруг кому поможет.
Если сменился IP хоста и вам надо отредактировать статическую запись, то лучше удалить старую и создать новую. Если просто отредактировать существующую, то в кэше могут остаться старые записи и ни кнопка Flush cache не поможет, ни /ip dns cache flush через терминал.
Глюк проявляется не систематически, но как-то раз заставил меня изрядно напрячь мозг, прежде чем я понял, в чем дело. Проверяйте кэш после редактирования статических записей. Если видите старое в дополнение к новому, то надо заново создать старую запись и удалить ее. Тогда она также удалится и из кэша.
http://vedernikoff.ru/dns-v-mikrotik/