Основы

Секреты dd и ee: как прочитать ссылку на прокси

Сервер, порт и секрет: что значат префиксы dd и ee и что можно проверить до подключения.

Содержание 18 разд.

Ссылку на прокси обычно просто нажимают, не читая. Но три параметра в ней — единственное, что можно проверить до подключения, а секрет подсказывает режим работы, и часто — причину, по которой прокси не подключается. Разберём ссылку по частям.

Ссылка по параметрам

Формат ссылки задан документацией Telegram. Есть две равнозначные записи: tg://proxy открывается напрямую в приложении, а t.me/proxy — в браузере. Хост t.me можно писать и как telegram.me или telegram.dog, а часть после # игнорируется.

tg://proxy?server=proxy.example.com&port=443&secret=ee473ce5d4958eb5f968c87680a23854a0676f6f676c652e636f6d
ПараметрОбязательныйЧто это
serverдаадрес или IP-адрес сервера
portдапорт сервера
secretдасекрет прокси

Параметры разделены знаком &. Если вы копируете ссылку со страницы, убедитесь, что вместе с ней не скопировались лишние символы: в HTML амперсанд пишется как &, и такая ссылка не откроется.

Сервер и порт

Сервер — доменное имя или IP-адрес. Домен удобнее: адрес сервера можно поменять, не перевыпуская ссылку. Порт чаще всего 443 — тот же, что у обычных сайтов по HTTPS: на нём трафик выглядит естественнее, а на нестандартных портах соединения чаще попадают под фильтры.[1]

[1] Для режима ee это особенно важно: он имитирует HTTPS, а HTTPS живёт на порту 443.

Больше про сервер и порт сказать нечего: проверить, отвечает ли адрес, можно только подключившись. Главное, что скрывается в ссылке, — секрет.

Секрет

— шестнадцатеричная строка. В основе у неё всегда 16 случайных байт, то есть 32 символа. Дальше возможны три варианта:

ВидДлинаСтруктураРежим
Без префикса32 символаключобычный (obfuscated2)
dd34 символаdd + ключслучайное дополнение пакетов
eeот 42 символовee + ключ + домен в hexFakeTLS
dd — случайное дополнение пакетовddключ, 16 байтee — FakeTLSeeключ, 16 байтдомен в hex32 hex-символаgoogle.com в hex676f6f676c652e636f6d = google.com
Рис. 1. Устройство секрета: префикс режима, ключ и — только у ee — домен маскировки.

В документации Telegram формат описан именно так: секрет — 16 байт, обычно в hex; существует и 17-байтовая форма, у которой первый байт выбирает транспорт, чаще всего 0xdd — padded intermediate.

Что значит dd

В README официального MTProxy сказано: некоторые провайдеры определяют MTProxy по размерам пакетов, поэтому в такой режим добавлено случайное дополнение. Включают его на стороне клиента — префиксом dd в секрете (cafe…babe превращается в ddcafe…babe), и дополнение применяется только для клиентов, которые его запросили.

На уровне протокола это транспорт padded intermediate: перед пакетом идёт 4-байтовая длина, а общая длина включает от 0 до 15 случайных байт. Размеры перестают быть постоянными, но начало соединения остаётся прежним.

Что значит ee

Префикс ee включает . В отличие от dd, после ключа в секрете идёт ещё и домен — те самые байты, которые клиент назовёт в поле . Поэтому секрет ee всегда длиннее. Домен читается из hex:

echo 676f6f676c652e636f6d | xxd -r -p

Почему от этого домена зависит жизнь прокси — в статье «FakeTLS: как прокси притворяется сайтом».

Для mtg секрет бывает и в формате base64, и в hex с префиксом ee: команда mtg generate-secret --hex google.com выдаёт вторую форму, а без ключа --hex — первую. Если у вас base64, не обрезайте и не пересобирайте его вручную, а получите готовую ссылку командой mtg access.

Практикум: разбираем секрет по символам

