MikroTik & OpenWRT & DNSCrypt

Взято отсюда https://habr.com/post/354710/
Данная статья рассчитана на пользователя, имеющего домашний роутер производства MikroTik, поэтому моменты, связанные непосредственно с компиляцией и сборкой, опущены, а примеры по MikroTik’у в картинках.Итак, вкратце, постановка задачи следующая: поднять в качестве виртуальной машины (гостя) на MetaROUTER урезанную версию OpenWRT и уже на нем поднять связку DNS + DNSCrypt, которую использовать для шифрованного обмена данными с внешними DNS серверами.

Решить данную задачу стандартным способом, взяв исходники LEDE(OpenWRT) с поддержкой DNSCrypt, пропатчить KDE под FreeBSD под Mikrotik MetaROUTER и скомпилировать не удалось, поскольку либо ошибки при накладывании патча, либо при компиляции, либо сборка ведет себя не стабильно, ИМХО.

Решить задачу удалось методом последовательных приближений – взяв готовую, старую, но стабильную сборку OpenWRT АА 31411, часть пакетов доставить из репозитария, часть скомпилировать отдельно и немного доработать конфиги напильником.

Итак, берем готовый mikrotik-openwrt-dnscrypt (отдельно сборку OpenWRT можно взять здесь), разархивируем, по FTP или через буфер обмена (в проводнике скопировать, на роутере Files->Paste) заливаем на MikroTik файлы openwrt-mr-mips-rootfs-31411-basic.tar.gz и files.tar.gzСоздаем нового гостя, импортируя сборку в MetaROUTER (MetaROUTER->Import Image):

image

Добавляем новый eth интерфейс для гостя:

image

Чтобы максимально упростить запуск OpenWRT IP он получает по DHCP от MikroTik, для этого указываем добавлять гостевой инт. (у меня это vif19) в бридж (у меня это – bridge1), в котором также находится внутренний мастер инт. роутера (на моем примере немного иначе, но сути не меняет). Когда OpenWRT получит адрес, делаем его статическим в настройках DHCP сервера роутера и данный адрес указываем в настройках DHCP сервера как адрес DNS сервера для компьютеров (IP->DHCP server->Networks->DNS servers).

После создания гостя он в Disable. Делаем Enable, открываем Console (правой кнопкой на госте) или через командную строку в микртоике «metarouter console ИМЯ» выход  ctrl+A,  ждем примерно 75 сек, периодически запуская ifconfig, чтобы отловить момент подъема сетевого интерфейса и получения адреса (примерно так):

root@metarouter:/# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:8D:A2:1D:9D:73 
              inet addr:172.16.1.247  Bcast:172.16.1.255  Mask:255.255.255.255
При первом запуске поменять пароль на маршрутизаторе #passwd
Прежде чем двигаться дальше рекомендую потестить OpenWRT – подключиться телнетом, позапускать что-нибудь — ping, netstat и т.д. что бы убедится, что OpenWRT не падает в kernel panic.Если все хорошо — приступаем к ‘допиливанию’ (в консоли):

root@metarouter:/# cd /tmp
root@metarouter:/tmp# wget ftp://admin:passwd@router/files.tar.gz (где, router - IP адрес Mikrotik)
root@metarouter:/tmp# tar xzf files.tar.gz
root@metarouter:/tmp cd files
root@metarouter:/tmp/files# ./install.sh

Результат работы install.sh (на отсутствие ошибок)

PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=56 time=13.374 ms
64 bytes from 8.8.8.8: seq=1 ttl=56 time=15.320 ms
64 bytes from 8.8.8.8: seq=2 ttl=56 time=12.756 ms— 8.8.8.8 ping statistics — 3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 12.756/13.816/15.320 ms
Downloading openwrt.wk.cz/trunk/mr-mips/packages/Packages.gz.
Inflating openwrt.wk.cz/trunk/mr-mips/packages/Packages.gz.
Updated list of available packages in /var/opkg-lists/snapshots.
Installing libcap (2.22-1) to root…
Downloading openwrt.wk.cz/trunk/mr-mips/packages/libcap_2.22-1_mr-mips.ipk.
Configuring libcap.
Installing ntpdate (4.2.6p5-1) to root…
Downloading openwrt.wk.cz/trunk/mr-mips/packages/ntpdate_4.2.6p5-1_mr-mips.ipk.
Configuring ntpdate.
Installing libsodium (1.0.16-1) to root…
Multiple packages (libc and libc) providing same name marked HOLD or PREFER. Using latest.
Installing libpthread (0.9.33-104) to root…
Downloading openwrt.wk.cz/trunk/mr-mips/packages/libpthread_0.9.33-104_mr-mips.ipk.
Configuring libpthread.
Configuring libsodium.
Installing dnscrypt-proxy-resolvers (1.9.5+git-20171001-2d43be3-8) to root…
Multiple packages (libc and libc) providing same name marked HOLD or PREFER. Using latest.
Configuring dnscrypt-proxy-resolvers.
Installing dnscrypt-proxy (1.9.5-8) to root…
Multiple packages (libc and libc) providing same name marked HOLD or PREFER. Using latest.
Configuring dnscrypt-proxy.
Installing rng-tools (5-1) to root…
Multiple packages (libc and libc) providing same name marked HOLD or PREFER. Using latest.
Configuring rng-tools.
24 Apr 11:22:24 ntpdate[2321]: adjust time server 91.203.172.2 offset -0.010429 sec
cp: omitting directory ‘etc/config’

Если ошибок не было перегружаем OpenWRT:

root@metarouter:/tmp/files# reboot

После перезагрузки OpenWRT (~75 сек) заходим в консоль и проверяем, что dnscrypt-proxy запустился:

root@metarouter:/# netstat -anp
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 127.0.0.1:5353          0.0.0.0:*               LISTEN      2150/dnscrypt-proxy
…

Проверяем работу DNSCrypt, например, что-нибудь разрезольвим:

root@metarouter:/# nslookup ya.ru
Server:    127.0.0.1
Address 1: 127.0.0.1 localhost

Name:      ya.ru
Address 1: 2a02:6b8::2:242 ya.ru
Address 2: 87.250.250.242 ya.ru
По задумке автора тут должно было работать! НО!!!!
не работает потому что сервер к которому обращается dnscrypt не доступен или не работает.
Предлагаю следующее:
Отключить dnsmasq #/etc/init.d/dnsmasq disable
Зачем он там вообще?
Включить доступ по SSH #/etc/init.d/dropbear enable
Повесить dnscrypt на 53 порт и адрес 0.0.0.0
#vi /etc/rc.local исправить настройки и указать сервер dnscrypt.ca-1 или другой из списка /etc/config/dnscrypt-resolvers.csv
Отключить в этом файле другие dns серверы в файл /etc/resolv.conf
На компьютере перезапускаем сетевой инт., смотрим в его настройки, убеждаемся, что в качестве адреса DNS сервера получен адрес нашего OpenWRT.
Запись опубликована в рубрике Mikrotik. Добавьте в закладки постоянную ссылку.