Перейти к основному содержимому

Сайт за туннелем не открывается? Проверьте DNS-резолвер

· 10 мин

Недавно нам написал пользователь: сайт за туннелем открывается наполовину. HTML загружается, мелкие запросы проходят, а большие скрипты, стили и картинки обрываются примерно на 20 КБ. Туннель работал исправно, точка входа отдавала ответ целиком. Всё упиралось в настройку DNS: был выбран DNS-over-HTTPS от Cloudflare.

Дело в том, как сервис туннелей Tuna выбирает точку входа для посетителя. Её выбирает DNS, а он видит не посетителя, а его DNS-резолвер. Ниже — как это устроено, как проверить свой резолвер и что настроить.

Коротко
  • Точку входа, российскую или европейскую, выбирает GeoDNS. Он определяет страну не по вашему адресу, а по адресу DNS-резолвера.
  • Зарубежный резолвер, который не передаёт GeoDNS подсеть клиента, может определить вас как пользователя вне России, даже если вы в России. Так ведут себя Cloudflare, обычный Quad9 (9.9.9.9), OpenDNS и другие. Тогда трафик пойдёт на европейскую точку входа, и по пути его могут оборвать.
  • Подходят DNS провайдера и Яндекс DNS, а из зарубежных публичных — Google Public DNS и Quad9 с ECS. Они передают подсеть, и GeoDNS видит, откуда вы на самом деле, в том числе под VPN, если DNS-запросы идут через него.
  • Проверить, куда вас отправил DNS, можно одной командой: dig или nslookup.

Как Tuna выбирает точку входа​

Запросы к туннелям принимают точки входа, а они, на текущий момент, собраны в две группы: российскую и европейскую. Группу выбирает GeoDNS: на запрос имени туннеля он отвечает по-разному в зависимости от того, откуда пришёл запрос.

Все имена туннелей ведут в зону a.2na.am. Это касается случайных и закреплённых имён в a.2na.am, бесплатных поддоменов в a.tuna.free, старых имён в ru.tuna.am и nl.tuna.am и собственных доменов, подключённых через CNAME. Дальше GeoDNS отдаёт:

  • для России — CNAME edge-ru-a.2na.am, российские точки входа;
  • для остальных стран — CNAME edge-eu-a.2na.am, европейские точки входа.

Туннельная нода, к которой подключён tuna-cli, от этого выбора не зависит: любая точка входа доставит запрос до неё. Выбор влияет только на то, через какую страну пойдёт трафик от посетителя до Tuna.

Анимация: браузер спрашивает адрес у резолвера в России, GeoDNS видит Россию и отвечает edge-ru-a, запросы идут через российскую точку входа до tuna-node, и сайт открывается
Обычный случай: резолвер в России, GeoDNS отдаёт российскую точку входа.

GeoDNS видит резолвер, а не вас​

Браузер не спрашивает DNS-сервер Tuna напрямую. Запрос идёт через рекурсивный резолвер: провайдера, роутера, публичного сервиса вроде 1.1.1.1 или 8.8.8.8. До нашего DNS-провайдера доходит адрес этого резолвера, а не ваш.

Если резолвер стоит в той же стране, что и вы, проблемы нет. Если нет, выручает расширение EDNS Client Subnet (ECS): резолвер передаёт в запросе подсеть клиента, и GeoDNS выбирает по ней. Наш DNS-провайдер ECS учитывает, но передают его не все резолверы. У ECS есть обратная сторона: DNS-серверы сайтов видят вашу подсеть. Поэтому сервисы, которые берегут приватность, например Cloudflare, его не передают.

Без ECS GeoDNS видит только адрес узла резолвера, который вам ответил. У крупных публичных сервисов узлы стоят по всему миру, и ближайший по маршруту может оказаться и в Москве, и в Стокгольме.

Анимация: браузер в России спрашивает адрес у Cloudflare, Cloudflare не передаёт подсеть, GeoDNS отвечает edge-eu-a, трафик идёт за рубеж через ТСПУ, маленький ответ проходит, а большой обрывается
Резолвер за рубежом без ECS: GeoDNS принимает посетителя из России за зарубежного.

Какие резолверы мы проверили​

Мы проверили популярные публичные резолверы с двух серверов в Москве. Спрашивали имя в зоне a.2na.am по обычному DNS, DNS-over-TLS (DoT) и DNS-over-HTTPS (DoH) и смотрели, передаёт ли резолвер подсеть клиента. Ответ от протокола не зависел, кроме Cloudflare.

РезолверDoTDoHПередаёт подсетьОтвет для клиента из Москвы
Яндекс DNSдадане нужно, резолвер в Россииedge-ru-a
Google Public DNSдададаedge-ru-a
Quad9 с ECS (9.9.9.11)дададаedge-ru-a
Quad9 (9.9.9.9)даданетedge-eu-a
Cloudflareдаданетзависит от узла
OpenDNSдадатолько избранным DNS-серверам, нашему нетedge-eu-a
AdGuard DNSдаданет, но у него есть узел в Россииedge-ru-a
NextDNS, Control D, CleanBrowsing, DNS.SB, Mullvadдаданетedge-eu-a

Cloudflare хорошо показывает, как работает лотерея без ECS. С одного и того же сервера запросы к 1.1.1.1 и по DoT попадали на узел Cloudflare в Москве и получали edge-ru-a, а запросы по DoH через cloudflare-dns.com — на узел в Стокгольме и получали edge-eu-a.

Это снимок из московского дата-центра. У домашнего провайдера маршрут до узлов Cloudflare, AdGuard и других резолверов без ECS может быть другим, а с ним и ответ. Резолверы с ECS от маршрута не зависят: GeoDNS выбирает по вашей подсети, где бы ни стоял узел резолвера. DoH у DNS.SB и Mullvad из Москвы иногда не отвечал.

Если вам нужен зарубежный публичный резолвер, выбирайте тот, что передаёт подсеть, — Google Public DNS или Quad9 с ECS.

Почему сайт открывается не до конца​

Сама по себе европейская точка входа для посетителя из России не страшна: задержка чуть больше, только и всего. Проблема в ограничениях на пути. У многих российских провайдеров соединения с зарубежными хостингами обрываются, когда через них прошло примерно 16–20 КБ данных. Это поведение ТСПУ, и мы видим его в обращениях клиентов разных провайдеров.

Отсюда характерная картина:

  • маленькие ответы (HTML, запросы к API) приходят целиком;
  • большие файлы (JS-бандлы, CSS, картинки) обрываются или грузятся бесконечно;
  • в инструментах разработчика браузера — запросы в статусе pending или с ошибкой вроде ERR_CONNECTION_RESET, ERR_HTTP2_PROTOCOL_ERROR.
Анимация загрузки страницы. Через российскую точку входа все файлы загружаются целиком. Через европейскую точку входа и ТСПУ index.html и ответ API приходят целиком, а style.css, app.js и hero.jpg обрываются примерно на 20 КБ
Один и тот же сайт у одного и того же посетителя. Через ТСПУ проходят только ответы меньше примерно 20 КБ.

На стороне Tuna в это время всё в порядке: точка входа отправила ответ целиком, данные потерялись по дороге. Через российскую точку входа тот же сайт у того же посетителя открывается без проблем.

Обратная ситуация тоже бывает. Если вы работаете через VPN с выходом за рубежом, а DNS-запросы идут к российскому резолверу, GeoDNS отдаст российскую точку входа. Трафик к ней пойдёт через зарубежный выход VPN, и такое соединение тоже может оборваться.

Анимация: под VPN DNS-запрос уходит к провайдеру в обход VPN, GeoDNS видит Россию и отвечает edge-ru-a, трафик идёт к российской точке входа через зарубежный выход VPN и обрывается
VPN, но DNS идёт мимо него: GeoDNS видит Россию, а трафик выходит за рубежом.

Правило одно: GeoDNS должен видеть ту же страну, откуда выходит ваш трафик. Так будет, если резолвер стоит там же или передаёт вашу подсеть.

Как проверить​

Спросите DNS, куда он направляет a.2na.am. На этот адрес ходят TCP-туннели (a.2na.am:<порт>), а для HTTP-имён вида myapp.a.2na.am ответ тот же:

dig a.2na.am

Смотрите на CNAME в секции ANSWER:

a.2na.am. 300 IN CNAME edge-ru-a.2na.am.

То же через nslookup, он есть и в Windows:

nslookup a.2na.am
a.2na.am canonical name = edge-ru-a.2na.am.
  • edge-ru-a.2na.am — российская точка входа;
  • edge-eu-a.2na.am — европейская.

