вторник, 6 мая 2014 г.

Windows 7 + Unbound + dnscrypt

Я уже писал об использовании рекурсоров в сочетании с прокси-серверами. В офисных сетях это действительно позволяет ускорить работу в инете и существенно уменьшить внешний трафик. 

Как ни странно, аналогичный (хотя и меньший) выигрыш можно получить и на домашнем интернете (кэширующие персональные прокси перестали развиваться после 2006-2008 года).

Однако, если вы посмотрите на среднестатистичекую веб-страницу, то увидите кучу ссылок, каждая из которых при загрузке резловится. Есть ли разница, откуда берутся DNS-ответы? Есть. Выиграть можно до нескольких секунд при загрузке каждой страницы, если брать данные из уже прогретого кэша локального рекурсора. Особенно заметен эффект на WiFi и 3G/GPRS подключениях. Даже субьективно скорость загрузки выше.

Итак, возьмем Unbound для Windows. Скомбинировать его можно как с любыми публичными или провайдерскими DNS в качестве форвардеров, так и с нашим любимым dnscrypt.

Сразу оговорюсь - версия Unbound для Windows не имеет в своем составе утилиты unbound-control-setup (это скрипт), и для конфигурирования управления вам придется выполнять эту команду и брать результирующие файлы с *NIX-системы. Либо воспользоваться переписанной мной версией юниксового скрипта (unbound-control-setup.cmd).

Замечание. Данная версия unbound-control-setup требует установленного OpenSSL Win32/Win64, путь к бинарникам openssl должен быть добавлен в переменную окружения PATH пользователя или компьютера.

Кроме того, написание config-файла несколько отличается (я бы сказал, существенно отличается) по допустимым опциям и их значениям на Windows и *NIX.

Установим Unbound. рекомендую сразу же открыть консоль с правами администратора - она понадобится.

Откроем редактор и начинаем править конфигурационный файл (скачать его можно отсюда). Кстати, лежит он, в отличие от *NIX, в директории программы (то бишь в C:\Program Filex (x86)\Unbound на 64-битных системах и в CL\Program Files\Unbound в 32-битных).


# Unbound configuration file on windows.
# See example.conf for more settings and syntax


server:
# verbosity level 0-4 of logging
verbosity: 0

# if you want to log to a file use
#logfile: "C:\unbound.log"

# on Windows, this setting makes reports go into the Application log
# found in ControlPanels - System tasks - Logs 
use-syslog: yes
num-threads: 2
cache-min-ttl: 86400

do-not-query-localhost: no
prefetch: yes
minimal-responses: yes

include: "C:\Program Files (x86)\Unbound\unbound_ad_servers" 

# Remote control config section. 
remote-control:
# Enable remote control with unbound-control(8) here.
# set up the keys and certificates with unbound-control-setup.
control-enable: yes

# what interfaces are listened to for remote control.
# give 0.0.0.0 and ::0 to listen to all interfaces.
control-interface: 127.0.0.1
# control-interface: ::1

# port number for remote control operations.
control-port: 8953

# unbound server key file.
server-key-file: "C:\Program Files (x86)\Unbound\unbound_server.key"

# unbound server certificate file.
server-cert-file: "C:\Program Files (x86)\Unbound\unbound_server.pem"

# unbound-control key file.
control-key-file: "C:\Program Files (x86)\Unbound\unbound_control.key"

# unbound-control certificate file.
control-cert-file: "C:\Program Files (x86)\Unbound\unbound_control.pem"

forward-zone:
name: "."
# forward-addr: 127.0.0.1@5553
forward-addr: 8.8.4.4@53
forward-addr: 8.8.8.8@53

server: auto-trust-anchor-file: "C:\Program Files (x86)\Unbound\root.key"

И не забудьте перезапустить сервис unbound:


и включить в качестве сервера DNS локальный хост:



Некоторые пояснения.

Параметр num-threads определяется вами по количеству ядер процессора - ну или по количеству желаемых тредов. Минимальный TTL для максимального выигрыша от применения рекурсора ставим в наибольшее возможное значение - т.е. сутки. Секцию remote-control включаем только если у вас есть созданные сертификаты для управления, в противном случае закомментируйте ее целиком. Список unbound_ad_servers нужно предварительно создать скриптом, который я приведу ниже и, желательно, задание обновления этого списка (вызовом скрипта) забить в Планировщик заданий с интервалом хотя бы в 1 неделю.

Скрипт обновления ad-серверов (Windows-версия):


@Echo off
rem Convert the Yoyo.org anti-ad server listing
rem into an unbound dns spoof redirection list.
rem Written by Y.Voinov (c) 2014

rem Note: Wget required!

rem Variables
set prefix="C:\Program Files (x86)"
set dst_dir=%prefix%\Unbound
set work_dir=%TEMP%
set list_addr="http://pgl.yoyo.org/adservers/serverlist.php?hostformat=nohtml&showintro=1&startdate%5Bday%5D=&startdate%5Bmonth%5D=&startdate%5Byear%5D="

rem Check Wget installed
for /f "delims=" %%a in ('where wget') do @set wget=%%a
if /I "%wget%"=="" echo Wget not found. If installed, add path to PATH environment variable. & exit 1
echo Wget found: %wget%

%wget% -O %work_dir%\yoyo_ad_servers %list_addr%

del /Q /F /S %dst_dir%\unbound_ad_servers

for /F "eol=; tokens=*" %%a in (%work_dir%\yoyo_ad_servers) do (
echo local-zone: %%a redirect>>%dst_dir%\unbound_ad_servers
echo local-data: "%%a A 127.0.0.1">>%dst_dir%\unbound_ad_servers
)

