Секреты dd и ee: как прочитать ссылку на прокси
Сервер, порт и секрет: что значат префиксы dd и ee и что можно проверить до подключения.
Содержание
Ссылку на прокси обычно просто нажимают, не читая. Но три параметра в ней — единственное, что можно проверить до подключения, а секрет подсказывает режим работы, и часто — причину, по которой прокси не подключается. Разберём ссылку по частям.
Ссылка по параметрам
Формат ссылки задан документацией 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) |
| dd | 34 символа | dd + ключ | случайное дополнение пакетов |
| ee | от 42 символов | ee + ключ + домен в hex | FakeTLS |
В документации Telegram формат описан именно так: секрет — 16 байт, обычно в hex; существует и 17-байтовая форма, у которой первый байт выбирает транспорт, чаще всего 0xdd — padded intermediate.
Что значит dd
В README официального MTProxy сказано: некоторые провайдеры определяют MTProxy по размерам пакетов, поэтому в такой режим добавлено случайное дополнение. Включают его на стороне клиента — префиксом dd в секрете (cafe…babe превращается в ddcafe…babe), и дополнение применяется только для клиентов, которые его запросили.
На уровне протокола это транспорт padded intermediate: перед пакетом идёт 4-байтовая длина, а общая длина включает от 0 до 15 случайных байт. Размеры перестают быть постоянными, но начало соединения остаётся прежним.
Что значит ee
Префикс ee включает FakeTLS. В отличие от dd, после ключа в секрете идёт ещё и домен — те самые байты, которые клиент назовёт в поле SNI. Поэтому секрет 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–2 | 2 | ee — режим FakeTLS |
| 3–34 | 32 | ключ — 16 случайных байт |
| 35–54 | 20 | 676f6f676c652e636f6d — слово 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);
- если ссылка уже разошлась, смените секрет, а не надейтесь, что её «потеряют»;
- не отправляйте секрет сторонним сервисам «проверки прокси»: вы отдаёте пароль.
Что проверить до подключения
- Ссылка начинается с
tg://proxyилиt.me/proxyи содержит все три параметра. - Секрет начинается с
ee— иначе режим обычный или dd. - Длина секрета укладывается в таблицу выше: 32, 34 или не меньше 42 символов.
- Домен в конце ee-секрета читается и это обычный сайт, а не случайный набор символов.
- Порт — 443 или другой привычный для HTTPS порт.
- Нет пробелов, переносов строк и лишних символов вроде
&.
Частые ошибки
- Секрет обрезан. Из-за переноса строки или сокращения в мессенджере теряется хвост с доменом; 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.