Настраиваемый HTTP MITM-прокси на Rust с подменой отпечатков TLS, HTTP/2 и TCP.
HTTP MITM-прокси на Rust, tokio и btls.
Проект полностью переписан на btls (BoringSSL) для продвинутого TLS-фингерпринтинга. Слой TLS-отпечатка (JA3/JA4) теперь полностью управляем — наборы шифров, кривые, алгоритмы подписи, ALPN, record size limit, сжатие сертификата, GREASE, порядок/перестановка расширений, OCSP stapling, Certificate Transparency (SCT), session tickets, ALPS и Encrypted Client Hello (ECH, разрешается вживую через DoH, с фолбэком на GREASE) задаются через YAML-профиль. HTTP/2-фингерпринтинг (Akamai) и порядок/подмена HTTP/1.1-заголовков тоже полностью настраиваемы. TCP (L4) фингерпринтинг тоже работает: SYN-пакеты апстрим-соединений переписываются в NFQUEUE (TTL, размер окна, MSS, window scale, флаг DF, таймстампы, точный порядок TCP-опций, марки по доменам) с автоматическим управлением iptables.
MITM (Man-in-the-Middle) — прозрачный перехват HTTPS. Сертификаты выпускаются и подписываются на лету через rcgen, кэшируются в moka для производительности.
Интеграция BoringSSL — TLS-хендшейк и MITM-перехват реализованы через btls и tokio-btls.
Подмена TLS-отпечатка (JA3/JA4) — готово полностью. Апстрим-соединение целиком собирается из YAML-профиля, который передаётся через -c / --config <путь> (формат см. в config.yaml):
brotli, zlib, zstd) с реальной поддержкой распаковки.TLS.ru.md.Согласование ALPN сначала с апстримом — прокси устанавливает и согласует TLS с апстрим-сервером до завершения TLS-хендшейка с браузером. Протокол, выбранный апстрим-сервером через ALPN, затем используется для настройки клиентского TLS-акцептора — это не даёт браузеру выбрать протокол, который апстрим-соединение не поддерживает.
Подмена HTTP/2-отпечатка (Akamai) — полностью настраиваемый HTTP/2-фингерпринтинг через YAML-профиль:
END_STREAM для пустых запросов.Подмена HTTP/1.1-заголовков — настраиваемый порядок и содержимое заголовков для апстрим-соединений на голом HTTP/1.1 (когда ALPN не согласует h2), по той же семантике замены/удаления, что и в HTTP/2.
Подмена TCP-отпечатка (L4) — готово полностью. Исходящие апстрим-соединения фингерпринтятся на уровне пакетов через Linux NFQUEUE (src/tcp_fingerprint/):
Accept, чтобы очереди никогда не вставали.SO_MARK на TCP-профили по доменам, автоматическое управление iptables (вставка наверх, выше инструментов вроде zapret/nfqws, дедупликация, удаление при выключении по Ctrl+C) с безопасным --queue-bypass.TCP.ru.md и блок tcp в config.yaml.Поддержка апстрим HTTP-прокси — соединения можно проксировать через апстрим HTTP-прокси методом CONNECT.
Маршрутизация профилей по доменам — передай -d / --domain <путь> с картой доменных паттернов в частичные оверлеи профиля (см. domain.yaml). Каждое соединение сопоставляется по SNI (точное → *.root → *.label.* → label.* → базовый профиль) и обслуживается со своими настройками TCP/TLS/HTTP2/HTTP1/апстрима, предсобранными один раз на старте. Указывать нужно только поля, отличающиеся от базового профиля; остальное наследуется.
Асинхронность — построено на tokio для высокопроизводительного неблокирующего ввода-вывода.
cap_net_admin,cap_net_raw=+eip (для SO_MARK, бинда NFQUEUE и автоматических iptables; без этого ставь "auto_iptables": false в блоке tcp и применяй mangle-правила руками — см. TCP.ru.md)Прокси использует tracing с фильтрацией по модулям через RUST_LOG.
Примеры:
RUST_LOG='H2=error' cargo run --release -- -c profile.yaml
RUST_LOG='TCP=debug,H2=error,TLS=warn' cargo run --release -- -c profile.yaml
RUST_LOG='CA=info,TLS=warn,H2=error' cargo run --release -- -c profile.yaml
Поддерживаемые теги совпадают с именами модулей в коде: TCP, HTTP, H1, H2, TLS, CA, ECH, CFG, IPT, NFQUEUE, Runtime.
Логи по умолчанию содержат таймстамп, чтобы проще было сопоставлять события между собой.
git clone https://github.com/3Radiance/mitm-proxy-ja3-ja4.git
cd mitm-proxy-ja3-ja4
cargo build --release
Все настройки — порт, апстрим-прокси и пути к файлам CA — задаются в YAML-конфиге, который передаётся через -c / --config <путь>. Флагов --port / --upstream больше нет.
config:
port: 9090
upstream_proxy: "127.0.0.1:10808"
cert: "/path/to/ca.crt"
key: "/path/to/ca.key"
Чтобы запустить без апстрим-прокси, укажи "upstream_proxy": null.
cargo run --release -- --config profile.yaml
# или
cargo run --release -- -c profile.yaml
При первом запуске, если файлы cert/key ещё не существуют, прокси сгенерирует CA по указанным путям:
ca.crt — корневой сертификат CA. Его нужно импортировать в Firefox/браузер и добавить в доверенные, чтобы сайты определялись корректно.ca.key — приватный ключ CA.cargo run --release -- -c profile.yaml -d domain.yaml
domain.yaml — карта доменных паттернов в частичные оверлеи, указывать нужно только поля, отличающиеся от базового профиля:
"browserleaks.com":
config:
upstream_proxy: null
tls:
enable_ech: false
"*.google.com":
tls:
enable_ech: true
"tls.peet.ws":
tcp:
mark: "0x11"
ttl: 100
window_size: 64130
mss: 1400
window_scale: 7
dont_fragment: true
timestamp: false
tcp_options_order:
- mss
- sack_perm
- wscale
- nop