Возьмём пример из документации mtg — секрет для google.com. В нём 54 символа, и считать их удобно по таблице:

СимволыДлинаЧто это
1–22ee — режим FakeTLS
3–3432ключ — 16 случайных байт
35–5420676f6f676c652e636f6d — слово google.com, записанное байтами: два символа на каждую букву

Отсюда правило: длина ee-секрета равна 2 + 32 + удвоенное число символов домена. Для секрета с доменом из десяти символов получится 54, из двенадцати — 58. Короче 42 символов ee-секрет не бывает: Telegram Desktop принимает его от 21 байта, то есть на домен должно прийтись хотя бы четыре байта. Если длина не сходится, секрет обрезан или собран с ошибкой.

Тот же ключ в режиме dd выглядел бы как dd473ce5d4958eb5f968c87680a23854a0 — 34 символа без домена, а в обычном режиме — просто 32 символа ключа.

Как сгенерировать секрет самому

Ключ — это 16 случайных байт. Для режимов без домена достаточно одной команды; обе взяты из документации проектов:

openssl rand -hex 16 head -c 16 /dev/urandom | xxd -ps

Для режима dd к результату добавляют префикс dd. Для FakeTLS проще всего довериться программе: mtg generate-secret --hex ваш-домен.example сразу выдаёт готовый секрет с префиксом и доменом. Если нужно собрать его вручную, достаточно склеить префикс, ключ и домен в hex:

KEY=$(openssl rand -hex 16) DOMAIN=ваш-домен.example printf 'ee%s%s\n' "$KEY" "$(printf '%s' "$DOMAIN" | xxd -p | tr -d '\n')"

Домен в секрете должен совпадать с тем, что настроен на сервере: у telemt это параметр tls_domain, у mtg домен берётся из самого секрета.

Что клиент делает с секретом

Секрет не отправляется по сети: он участвует в выводе ключей. По документации Telegram, при обфускации ключ шифрования потока вычисляется как SHA256 от ключа из начального пакета и секрета. Клиент и прокси, которые знают один секрет, получают одинаковые ключи; у чужого клиента ключи будут другими, и прокси не примет его соединение.

Если секрет 17-байтовый (с префиксом вроде dd), первый байт определяет транспорт и в выводе ключей не участвует. Клиенты, увидев лишний байт, по умолчанию используют padded intermediate — режим со случайным дополнением.

Один секрет или несколько

Сервер может принимать несколько секретов: у официального MTProxy ключ -S можно указать несколько раз. Это нужно, чтобы выдавать разным людям разные ссылки и отзывать их по отдельности. В mtg секрет один — авторы считают это сознательным решением; в telemt секреты задаются для пользователей в разделе [access.users].

Три примера ссылок

Одна и та же пара «сервер и порт» может выдаваться с разным секретом. Так выглядят три варианта (адрес и ключ условные):

tg://proxy?server=proxy.example.com&port=443&secret=473ce5d4958eb5f968c87680a23854a0 tg://proxy?server=proxy.example.com&port=443&secret=dd473ce5d4958eb5f968c87680a23854a0 tg://proxy?server=proxy.example.com&port=443&secret=ee473ce5d4958eb5f968c87680a23854a0676f6f676c652e636f6d

Первая ссылка включает обычный режим, вторая — режим со случайным дополнением, третья — FakeTLS с доменом google.com. Для клиента различие только в секрете: сервер и порт те же. Именно поэтому секрет — первое, что стоит читать.

Домен и секрет меняются вместе

В ee-секрете домен — часть ключа, а на сервере домен задан отдельно: у telemt это параметр tls_domain, у mtg домен берётся из секрета. Если поменять одно, не поменяв другое, клиенты перестанут подключаться: по FAQ telemt, при смене домена старые ссылки дают ошибку «Unknown TLS SNI». Поэтому меняйте их парой и перевыпускайте ссылки.

