Сайт за туннелем не открывается? Проверьте DNS-резолвер
Недавно нам написал пользователь: сайт за туннелем открывается наполовину. 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 видит резолвер, а не вас
Браузер не спрашивает DNS-сервер Tuna напрямую. Запрос идёт через рекурсивный резолвер: провайдера, роутера, публичного сервиса вроде 1.1.1.1 или 8.8.8.8. До нашего DNS-провайдера доходит адрес этого резолвера, а не ваш.
Если резолвер стоит в той же стране, что и вы, проблемы нет. Если нет, выручает расширение EDNS Client Subnet (ECS): резолвер передаёт в запросе подсеть клиента, и GeoDNS выбирает по ней. Наш DNS-провайдер ECS учитывает, но передают его не все резолверы. У ECS есть обратная сторона: DNS-серверы сайтов видят вашу подсеть. Поэтому сервисы, которые берегут приватность, например Cloudflare, его не передают.
Без ECS GeoDNS видит только адрес узла резолвера, который вам ответил. У крупных публичных сервисов узлы стоят по всему миру, и ближайший по маршруту может оказаться и в Москве, и в Стокгольме.
Какие резолверы мы проверили
Мы проверили популярные публичные резолверы с двух серверов в Москве. Спрашивали имя в зоне a.2na.am по обычному DNS, DNS-over-TLS (DoT) и DNS-over-HTTPS (DoH) и смотрели, передаёт ли резолвер подсеть клиента. Ответ от протокола не зависел, кроме Cloudflare.
| Резолвер | DoT | DoH | Передаёт подсеть | Ответ для клиента из Москвы |
|---|---|---|---|---|
| Яндекс 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.
На стороне Tuna в это время всё в порядке: точка входа отправила ответ целиком, данные потерялись по дороге. Через российскую точку входа тот же сайт у того же посетителя открывается без проблем.
Обратная ситуация тоже бывает. Если вы работаете через VPN с выходом за рубежом, а DNS-запросы идут к российскому резолверу, GeoDNS отдаст российскую точку входа. Трафик к ней пойдёт через зарубежный выход VPN, и такое соединение тоже может оборваться.
Правило одно: 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.
dig, nslookup и tuna diagnose используют системный резолвер. Если в браузере включён «защищённый DNS», браузер резолвит имена сам, в обход системы, и может получить другой ответ. Как его настроить — в разделе «Защищённый DNS в браузере».
Что настроить
В России без VPN
Используйте DNS провайдера (обычно он приходит автоматически от роутера) или публичный резолвер, с которым GeoDNS видит Россию:
| Резолвер | Обычный DNS | DNS-over-TLS | DNS-over-HTTPS |
|---|---|---|---|
| Яндекс DNS | 77.88.8.8, 77.88.8.1 | common.dot.dns.yandex.net | https://common.dot.dns.yandex.net/dns-query |
| Google Public DNS | 8.8.8.8, 8.8.4.4 | dns.google | https://dns.google/dns-query |
| Quad9 с ECS | 9.9.9.11, 149.112.112.11 | dns11.quad9.net | https://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.
Leave feedback
If you enjoy using Tuna, or on the contrary you are not happy with something, please leave feedback.
News
We announce new features and posts on our Telegram channel. Subscribe so you don't miss anything.
Help
We value our users and carefully review every request. If you have any problems with tuna, please contact us in one of the following ways: