HTTP/3 e UDP sobre SOCKS5
Atualizado:
Proxies residenciais transportam tráfego UDP por meio do protocolo SOCKS5. Use-os para acessar sites via HTTP/3 (QUIC) a partir de um IP residencial e para rotear qualquer outro protocolo UDP: DNS, WebRTC, VoIP e jogos online.
Funciona em todas as listas que você já possui — mesmo servidor, mesmas portas, mesmo login e senha. Não há nada para habilitar nem nada para solicitar.
Como funciona
O HTTP/3 é executado sobre o QUIC, e o QUIC é executado sobre o UDP. O protocolo de proxy HTTP suporta apenas TCP, portanto, o tráfego UDP passa pelo SOCKS5.
Tráfego | Proxy HTTP | SOCKS5 |
|---|---|---|
TCP: HTTP/1.1, HTTP/2, qualquer outro protocolo TCP | ✅ | ✅ |
UDP: HTTP/3 (QUIC), DNS, WebRTC, VoIP, jogos | — | ✅ |
Três trocas ocorrem antes que o primeiro datagrama saia da sua máquina:
Conectar-se e autenticar-se
Seu aplicativo abre uma conexão SOCKS5 com o gateway e faz o login com o nome de usuário e a senha da sua lista.
Solicitar um retransmissor UDP
Isso envia um
UDP ASSOCIATEsolicitação (RFC 1928). O gateway responde com um endereço de retransmissão: o IP do gateway e uma porta no intervalo de 30000 a 39999.Enviar datagramas
O aplicativo envia datagramas UDP para esse relé. Cada datagrama começa com um pequeno cabeçalho SOCKS5 indicando o destino. O tráfego sai do IP de saída residencial, e as respostas retornam pelo mesmo caminho.
O relé permanece ativo enquanto a conexão TCP SOCKS5 permanecer aberta. Feche a conexão de controle e o relé será encerrado junto com ela.
Configurações de conexão
Cenário | Valor |
|---|---|
Protocolo | SOCKS5 com autenticação por nome de usuário/senha |
Hospedagem |
|
Portar | qualquer porta da sua lista (10.000–10.999) |
Nome de usuário e senha | o login e a senha da sua lista |
Retransmissão UDP | o IP do gateway, portas 30000–39999 |
HTTP e SOCKS5 compartilham o mesmo host, portas, login e senha — o gateway detecta o protocolo automaticamente. Para migrar uma string de conexão para SOCKS5, altere apenas o esquema e nada mais:
http://LOGIN:[email protected]:10000
socks5://LOGIN:[email protected]:10000O gateway é apenas o ponto de entrada. O IP de saída e sua localização vêm das configurações da lista, independentemente do gateway que você usar — portanto, escolha o gateway com a menor latência a partir do seu servidor.
Se sua rede restringir o tráfego de saída, permita o tráfego UDP para o gateway nas portas 30000–39999. Um intervalo bloqueado é o motivo mais comum para o tempo limite da verificação UDP abaixo ser atingido.
Verifique você mesmo
Verifique a conexão
Qualquer cliente SOCKS5 serve —
curlÉ o suficiente:curl -x socks5h://LOGIN:[email protected]:10000 https://api.ipify.orgA resposta é o IP de saída do proxy. Com
socks5h://, os nomes de domínio são resolvidos pelo proxy, não pelo seu computador.Verifique o UDP
Este script utiliza apenas a biblioteca padrão do Python. Ele faz login via SOCKS5, abre um relé UDP e envia uma consulta DNS por meio dele. O resolvedor OpenDNS responde
myip.opendns.comcom o endereço de onde a consulta veio, de modo que o script exiba o IP de saída do seu tráfego UDP.Salve como
socks5_udp.py, defina seu nome de usuário e senha e executepython 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()Exemplo de resultado:
UDP relay: 103.152.136.28:39631 Exit IP over UDP: 203.0.113.45Envie uma solicitação HTTP/3
Para o HTTP/3, os pacotes QUIC da solicitação passam pelo mesmo retransmissor UDP. Este exemplo utiliza o aioquic biblioteca (Python 3.11 ou mais recente). Ela carrega https://cloudflare-quic.com/cdn-cgi/trace, uma página em texto simples que mostra o protocolo e o IP do cliente.
Instale as dependências, salve o script como
http3_via_socks5.pyao lado desocks5_udp.py, e execute-o: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()Resultado (resumido):
ip=203.0.113.45 http=http/3 loc=GB tls=TLSv1.3http=http/3significa que o site recebeu a solicitação via HTTP/3.ipelocsão o IP de saída do proxy e seu país.
HTTP/3 em navegadores e outros aplicativos
Um aplicativo só pode enviar UDP por meio de um proxy se for compatível com UDP sobre SOCKS5 (UDP ASSOCIATE).
O Chrome e o Firefox não enviam UDP por meio de um proxy SOCKS5 configurado em suas próprias configurações. Os sites, então, são abertos via HTTP/2 ou HTTP/1.1, em vez de HTTP/3.
Para usar o HTTP/3 em um navegador ou outro aplicativo, encaminhe o tráfego por meio de uma ferramenta que encaminhe UDP por SOCKS5. O aplicativo nunca percebe o proxy, portanto usa o HTTP/3 normalmente, e a ferramenta envia os pacotes QUIC pelo gateway.
Windows, macOS, Linux. Adicione um socks envio com os detalhes da sua lista e um tun entrante para capturar o tráfego de seus aplicativos. O UDP está habilitado no socks envio por padrão:
{
"type": "socks",
"tag": "residential",
"server": "res.proxy-seller.com",
"server_port": 10000,
"version": "5",
"username": "LOGIN",
"password": "PASSWORD"
}Windows. Redireciona o tráfego de aplicativos selecionados por meio de SOCKS5, incluindo UDP e QUIC. Escolha os aplicativos que devem passar pelo proxy e configure o perfil com o mesmo host, porta, nome de usuário e senha.
Limitações
O UDP funciona apenas sobre SOCKS5. As conexões de proxy HTTP utilizam o protocolo TCP.
A conexão direta com o próprio proxy via HTTPS (TLS) ou HTTP/3 não é suportada — use
http://ousocks5://.Uma sessão UDP pode receber um endereço IP de saída diferente do das conexões TCP na mesma porta.
Perguntas frequentes
Não. O UDP e o HTTP/3 funcionam em todas as listas, com o login e a senha que você já possui.
Não. O HTTP e o SOCKS5 sobre TCP continuam funcionando exatamente como antes.
Aquele com a menor latência do seu servidor. O gateway não altera o IP de saída nem sua localização — esses dados vêm das configurações da lista.
Certifique-se de que seu firewall ou provedor de hospedagem não bloqueie o tráfego UDP de saída para o gateway nas portas 30000–39999. E mantenha a conexão TCP SOCKS5 aberta enquanto envia UDP: o relé é fechado junto com ela.
Uma nova lista leva de 1 a 2 minutos para ser ativada. Até lá, o proxy pode responder com o erro 407. Aguarde um momento e tente novamente.