Как всё связано
- 01XDP-префильтр
- 02TCP SYN
- 03TLS · JA4
- 04HTTP/2 · QUIC
- 05Оценка
- 06Вердикт
Зачем я это сделал
Боты врут о себе, а коммерческое решение ставит чёрный ящик перед всем твоим трафиком. Я хотел такую же глубину проверки на своих серверах, с правилами, которые можно прочитать, и данными, которые остаются у меня.
Каждый уровень, один вопрос
Каждое соединение получает отпечаток на каждом уровне, через который проходит, и отпечатки сверяются между собой: совпадает ли этот стек с браузером, которым представился клиент?
- TCP SYN: размер окна, порядок опций и TTL, ещё до первого байта TLS.
- TLS: JA4, JA4T и JA4H прямо из ClientHello.
- HTTP/2 и QUIC: фреймы SETTINGS, порядок псевдозаголовков, транспортные параметры.
- Оценка согласованности раскладывает каждого клиента по классам
human,suspicious,botилиverified_bot.
Прокси без прокси-листов
Прокси добавляет лишний хоп, а хоп виден по времени. LarpGuard сравнивает RTT TCP-рукопожатия с RTT рукопожатия TLS 1.3; если они расходятся, посередине кто-то есть. Никаких IP-списков, которые надо покупать и держать свежими.
Быстрый путь живёт в ядре
Заведомо плохой трафик не доходит до userspace: префильтр на XDP/eBPF со своим загрузчиком (без libbpf) отбрасывает его прямо на сетевой карте. Ханипот-пути, тарпит и ложные ответы тратят время тех, кто прошёл дальше.
Учится на собственном трафике
Каждое решение пишется событием в ClickHouse. На этих событиях обучается модель градиентного бустинга, и она работает прямо внутри шлюза на C++ за микросекунды. Серой зоне достаётся JS-челлендж с proof of work и моя собственная CAPTCHA; настоящих краулеров я проверяю по DNS и диапазонам IP, а также по подписям Web Bot Auth (Ed25519).
Правила, которые можно прочитать
Политики пишутся на маленьком языке правил, а rate limit работает на GCRA и синхронизируется между инстансами через Valkey.
path ~ "/admin*" and class != "human" => challenge
ja4 in known_bad => drop
rate(ip, 100/min) => tarpitСтек
C++20, BoringSSL, HTTP/3 на ngtcp2 и nghttp3, XDP/BPF, ClickHouse, Valkey, за Traefik.