echo Done.
rem  then add an include line to your unbound.conf pointing to the full path of
rem  the unbound_ad_servers file:
rem
rem   include: $dst_dir/unbound_ad_servers
rem



Написан на основе своего юниксового варианта от calomel.org. Требует установленного GNU Wget и может потребовать модификации переменной prefix в зависимости от разрядности вашей Windows.

Настоятельно советую поставить его в автоматически выполняемое задание:


Дело в следующем. Это очень хороший список ad-серверов, включающий в себя не только зарубежные сайты и сети, но также и почти всю рекламу Рунета. Чем хорош такой метод блокирования - вы не грузите данных с этих сайтов. Совсем. Сильно экономя трафик. Что, может быть, и пофигу на проволочном или оптическом безлимите, но совершенно не безразлично на WiFi или, тем более, на 3G/GPRS - где трафик стоит денег.

Да, по-хорошему после его обновления нужно рестартовать Unbound. Правда, кэш при этом будет сброшен и вымерзнет.

Вам может пригодиться скрипт сохранения на диске и последующей загрузки кэша, как и на *NIX.

Вот он:

@echo off
rem --------------------------------------------------------------
rem -- DNS cache save/load script
rem --
rem -- Version 1.0
rem -- By Yuri Voinov (c) 2014
rem --------------------------------------------------------------

rem Variables
set prefix="C:\Program Files (x86)"
set program_path=%prefix%\Unbound
set uc=%program_path%\unbound-control.exe
set fname="unbound_cache.dmp"

rem Check Unbound installed
if exist %uc% goto start
echo Unbound control not found. Exiting...
exit 1

:start

set arg=%1

if /I "%arg%" == "-h" goto help

if "%arg%" == "" (
echo Loading cache from %program_path%\%fname%
type %program_path%\%fname%|%uc% load_cache
goto end
)

if /I "%arg%" == "-s" (
echo Saving cache to %program_path%\%fname%
%uc% dump_cache>%program_path%\%fname%
echo ok
goto end
)

if /I "%arg%" == "-l" (
echo Loading cache from %program_path%\%fname%
type %program_path%\%fname%|%uc% load_cache
goto end
)

if /I "%arg%" == "-r" (
echo Saving cache to %program_path%\%fname%
%uc% dump_cache>%program_path%\%fname%
echo ok
echo Loading cache from %program_path%\%fname%
type %program_path%\%fname%|%uc% load_cache
goto end
)

:help
echo Usage: unbound_cache.cmd [-s] or [-l] or [-r] or [-h]
echo.
echo l - Load - default mode. Warming up Unbound DNS cache from saved file. cache-ttl must be high value.
echo s - Save - save Unbound DNS cache contents to plain file with domain names.
echo r - Reload - reloadind new cache entries and refresh existing cache
echo h - this screen.
echo Note: Run without any arguments will be in default mode.
echo       Also, unbound-control must be configured.
exit 1

:end

Как и предыдущий скрипт, он требует возможной корректировки переменной prefix и требует, чтобы был сконфигурирован unbound-control.

Соответственно, перед рестартом Unbound вы можете сохранить кэш на диске, а после оного загрузить его обратно. :)

Вернемся к конфигурационному файлу.

Самая важная его часть, пожалуй - это секция форвардеров.

В простейшем случае можете навести ее на GoogleDNS или OpenDNS и наслаждаться. Но во многих случаях может оказаться практично поженить его также с dnscrypt.

Вам потребуется dnscrypt для Win32. Его надо распаковать, скажем, в C:\Program Files и установить сервис:


Одно маленькое замечание. Dnscrypt для Windows конфигурируется через регистри. Рег-файл для установки нужных нам параметров (шаблон, вы можете подправить его по своим надобностям, параметры описаны здесь) вот:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\dnscrypt-proxy\Parameters]
"ProviderKey"="B735:1140:206F:225D:3E2B:D822:D7FD:691E:A1C3:3CC8:D666:8D0C:BE04:BFAB:CA43:FB79"
"ProviderName"="2.dnscrypt-cert.opendns.com"
"ResolverAddress"="208.67.220.220:443"
;"ResolverName"="opendns"
;"ResolverList"="C:\Program Files (x86)\dnscrypt-proxy-win32\dnscrypt-resolvers.csv"
"LocalAddress"="127.0.0.1:5553"
"TCPOnly"=dword:00000000
"MaxActiveRequests"=dword:00000200


Параметры приведены для текущей версии dnscrypt Win32 - 1.3.3. Параметры для версии 1.4.0 (еще не вышла на момент написания статьи) закомментированы. Обратите внимание, что dnscrypt будет слушать запросы на порту 5553.

Загрузите этот рег-файл и перезапустите dnscrypt:


Можете убедиться при помощь telnet, что слушается именно порт 5553.

Теперь можете раскомментировать строку 

# forward-addr: 127.0.0.1@5553

в конфигурации unbound, перезапустить его и получать удовольствие.;)

Экстремалы могут отключить другие форвардеры, но я не советую этого делать. Лучше оставить резервные адреса для разрешения имен (Первым срабатывает первый ответивший форвардер с начала списка).

Важное замечание. "Интернет дома" от Beeline очень не любит, когда Unbound стоит на машине, устанавливающей VPN-соединение на провайдера и раздающей интернет. Я не копал глубоко, но полагаю, что это как-то связано с механизмом аутентификации VPN-провайдера, требующего собственных DNS. Это, конечно, обидно - потому что выигрыш был бы наибольший именно в случае кэширования DNS на раздающей интернет машине, однако решить данную проблему пока не удалось.

Однако вам никто не мешает поставить Unbound на другие машины домашней сети.

UPDATE Скрипты приняли в дерево исходников Unbound. Со следующей версии будут в составе дистрибутива.