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

Кэширующий DNS в микротике это просто.

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

или же в терминале —

/ip dns
set allowremoterequests=yes servers=1.1.1.1,8.8.4.4,208.67.222.222

Давайте не будем использовать только дефолт. Обезопасим себя и роутер от лишнего и абсолютно ненужного траффика.

При такой дефолтной настройке mikrotik будет отвечать на DNS запросы по всем интерфейсам. (Конечно же в том случае, если вы еще не настроили firewall) Нужны ли такие “левые” запросы? Конечно нет.
Поэтому в настройке firewall до “всеобщего DROP” в цепочке INPUT надо либо явно указать интерфейсы, с которых принимать DNS запросы (по одному правилу на интерфейс), либо указать диапазон IP, с которого принимать эти запросы):

/ip firewall filter
# еще какие-то разрешающие правила
# разрешим DNS-запросы с интерфейса ether2, который «смотрит» в локалку
add chain=input comment=«Allow DNS from ether2» dstport=53 ininterface=ether2 protocol=udp
#мы уверены, что все нужное разрешили выше
#поэтому запретим весь остальной траффик в цепочке INPUT
add action=drop chain=input comment=«Drop Another INPUT»
Либо разрешить DNS на всех интерфейсах, кроме “внешнего”. Вот так, например:
# разрешим везде, кроме myISP, «внешнего» интерфейса
add chain=input comment=«Allow DNS from ether2» dstport=53 ininterface=!myISP protocol=udp
Либо… Либо… Способов много, firewall заслуживает отдельной большой темы даже для базовой настройки. Поэтому углубляться я тут не буду. Просто изложу принципы.
Допустим, мы написали нужные правила, определили откуда можно присылать DNS-запросы, все остальное отсекли. И тут DNS перестал работать. Все верно, т.к. мы забыли очень важную вещь: мы забыли разрешить серверам пересылки отвечать нашему роутеру. Т.е. mikrotik получает запрос из локалки, пересылает запрос, например, cloudFlare (1.1.1.1), cloudflare пытается ответить нашему роутеру и этот ответ отсекается последним правилом
/ip firewall filter
#…
#…
#…
#поэтому запретим весь остальной траффик в цепочке INPUT
# следующее правило отправит ответ гугла в небытие…
add action=drop chain=input comment=«Drop Another INPUT»
Нехорошо. Надо разрешить. Добавляем еще правило перед последним. Здесь я разрешу только серверу 1.1.1.1 ответить на запрос нашего роутера. Это для примера. Можно не указывать src-address, если вы не хотите писать отдельное правило для каждого сервера.
add chain=input comment=«Allow DNS request» ininterface=myISP protocol=udp srcaddress=1.1.1.1 srcport=53

Обратите внимание, что надо указывать src-port=53 а не dst-port=53. Наш роутер обратится к 1.1.1.1 с произвольного порта, а вот гугл будет отвечать именно с 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» dstport=53 ininterface=!ether2 protocol=udp
# теперь разрешу всем DNS-серверам отвечать своему роутеру (уберу src-address=1.1.1.1)
add chain=input comment=«Allow DNS request» ininterface=myISP protocol=udp srcport=53
#теперь мы точно уверены, что все нужное разрешили выше
#поэтому запретим весь остальной траффик в цепочке INPUT
add action=drop chain=input comment=«Drop Another INPUT»
Кто-то пытливый обратил внимание, что в примерах отсутствуют action=acceptAccept используется по-умолчанию. Поэтому, когда мы хотим что-то разрешить, явно указывать “разрешаю” не обязательно.
Если у вас в локалке есть какие-то ресурсы, которым вы хотите присвоить имя, то вы можете добавить запись IP->DNS->Static. Когда это нужно? Да повсеместно. Например, у вас в сети есть файловый сервер или другой внутренний-ресурс, который постоянно мигрирует по разным IP-адресам и вам лень каждый раз перенастраивать подключение у каждого клиента.Нажимаете “Static” и устанавливаете взаимосвязь между IP и именем хоста. Чтобы не листать наверх, вот вам еще

получилось так:

ну и добавим через терминал-

/ip dns static
add address=192.168.30.2 name=host2-ip.myinet.name

Гораздо легче будет потом жить. Ваши пользователи будут обращаться к host2-ip.myinet.name, а вы втихую менять его IP на микротике в случае переезда сервера.

Есть еще кнопка Cache, нажав которую, вы увидите, что в данный момент закешировал mikrotik и сможете этот кеш очистить, нажав в открывшемся окне Flush cache.

На этом всё. Спасибо за внимание!