Борьба с перехватом DNS со стороны оператора

2013.02.09

Доступ в интернет у меня мобильный — 3G от МТС, и недавно я выяснил, что оператор перехватывает не только HTTP трафик (который прозрачно проксируется через некий Harmony proxy), но и DNS.  Причины мне неизвестны, но сама идея не нравится, к тому же не работает OpenNIC (который я практически не использую, но предпочитаю иметь к нему доступ).  Я перебрал несколько способов восстановления прямого доступа к DNS.

Первый вариант, который я пробовал — OpenVPN.  Сервер мой находится довольно далеко, связь с ним не очень быстрая.  К тому же в результате пропадания нескольких пакетов VPN клиент может надолго потерять связь с сервером, отчего визуально пропадает весь интернет, а не только один запрос, попавший на потерянные пакеты.  Если на стабильном городском канале VPN был бы нормальным решением, то при соединении по 3G из деревни этот вариант не подходит.

Второй вариант был, по сути, таким же, но вместо OpenVPN я пробовал sshuttle.  Разница в том, что можно легко переключиться на более быстрый сервер, в роли которого может выступать любая машина, к которой есть доступ по SSH, и не нужно устанавливать там VPN.  Sshuttle умеет проксировать DNS, в целом работает неплохо, но тоже довольно медленно и чувствителен к потере пакетов.

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

Четвёртый вариант — тот, на котором я остановился — использование DNSCrypt.  Это клиент-серверное приложение для шифрования и проксирования DNS запросов по TCP или UDP.  Публичный сервер есть у OpenDNS, которые и продвигают эту технологию.  Их сервер отвечает, в том числе, по TCP порту 443, что неотличимо от HTTPS, то есть оператор не может этот трафик перехватить и подменить, может только запретить.

Чтобы снизить нагрузку на внешний канал, я использую dnsmasq, который кэширует запросы, а со внешним миром общается через dnscrypt-proxy.  Эта связка у меня установлена на маршрутизаторе, там же стоит Squid с большим кэшем, что делает интернет гораздо более отзывчивым и безопасным.

Конфиг dnsmasq выглядит как-то так:

no-resolv
listen-address=127.0.0.1
bind-interfaces
log-queries
server=127.0.0.2
bogus-nxdomain=67.215.65.132

Dnscrypt-proxy запускается без каких-то особенных параметров, только привязывается к адресу 127.0.0.2.  Настроить полный перехват DNS запросов на маршрутизаторе у меня не получилось (но очень хотелось придерживаться стиля), поэтому я просто выдаю его через DHCP.

Следить за развитием событий можно через RSS ленту или почтовую рассылку.