[Из песочницы] MicroTik & OpenWRT & DNSCrypt

Решение данного квеста навеяно этой статьей.

Данная статья рассчитана на пользователя, имеющего домашний роутер производства MicroTik, поэтому моменты, связанные непосредственно с компиляцией и сборкой, опущены, а примеры по MicroTik’у в картинках.

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

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

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

Создаем нового гостя, импортируя сборку в MetaROUTER (MetaROUTER→Import Image):

image

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

image

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

После создания гостя он в Disable. Делаем Enable, открываем Console (правой кнопкой на госте), ждем примерно 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
…


Прежде чем двигаться дальше рекомендую потестить OpenWRT — подключиться телнетом, позапускать что-нибудь — ping, netstat и т.д. что бы убедится, что OpenWRT не падает в kernel panic.

Если все хорошо — приступаем к 'допиливанию' (в консоли):

root@metarouter:/# cd /tmp
root@metarouter:/tmp# wget ftp://admin:passwd@router/files.tar.gz (где, router - IP адрес Microtik)
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


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

Если это так, задачу можно считать завершенной.

Работоспособность решения проверялась на 951/2011 моделях.

© Habrahabr.ru