Как передавать ссылку

  • личным сообщением тем, кому вы доверяете, а не в публичных каналах и чатах;
  • по возможности — отдельный секрет каждому: такой секрет можно отозвать, не затрагивая остальных (поддерживают официальный MTProxy и telemt);
  • если ссылка уже разошлась, смените секрет, а не надейтесь, что её «потеряют»;
  • не отправляйте секрет сторонним сервисам «проверки прокси»: вы отдаёте пароль.

Что проверить до подключения

  1. Ссылка начинается с tg://proxy или t.me/proxy и содержит все три параметра.
  2. Секрет начинается с ee — иначе режим обычный или dd.
  3. Длина секрета укладывается в таблицу выше: 32, 34 или не меньше 42 символов.
  4. Домен в конце ee-секрета читается и это обычный сайт, а не случайный набор символов.
  5. Порт — 443 или другой привычный для HTTPS порт.
  6. Нет пробелов, переносов строк и лишних символов вроде &.

Частые ошибки

  • Секрет обрезан. Из-за переноса строки или сокращения в мессенджере теряется хвост с доменом; Telegram подключится в другом режиме или не подключится.
  • Секрет вставлен в поле для пароля SOCKS5. Для MTProto нужно выбирать тип MTProto и вводить секрет в соответствующее поле.
  • Перепутаны сервер и порт. Особенно при ручном вводе.
  • Ссылка изменена вручную. Один изменённый символ в секрете даёт другой ключ — и прокси не пустит клиента.

Пример: как найти ошибку в секрете

Допустим, вам прислали ссылку, и в ней секрет длиной 48 символов, начинающийся с ee. По формуле 2 + 32 + удвоенное число символов домена получается, что на домен приходится 14 символов, то есть имя из семи букв. Расшифруйте хвост командой xxd -r -p: если получается читаемое имя сайта, секрет в порядке. Если на выходе мусор или имя короче ожидаемого, секрет обрезан по дороге — запросите ссылку заново.

Тот же приём работает для проверки чужих ссылок: он занимает полминуты и не требует подключения.

Секрет — это пароль

Кто знает секрет, тот подключается к прокси и может передать ссылку другим. В README mtg секрет называют ключом прокси и паролем клиента. Поэтому личную ссылку не публикуют в открытых чатах: чем шире она расходится, тем выше нагрузка на сервер и тем быстрее её добавят в списки блокировок.

Частые вопросы

Что значит dd в начале секрета прокси?

Префикс dd включает режим со случайным дополнением (padding): к пакетам добавляется от 0 до 15 случайных байт, чтобы по размерам пакетов прокси было труднее узнать. Ключ после префикса — те же 16 байт.

Как отличить секрет ee от dd?

По первым двум символам и длине. Секрет dd — это dd и 32 символа ключа, всего 34. Секрет ee длиннее: после ключа идёт домен маскировки в шестнадцатеричной записи.

Можно ли публиковать секрет?

Лучше нет. Секрет работает как пароль: кто его знает, тот подключается к прокси и может передать ссылку дальше. Чем шире расходится ссылка, тем быстрее её добавляют в списки блокировки.

Как узнать домен в ee-секрете?

Возьмите часть секрета после первых 34 символов (два символа префикса и 32 символа ключа) и преобразуйте её из шестнадцатеричной записи в текст, например командой echo ХВОСТ | xxd -r -p. Результатом будет имя сайта, которым прокси маскируется.

Чем t.me/proxy отличается от tg://proxy?

Параметры одинаковы. Ссылка tg://proxy открывается напрямую в приложении, а t.me/proxy работает и в браузере. По документации Telegram, t.me можно писать и как telegram.me или telegram.dog.

Источники

  1. Telegram: ссылки на прокси (proxy links)
  2. Telegram: MTProto transports — формат секрета
  3. MTProxy (GitHub): README, Random padding
  4. mtg: README — генерация секрета
  5. telemt: README — режимы classic, secure, tls
  6. Telegram Desktop: mtproto_proxy_data.cpp — допустимая длина секрета