Если вы в России без VPN и видите edge-eu-a, резолвер выбран неудачно. Если вы под VPN с зарубежным выходом и видите edge-ru-a, DNS-запросы идут мимо VPN.

Если у вас установлен tuna-cli, команда tuna diagnose показывает то же самое в секции DNS: регион — последнее имя в цепочке CNAME.

Браузер может спрашивать DNS сам

dig, nslookup и tuna diagnose используют системный резолвер. Если в браузере включён «защищённый DNS», браузер резолвит имена сам, в обход системы, и может получить другой ответ. Как его настроить — в разделе «Защищённый DNS в браузере».

Что настроить​

В России без VPN​

Используйте DNS провайдера (обычно он приходит автоматически от роутера) или публичный резолвер, с которым GeoDNS видит Россию:

РезолверОбычный DNSDNS-over-TLSDNS-over-HTTPS
Яндекс DNS77.88.8.8, 77.88.8.1common.dot.dns.yandex.nethttps://common.dot.dns.yandex.net/dns-query
Google Public DNS8.8.8.8, 8.8.4.4dns.googlehttps://dns.google/dns-query
Quad9 с ECS9.9.9.11, 149.112.112.11dns11.quad9.nethttps://dns11.quad9.net/dns-query

С VPN​

Используйте резолвер с ECS из таблицы выше или DNS за пределами России и убедитесь, что DNS-запросы идут через VPN. Тогда GeoDNS увидит подсеть выхода VPN и отдаст точку входа вне России. Многие VPN-клиенты делают это сами, но при раздельном туннелировании (split tunneling) DNS может уходить к провайдеру напрямую. В этом случае GeoDNS отдаст российскую точку входа, а трафик к ней пойдёт через зарубежный выход VPN и может не открыться.

Защищённый DNS в браузере​

Chrome, Edge и Firefox умеют резолвить имена по DNS-over-HTTPS сами и подменяют этим системный резолвер. Если там выбран провайдер без ECS, например Cloudflare, обычный Quad9, NextDNS или CleanBrowsing, выберите Google Public DNS или впишите свой адрес DNS-over-HTTPS из таблицы выше. Можно и просто отключить защищённый DNS:

  • Chrome и Edge: «Настройки» → «Конфиденциальность и безопасность» → «Безопасность» → «Использовать безопасный DNS»;
  • Firefox: «Настройки» → «Приватность и защита» → «DNS через HTTPS».

На Android то же делает «Частный DNS» в настройках сети.

Не прописывайте адреса вручную​

Не закрепляйте адреса точек входа в /etc/hosts, в curl --resolve и подобных местах. Адреса точек входа меняются: мы добавляем и выводим точки входа, а при отказе DNS убирает неисправную из ответа. Закреплённый адрес однажды перестанет работать, а отказоустойчивость пропадёт сразу.

Почему мы не можем исправить это у себя​

Честно: это ограничение. Работу сайтов в условиях цензуры и ТСПУ мы гарантировать не можем. Мы можем только направить посетителя на точку входа, до которой его трафик скорее всего дойдёт. А решать, куда направить, приходится по тому, что видно GeoDNS: по адресу резолвера или по подсети, которую он передал.

Основная аудитория Tuna в России, но много пользователей в СНГ и Европе, и сайты за туннелями должны открываться у всех. Поэтому мы держим точки входа и там, и там и балансируем между регионами. Большего в текущих условиях на нашей стороне сделать нельзя.

Дальше точки входа появятся в новых регионах, например в Сингапуре и США. Принцип не изменится: точку входа выбирает DNS, так что правило про резолвер останется в силе.

Если вы проверили DNS, а сайт за туннелем всё равно открывается не целиком, напишите нам в поддержку и приложите вывод tuna diagnose и dig a.2na.am.

Оставьте отзыв​

Если вам нравится пользоваться Tuna, или наоборот вы недовольны чем-либо, то пожалуйста оставьте отзыв.

Новости​

Анонсы новых функций и статей публикуем в Telegram-канале. Подписывайтесь, чтобы ничего не пропустить.

Помощь​

Мы ценим наших пользователей и детально изучаем все обращения, если у вас возникли проблемы с tuna – обязательно свяжитесь с нами одним из способов: