mirror of
https://github.com/by-sonic/tglock.git
synced 2026-09-05 18:16:09 +03:00
@alexsagaidak: с компьютера прокси работает, с телефона — нет. Адрес машины
вписан верно, порт верный, брандмауэр выключен, порт добавлен в исключения.
Причина нашлась в проверке «это Telegram?». Она сравнивала два первых октета:
(149, 154) => Some(...)
(91, 108) => Some(...)
То есть «телеграмом» считались целиком четыре /16 — десятки тысяч чужих
адресов, — а IPv6 не распознавался вообще ни один. Telegram владеет
149.154.160.0/20, шестью /22 в 91.108, 91.105.192.0/23, 185.76.151.0/24 и пятью
блоками IPv6.
Ошибка в обе стороны, и на loopback она не видна. Там allow_direct включён, и
неопознанный адрес всё равно релеится напрямую — соединение просто работает.
На сетевом слушателе allow_direct выключен, и тот же адрес получает SOCKS5
0x02. Отсюда ровно то, что описал репортёр: на компьютере работает, с телефона
нет. Заодно чужие адреса внутри этих /16 уходили в MTProto-туннель и умирали
там.
Список сетей теперь опубликованный самим Telegram
(core.telegram.org/resources/cidr.txt), проверка по маске префикса, IPv4 и
IPv6, с тестами на края блоков и на соседей за границей.
Отдельно разрешены имена веб-инфраструктуры: telegram.org, t.me, telegram.me,
telesco.pe, cdn-telegram.org. Это не MTProto, а обычный HTTPS — клиент ходит
туда за конфигурацией, превью и файлами CDN, и на телефоне эти запросы идут
через тот же прокси. Заворачивать их в туннель нельзя, поэтому они идут прямым
релеем. Совпадение по границе метки, так что telegram.org.example.com —
посторонний домен. В ограниченном режиме имя разрешается заранее и адреса
внутри локальной сети отбрасываются: назначение выбирает чужое устройство, и
DNS-ответ не должен открывать доступ к 192.168.х этой машины.
И главное для разбора следующего такого случая: отказ перестал быть
молчаливым. Появился счётчик «Отклонено» в диагностике и в строке статуса CLI,
отклонённый адрес один раз называется в журнале, и отдельно отмечается первое
подключение с каждого сетевого адреса. Без этого «с телефона не работает»
неразличимо распадалось на два случая: телефон не дошёл до машины — и дошёл,
но попросил адрес, который мы не пускаем. Теперь первый виден как ноль
соединений и ноль отказов, второй — как соединения есть, отказы растут.
Co-authored-by: by-sonic <171230345+by-sonic@users.noreply.github.com>
This commit is contained in:
@@ -55,6 +55,48 @@ LAN-режим превращал бы машину в открытый прок
|
||||
`config::ListenConfig`, а не в условиях по месту вызова; переопределяется
|
||||
только явным `--allow-direct` в CLI.
|
||||
|
||||
### Что считается адресом Telegram
|
||||
|
||||
Список сетей — опубликованный самим Telegram
|
||||
(<https://core.telegram.org/resources/cidr.txt>), он лежит в `telegram_net` и
|
||||
проверяется по маске префикса. До 2.0.0-beta.9 сравнивались два первых октета,
|
||||
то есть «телеграмом» считались целиком `149.154.0.0/16`, `91.108.0.0/16`,
|
||||
`91.105.0.0/16` и `185.76.0.0/16`, а IPv6 не распознавался вовсе. Ошибка была в
|
||||
обе стороны:
|
||||
|
||||
- чужие адреса внутри этих `/16` уходили в MTProto-туннель и умирали там;
|
||||
- настоящие адреса дата-центров по IPv6 отклонялись как посторонние.
|
||||
|
||||
Второе и давало «на компьютере работает, с телефона нет» (#42): на loopback
|
||||
неопознанный адрес всё равно релеился напрямую, поэтому там дефект не
|
||||
проявлялся, а на сетевом слушателе тот же адрес получал отказ.
|
||||
|
||||
Назначение делится на три вида:
|
||||
|
||||
| Вид | Что это | Что делаем |
|
||||
|---|---|---|
|
||||
| Дата-центр | IP из опубликованных сетей, v4 или v6 | заворачиваем в WebSocket |
|
||||
| Веб Telegram | имя из `telegram.org`, `t.me`, `telegram.me`, `telesco.pe`, `cdn-telegram.org` | пропускаем как есть — это обычный HTTPS, а не MTProto |
|
||||
| Всё остальное | — | напрямую на loopback, отказ на сетевом адресе |
|
||||
|
||||
Имена сопоставляются по границе метки, поэтому `telegram.org.example.com` —
|
||||
посторонний домен. В ограниченном режиме имя разрешается заранее, и адреса
|
||||
внутри локальной сети (`127.0.0.0/8`, `10/8`, `172.16/12`, `192.168/16`,
|
||||
`100.64/10`, `fc00::/7`, `fe80::/10`) отбрасываются: назначение выбирает чужое
|
||||
устройство, и DNS-ответ не должен превращать TGLock в дверь во внутреннюю сеть
|
||||
этой машины.
|
||||
|
||||
### Отказ перестаёт быть молчаливым
|
||||
|
||||
Отклонённый запрос увеличивает счётчик `blocked` и один раз называет адрес в
|
||||
журнале; повторы того же адреса склеиваются, чтобы не забить журнал одной
|
||||
строкой. Отдельно отмечается первое подключение с каждого сетевого адреса.
|
||||
|
||||
Без этого «с телефона не работает» неразличимо распадалось на два случая:
|
||||
телефон не дошёл до машины (сеть, брандмауэр, изоляция клиентов на роутере) —
|
||||
и дошёл, но попросил адрес, который мы не пропускаем. Первый виден как ноль
|
||||
соединений и ноль отказов, второй — как соединения есть, отказы растут.
|
||||
|
||||
## Учёт состояния
|
||||
|
||||
`Stats::ws` считает **установленные** туннели: счётчик поднимается после
|
||||
|
||||
Reference in New Issue
Block a user