HTTP/3 et UDP via SOCKS5
Updated:
Les proxys résidentiels acheminent le trafic UDP via SOCKS5. Utilisez-les pour accéder à des sites web via HTTP/3 (QUIC) à partir d'une adresse IP résidentielle, et pour acheminer tout autre protocole UDP : DNS, WebRTC, VoIP, jeux en ligne.
Fonctionne avec toutes les listes dont vous disposez déjà : même serveur, mêmes ports, mêmes identifiant et mot de passe. Il n'y a rien à activer ni à commander.
Comment ça marche
HTTP/3 fonctionne sur QUIC, et QUIC fonctionne sur UDP. Le protocole proxy HTTP ne prend en charge que le TCP ; le trafic UDP passe donc par SOCKS5.
Trafic | Proxy HTTP | SOCKS5 |
|---|---|---|
TCP : HTTP/1.1, HTTP/2, tout autre protocole TCP | ✅ | ✅ |
UDP : HTTP/3 (QUIC), DNS, WebRTC, VoIP, jeux | — | ✅ |
Trois échanges ont lieu avant que le premier datagramme ne quitte votre machine :
Se connecter et s'authentifier
Votre application établit une connexion SOCKS5 vers la passerelle et se connecte à l'aide de l'identifiant et du mot de passe figurant dans votre liste.
Demander un relais UDP
Cela envoie un
UDP ASSOCIATErequête (RFC 1928). La passerelle répond en indiquant une adresse de relais : l'adresse IP de la passerelle et un port compris entre 30 000 et 39 999.Envoyer des datagrammes
L'application envoie des datagrammes UDP à ce relais. Chaque datagramme commence par un court en-tête SOCKS5 indiquant la destination. Le trafic part de l'adresse IP de sortie résidentielle, et les réponses reviennent par le même chemin.
Le relais reste actif tant que la connexion TCP SOCKS5 reste ouverte. Fermez la connexion de contrôle et le relais se fermera en conséquence.
Paramètres de connexion
Contexte | Valeur |
|---|---|
Protocole | SOCKS5 avec authentification par nom d'utilisateur/mot de passe |
Hébergeur |
|
Port | n'importe quel port de votre liste (10 000–10 999) |
Identifiant et mot de passe | votre identifiant et votre mot de passe figurant sur votre liste |
Relais UDP | l'adresse IP de la passerelle, ports 30000–39999 |
HTTP et SOCKS5 partagent le même hôte, les mêmes ports, le même identifiant et le même mot de passe — la passerelle détecte automatiquement le protocole. Pour faire passer une chaîne de connexion en SOCKS5, modifiez uniquement le schéma :
http://LOGIN:[email protected]:10000
socks5://LOGIN:[email protected]:10000La passerelle n’est qu’un point d’entrée. L’adresse IP de sortie et son emplacement proviennent des paramètres de la liste, quelle que soit la passerelle que vous utilisez — choisissez donc la passerelle présentant la latence la plus faible depuis votre serveur.
Si votre réseau limite le trafic sortant, autorisez le protocole UDP vers la passerelle sur les ports 30000 à 39999. Un blocage de cette plage de ports est généralement la raison pour laquelle la vérification UDP ci-dessous aboutit à un délai d'expiration.
Vérifiez par vous-même
Vérifiez la connexion
N'importe quel client SOCKS5 fera l'affaire —
curlCela suffit :curl -x socks5h://LOGIN:[email protected]:10000 https://api.ipify.orgLa réponse correspond à l'adresse IP de sortie du proxy. Avec
socks5h://, les noms de domaine sont résolus par le proxy, et non par votre ordinateur.Vérifier UDP
Ce script utilise uniquement la bibliothèque standard de Python. Il se connecte via SOCKS5, ouvre un relais UDP et y envoie une requête DNS. Le résolveur OpenDNS répond
myip.opendns.comavec l'adresse d'où provient la requête, de sorte que le script affiche l'adresse IP de sortie de votre trafic UDP.Enregistrez-le sous le nom
socks5_udp.py, définissez votre identifiant et votre mot de passe, puis lancezpython socks5_udp.py."""UDP through a residential proxy: SOCKS5 login, UDP ASSOCIATE and one DNS query. The OpenDNS resolver answers "myip.opendns.com" with the IP the query came from, so the script prints the exit IP your UDP traffic leaves from. """ import os import socket import struct PROXY_HOST = "res.proxy-seller.com" PROXY_PORT = 10000 LOGIN = "LOGIN" PASSWORD = "PASSWORD" def recv_exact(sock, n): data = b"" while len(data) < n: chunk = sock.recv(n - len(data)) if not chunk: raise ConnectionError("proxy closed the connection") data += chunk return data def udp_associate(host, port, login, password): """SOCKS5 login (RFC 1929) and UDP ASSOCIATE (RFC 1928). Returns the TCP control connection and the UDP relay address. The relay works while the TCP connection stays open. """ tcp = socket.create_connection((host, port), timeout=15) tcp.sendall(b"\x05\x01\x02") # SOCKS5, one auth method: username/password if recv_exact(tcp, 2)[1] != 0x02: raise RuntimeError("username/password authentication is not available") tcp.sendall(b"\x01" + bytes([len(login)]) + login.encode() + bytes([len(password)]) + password.encode()) if recv_exact(tcp, 2)[1] != 0x00: raise RuntimeError("wrong login or password") tcp.sendall(b"\x05\x03\x00\x01" + bytes(6)) # UDP ASSOCIATE, client address 0.0.0.0:0 _, reply, _, atyp = recv_exact(tcp, 4) if reply != 0x00: raise RuntimeError(f"UDP ASSOCIATE failed, reply code {reply}") if atyp == 0x01: relay_ip = socket.inet_ntoa(recv_exact(tcp, 4)) elif atyp == 0x03: relay_ip = recv_exact(tcp, recv_exact(tcp, 1)[0]).decode() else: raise RuntimeError("IPv6 relay address is not handled in this example") relay_port = struct.unpack("!H", recv_exact(tcp, 2))[0] if relay_ip == "0.0.0.0": relay_ip = tcp.getpeername()[0] return tcp, (relay_ip, relay_port) def strip_udp_header(datagram): """Remove the SOCKS5 UDP header from a datagram received from the relay.""" atyp = datagram[3] if atyp == 0x01: # IPv4 return datagram[10:] if atyp == 0x04: # IPv6 return datagram[22:] return datagram[7 + datagram[4]:] # domain name if __name__ == "__main__": tcp, relay = udp_associate(PROXY_HOST, PROXY_PORT, LOGIN, PASSWORD) print("UDP relay:", f"{relay[0]}:{relay[1]}") # DNS query "myip.opendns.com, type A" without EDNS: the answer ends with the IPv4 address query = (os.urandom(2) + b"\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00" + b"\x04myip\x07opendns\x03com\x00" + b"\x00\x01\x00\x01") # every datagram to the relay starts with a SOCKS5 UDP header: RSV, FRAG, ATYP=IPv4, destination header = b"\x00\x00\x00\x01" + socket.inet_aton("208.67.222.222") + struct.pack("!H", 53) udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) udp.settimeout(10) udp.sendto(header + query, relay) answer = strip_udp_header(udp.recv(4096)) print("Exit IP over UDP:", socket.inet_ntoa(answer[-4:])) udp.close() tcp.close()Exemple de résultat :
UDP relay: 103.152.136.28:39631 Exit IP over UDP: 203.0.113.45Envoyer une requête HTTP/3
Pour HTTP/3, les paquets QUIC de la requête transitent par le même relais UDP. Cet exemple utilise le aioquic bibliothèque (Python 3.11 ou version plus récente). Elle charge https://cloudflare-quic.com/cdn-cgi/trace, une page en texte brut qui affiche le protocole et l'adresse IP du client.
Installez les dépendances, enregistrez le script sous le nom
http3_via_socks5.pyà côté desocks5_udp.py, puis exécutez-le :pip install aioquic certifi python http3_via_socks5.py"""HTTP/3 (QUIC) request to a website through a residential proxy. QUIC packets go to the SOCKS5 UDP relay; the website sees an HTTP/3 connection from the exit IP. Requires: pip install aioquic certifi, and socks5_udp.py from the previous example in the same folder. """ import socket import struct import time import certifi from aioquic.h3.connection import H3_ALPN, H3Connection from aioquic.h3.events import DataReceived, HeadersReceived from aioquic.quic.configuration import QuicConfiguration from aioquic.quic.connection import QuicConnection from aioquic.quic.events import ConnectionTerminated, HandshakeCompleted from socks5_udp import LOGIN, PASSWORD, PROXY_HOST, PROXY_PORT, strip_udp_header, udp_associate TARGET_HOST = "cloudflare-quic.com" TARGET_PATH = "/cdn-cgi/trace" # plain text: shows the protocol (http=http/3) and the client IP tcp, relay = udp_associate(PROXY_HOST, PROXY_PORT, LOGIN, PASSWORD) udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # the destination goes into the SOCKS5 UDP header as a domain name (ATYP=3): the proxy resolves it header = b"\x00\x00\x00\x03" + bytes([len(TARGET_HOST)]) + TARGET_HOST.encode() + struct.pack("!H", 443) config = QuicConfiguration(is_client=True, alpn_protocols=H3_ALPN, server_name=TARGET_HOST) config.load_verify_locations(certifi.where()) quic = QuicConnection(configuration=config) peer = ("0.0.0.0", 443) # placeholder: only the proxy knows the real address quic.connect(peer, now=time.time()) h3 = H3Connection(quic) def send_pending(): for datagram, _ in quic.datagrams_to_send(now=time.time()): udp.sendto(header + datagram, relay) send_pending() stream_id, body, done = None, b"", False deadline = time.time() + 20 while not done and time.time() < deadline: timer = quic.get_timer() udp.settimeout(0.5 if timer is None else min(0.5, max(0.01, timer - time.time()))) try: quic.receive_datagram(strip_udp_header(udp.recv(65535)), peer, now=time.time()) except socket.timeout: if timer is not None and time.time() >= timer: quic.handle_timer(now=time.time()) event = quic.next_event() while event is not None: if isinstance(event, HandshakeCompleted): stream_id = quic.get_next_available_stream_id() h3.send_headers(stream_id, [ (b":method", b"GET"), (b":scheme", b"https"), (b":authority", TARGET_HOST.encode()), (b":path", TARGET_PATH.encode()), ], end_stream=True) elif isinstance(event, ConnectionTerminated): done = True for h3_event in h3.handle_event(event): if isinstance(h3_event, (HeadersReceived, DataReceived)) and h3_event.stream_id == stream_id: if isinstance(h3_event, DataReceived): body += h3_event.data done = done or h3_event.stream_ended event = quic.next_event() send_pending() print(body.decode() or "No HTTP/3 response within 20 seconds") quic.close() send_pending() udp.close() tcp.close()Résultat (version abrégée) :
ip=203.0.113.45 http=http/3 loc=GB tls=TLSv1.3http=http/3signifie que le site web a reçu la requête via HTTP/3.ipetlocsont l'adresse IP de sortie du proxy et son pays.
HTTP/3 dans les navigateurs et autres applications
Une application ne peut envoyer de paquets UDP via un proxy que si elle prend en charge le protocole UDP sur SOCKS5 (UDP ASSOCIATE).
Chrome et Firefox n'envoient pas de paquets UDP via un proxy SOCKS5 configuré dans leurs propres paramètres. Les sites web s'ouvrent alors via HTTP/2 ou HTTP/1.1 au lieu de HTTP/3.
Pour utiliser HTTP/3 dans un navigateur ou une autre application, acheminez son trafic via un outil qui transfère le protocole UDP via SOCKS5. L'application ne voit jamais le proxy ; elle utilise donc HTTP/3 comme d'habitude, tandis que l'outil envoie les paquets QUIC via la passerelle.
Windows, macOS, Linux. Ajouter un socks envoi avec les détails de votre liste et un tun entrant pour capturer le trafic de vos applications. Le protocole UDP est activé dans le socks sortant par défaut :
{
"type": "socks",
"tag": "residential",
"server": "res.proxy-seller.com",
"server_port": 10000,
"version": "5",
"username": "LOGIN",
"password": "PASSWORD"
}Windows. Achemine le trafic des applications sélectionnées via SOCKS5, y compris les protocoles UDP et QUIC. Choisissez les applications qui doivent passer par le proxy et configurez le profil en indiquant le même hôte, le même port, le même identifiant et le même mot de passe.
Contraintes
Le protocole UDP fonctionne uniquement via SOCKS5. Les connexions proxy HTTP utilisent le protocole TCP.
La connexion au proxy lui-même via HTTPS (TLS) ou HTTP/3 n'est pas prise en charge — utilisez
http://ousocks5://.Une session UDP peut obtenir une adresse IP de sortie différente de celle des connexions TCP sur le même port.
FAQ
Non. Les protocoles UDP et HTTP/3 fonctionnent sur toutes les listes, avec l'identifiant et le mot de passe dont vous disposez déjà.
Non. Les protocoles HTTP et SOCKS5 sur TCP continuent de fonctionner exactement comme auparavant.
Celui qui présente la latence la plus faible depuis votre serveur. La passerelle ne modifie ni l'adresse IP de sortie ni son emplacement — ceux-ci proviennent des paramètres de la liste.
Assurez-vous que votre pare-feu ou votre hébergeur ne bloque pas le trafic UDP sortant vers la passerelle sur les ports 30000 à 39999. Et maintenez la connexion TCP SOCKS5 ouverte pendant que vous envoyez des paquets UDP : le relais se ferme en même temps qu'elle.
L'activation d'une nouvelle liste prend 1 à 2 minutes. D'ici là, le proxy peut renvoyer une erreur 407. Patientez un instant et réessayez.