September 20, 2023

http/3, прокси и все что с этим связано

Доброго времени суток, разберу нарратив о http/3:

переслано из https://t.me/+ppSUpmFiLi9kY2Ri (AGREGATOR)

Http/3

Основное отличие HTTP/3 от HTTP/2 заключается в использовании протокола QUIC(построенного на UDP) вместо TCP. И другие плюшки такие как: отсутствие блокировки головы очереди, уменьшение времени соединения, поддержка смены соединений "на лету" и так далее...

Работа над протоколом пока не завершена, сам протокол не стандартизирован, поэтому "безшовного" или гладкого перехода, по крайней мере пока, у большинства не будет. Только гибридные решения, приведенные ниже

Антики

По умолчанию, когда вы используете прокси (даже если прокси socks5) - антидетект выключает протокол QUIC (проверено в adspower и incogniton)

incogniton

Проверить работу QUIC в вашем браузере - https://quic.nginx.org/
Проверить работу QUIC на определенном сайте - https://www.http3check.net/

Coinlist

Коинлист действительно начал использовать http3 для своих запросов, если он конечно включен в настройках вашего браузера (chrome://flags/ -> QUIC):

Если разобраться чуть глубже - они используют решение cloudflare и aws cloudfront для работы http3:

Оба работают в роли прокладки и переводят ваше http/3 соединение в соединение, которое воспринимает сервер (будь то http/2 или http/3).

Данные решения поддерживают одновременно два или один протокол. В случае, если включен http/3 - приоритет будет отдан ему

В кейсе коинлиста (как и подавляющего большинства проектов) - включены сразу два варианта. Рассказы про бан по этой причине - по большей части безосновательны, бояться пока нечего

Socks5

Socks5 прокси не работают с QUIC протоколом. Удостовериться в этом довольно легко:

package main
import (
    "fmt"    
    "github.com/quic-go/quic-go/http3"    
    "net/http"
)

func handleRequest(w http.ResponseWriter, r *http.Request) {
    clientIP := r.RemoteAddr
    fmt.Fprintf(w, "Your IP address is %s", clientIP)
}

func main() {
    http.HandleFunc("/", handleRequest)    
    err := http3.ListenAndServeQUIC("0.0.0.0:4433", "host.cert", "host.key", nil)    
    if err != nil {
           fmt.Println(err)    
    }
}

Генерируем ссл сертификаты, открываем порт 4433 и запускаем сервер.

На своей машине прокидываем проксифаер и запускаем код:

package main

import (
	"crypto/tls"
	"github.com/quic-go/quic-go/http3"
	"io/ioutil"
	"log"
	"net/http"
	"time"
)

func main() {
	client := http.Client{
		Transport: &http3.RoundTripper{
			TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
		},
	}

	for {
		resp, err := client.Get("https://<IP>:4433/")
		if err != nil {
			log.Fatalf("Failed to make request: %s", err)
		}

		body, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			log.Fatalf("Failed to read response body: %s", err)
		}
		_ = resp.Body.Close()

		log.Printf("Received response: %s", body)

		// Sleep for 2 seconds before next request
		time.Sleep(2 * time.Second)
	}
}

Выводы

На данный момент бОльшая часть проектов не может позволить себе переключиться на http3 only из-за потери трафика и инженерных проблем в следствии такого нововведения.
Антики в паре с прокси довольно просто справились с этой задачей, но стоит учитывать, что сайты могут понижать ваш "траст" из-за отсутствия http3 соединения.

Надежных продуктов которые предоставляют quic прокси пока нет. Даже если они появятся - антидетектам нужно время чтобы ввести их поддержку.