Кеширующий DNS в Mikrotik

 

Кэширующий DNS в микротике это хорошо и просто. Настраивается быстро, используется легко и непринужденно. Опишу на примере и чуток поделюсь опытом.

 

Итак, начнем. Если вы используете winbox, то первый этап выполняется в несколько кликов: IP->DNS. В появившемся окне указываете серверы пересылки, не забыв при этом поставить галку «Allow remote requests».

 

 

В терминале

 

/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, с которого принимать эти запросы):

 

/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 на всех интерфейсах, кроме «внешнего». Вот так, например:

 

# разрешим везде, кроме myISP, "внешнего" интерфейса

add chain=input comment="Allow DNS from ether2" dst-port=53 in-interface=!myISP protocol=udp

 

Допустим, мы написали нужные правила, определили откуда можно присылать DNS-запросы, все остальное отсекли. И тут DNS перестал работать. Все верно, т.к. мы забыли очень важную вещь: мы забыли разрешить серверам пересылки отвечать нашему роутеру. Т.е. mikrotik получает запрос из локалки, пересылает запрос, например, гуглу (8.8.8.8), гугл пытается ответить нашему роутеру и этот ответ отсекается последним правилом

 

/ip firewall filter

#...

#...

#...

#поэтому запретим весь остальной траффик в цепочке INPUT

# следующее правило отправит ответ гугла в небытие...

add action=drop chain=input comment="Drop Another INPUT"

 

Нехорошо. Надо разрешить. Добавляем еще правило перед последним. Здесь я разрешу только серверу 8.8.8.8 ответить на запрос нашего роутера. Это для примера. Можно не указывать src-address, если вы не хотите писать отдельное правило для каждого сервера.

 

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-го.

 

В конечном виде правила будут выглядеть следующим образом.

 

/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 и именем хоста. Чтобы не листать наверх, вот вам еще раз рисунок из начала страницы:

 

 

Увидите следующее окно и, нажимая «+», добавляйте свои записи. Вот, собственно:

 

 

Или через терминал:

 

/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 через терминал.

 

Глюк проявляется не систематически, но как-то раз заставил меня изрядно напрячь мозг, прежде чем я понял, в чем дело. Проверяйте кэш после редактирования статических записей. Если видите старое в дополнение к новому, то надо заново создать старую запись и удалить ее. Тогда она также удалится и из кэша.