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

MTProto-прокси

Прокси Telegram, к которому клиенты подключаются по секрету. b4 завершает fake-TLS рукопожатие у себя, поэтому в сети соединение выглядит как HTTPS к домену, указанному в поле Fake SNI, и ретранслирует поток MTProto в дата-центр Telegram выбранным транспортом.

Это единственный режим, работающий за пределами локальной сети, и единственный, который поддерживают все клиенты Telegram.

Включение прокси​

Настройки, Telegram, MTProto Прокси. Поля карточки скрыты, пока её переключатель выключен.

ПолеЧто задаёт
Адрес привязкиАдрес, на котором слушает прокси. 0.0.0.0 - все интерфейсы, 127.0.0.1 - только сам хост.
ПортПорт прослушивания. По умолчанию 3128.
Доступ из интернетаДобавляет правило файрвола, по которому до порта доходят соединения с любого адреса, по IPv4 и IPv6. По умолчанию выключен.
Домен для Fake SNIДомен, который предъявляет fake-TLS рукопожатие, и сайт, к которому проксируется нераспознанное соединение.

Порт 443 выбирают потому, что трафик и так имеет форму TLS, а этот порт обычно его и несёт.

Карточка MTProto-прокси

Доступ к прокси снаружи

Хост, чей файрвол отбрасывает входящие соединения, как WAN-сторона роутера, ничего не пропускает к прокси, пока не включён переключатель Доступ из интернета, и симптом - клиент, бесконечно висящий на «Подключение». Переключатель открывает порт только на хосте с b4: роутеру или модему перед ним по-прежнему нужен проброс порта, а до WAN-адреса за CGNAT по IPv4 снаружи не дойти вовсе. См. Доступ из интернета.

Настройки применяются при сохранении. b4 сам перезапускает прокси, когда меняется порт, адрес привязки, Fake SNI или настройка транспорта, и переносимые сессии при этом разрываются; Telegram переподключается сам. Перезапуск сервиса не нужен.

Секреты​

Секреты - это список, а не одно значение. У каждой записи есть имя, свой переключатель и своя ссылка, а лог соединений хранит, каким секретом воспользовался клиент, поэтому доступ выдаётся и отзывается по одному человеку.

Сгенерировать Secret создаёт секрет на основе текущего домена Fake SNI. Результат - fake-TLS секрет: hex, начинается с ee, содержит 16-байтный ключ и имя домена.

Принимаются только fake-TLS секреты

Ничего другого b4 не примет. Padded-секрет (dd), голый 32-символьный ключ или base64-секрет от другого прокси отклоняются при сохранении конфигурации, и сохранение не проходит, пока поле не исправлено. Домен внутри секрета - только метка: b4 никогда не сверяет его с именем, которое реально присылает клиент.

Конфигурация, в которой секреты есть, но все выключены, стартует штатно, пишет в лог secrets: 0 и закрывает каждое клиентское соединение сразу после приёма.

Список секретов

Добавление прокси в Telegram​

Поделиться ссылкой открывает окно с адресом сервера, ссылкой tg://proxy, QR-кодом и, если настроен WEB-прокси, второй ссылкой для Telegram Desktop. Ссылка и QR-код несут адрес из поля, а поле можно править.

Переключатель Локальная сеть / Интернет в верхней части окна определяет, откуда берётся этот адрес:

  • Локальная сеть подставляет адрес, по которому браузер открыл интерфейс, или адрес привязки, когда прокси слушает один конкретный адрес. Это адрес для устройств в той же сети.
  • Интернет подставляет IPv4-адрес WAN, если он публичный. Иначе b4 узнаёт публичный IPv4-адрес, с которого уходят его собственные соединения, через сервисы определения IP, которыми пользуется DPI-детектор (api4.ipify.org и другие), хранит ответ пять минут и подставляет его, а если узнать не удалось - публичный IPv6-адрес WAN. Если IPv4-адрес WAN из 100.64.0.0/10, то есть за CGNAT, первым подставляется публичный IPv6-адрес WAN, а узнанный IPv4-адрес предлагается рядом с ним. Все найденные адреса, включая адреса WAN, перечислены для выбора, а вместо них можно ввести DDNS-имя. Прокси, привязанный к одному конкретному адресу, предлагается только по этому адресу, и публичный адрес не запрашивается, кроме случая, когда этот адрес - IPv4-адрес WAN и он не публичный: тогда публичный IPv4-адрес запрашивается и подставляется, а адрес привязки предлагается рядом с ним. WAN - это интерфейс, на котором стоит маршрут по умолчанию, а пока работает TUN - аплинк движка TUN.

Порт и адрес привязки в ссылке tg://proxy берутся из сохранённых настроек, с которыми работает прокси. Пока у порта, адреса привязки или переключателя Доступ из интернета есть несохранённые изменения, окно отмечает, что они применятся после сохранения, а ссылка использует порт, на котором прокси работает сейчас. Если прокси включён только в несохранённых настройках или секрет, которым делятся, ещё не сохранён, работающий прокси такую ссылку не примет, и окно сообщает об этом.

В режиме Интернет окно предупреждает, когда ссылка снаружи работать не должна:

  • порт не открыт, потому что Доступ из интернета выключен или ещё не сохранён;
  • прокси не слушает свой порт, например потому что его заняла другая программа, и b4 его не открывает;
  • правило файрвола не удалось добавить, и окно показывает ошибку;
  • включено Пропустить настройку IPTables/NFTables, и b4 не добавляет правил вообще;
  • прокси привязан к loopback-адресу или к адресу, который не является адресом WAN;
  • маршрута по умолчанию нет, и предложить адрес WAN нечем;
  • WAN-адрес из 100.64.0.0/10, то есть CGNAT, до которого соединения из интернета по IPv4 не доходят;
  • WAN-адрес частный, поэтому порт нужно ещё пробросить на роутере перед b4 или разрешить в файрволе облачного провайдера;
  • WAN-адрес из другого диапазона, который не является публичным;
  • адрес IPv6, до которого доходят только клиенты с IPv6-подключением;
  • не удалось прочитать адреса хоста или узнать публичный IPv4-адрес.

Подключение из той же сети не доказывает ни того, ни другого. Когда b4 работает на роутере, устройство из LAN приходит к нему со стороны LAN, которую файрвол роутера пропускает; когда b4 стоит за другим роутером, подключение изнутри к публичному адресу требует, чтобы тот роутер завернул его обратно, а многие роутеры этого не делают. Телефон на мобильном интернете подключается снаружи. IPv6-адрес попадает в ссылку tg://proxy без квадратных скобок.

Вручную путь такой: Настройки -> Данные и память -> Прокси -> Добавить прокси -> MTProto.

  • Сервер - адрес b4. Локальный адрес для устройств в сети, публичный адрес или DDNS-имя для остальных, доступные, только когда порт открыт для интернета, см. Доступ из интернета.
  • Порт - порт прослушивания.
  • Secret - значение из списка секретов.

Настройки прокси в Telegram

Что видит нераспознанное соединение​

Соединение, чьё fake-TLS рукопожатие не прошло проверку, склеивается с доменом Fake SNI на порту 443, поэтому отвечает на него настоящий сайт, а не b4. Это касается только соединений, дошедших до корректной записи TLS-рукопожатия: байты, не являющиеся TLS-рукопожатием, отбрасываются, а при пустом поле Fake SNI склейка не выполняется вовсе.

Домен стоит выбирать доступный из этой сети и несущий достаточно реального трафика, чтобы обращение к нему не выделялось.

Где работает прокси​

  • На VPS за пределами блокировки - транспорт может быть Прямой TCP, релей не нужен.
  • На роутере внутри неё - WebSocket-транспорт доходит до Telegram без VPS. Если заблокирован и он, прямой маршрут ведут через DC Relay.
к сведению

Для режима Telegram через WebSocket MTProto-прокси не нужен: мост создаётся при старте в любом случае. Для WEB-прокси он обязателен, поскольку тот использует его слушающий сокет и его секреты.