Proxy SOCKS4a
O que é SOCKS4a
SOCKS4a é uma extensão do protocolo SOCKS4, proposta por Ying-Da Lee. A diferença principal em relação ao SOCKS4 original é que o cliente pode enviar um nome de domínio em vez de um endereço IP, e a resolução DNS acontece no lado do servidor proxy.
No SOCKS4 padrão, o cliente precisa resolver o nome de domínio para um endereço IP por conta própria antes de enviar a requisição. Isso cria um problema: a consulta DNS sai diretamente do cliente, revelando informações sobre os sites visitados. O SOCKS4a resolve essa questão.
O problema de DNS do SOCKS4
Como o SOCKS4 funciona
- O cliente quer se conectar a example.com
- O cliente faz uma consulta DNS diretamente (não pelo proxy)
- Ele recebe o IP 93.184.216.34
- Ele envia um comando ao proxy: "conecte-se a 93.184.216.34:80"
- O proxy estabelece uma conexão TCP
Problema: a consulta DNS do passo 2 é visível para o ISP, para o servidor DNS e para qualquer um que monitore o tráfego. Isso é um vazamento de DNS.
Como o SOCKS4a funciona
- O cliente quer se conectar a example.com
- O cliente envia um comando ao proxy: "conecte-se a example.com:80"
- O próprio proxy resolve example.com para um IP
- O proxy estabelece uma conexão TCP
A consulta DNS fica completamente escondida atrás do proxy.
Implementação técnica
Formato da requisição SOCKS4
| Campo | Tamanho | Descrição |
|---|---|---|
| VER | 1 byte | Versão (0x04) |
| CMD | 1 byte | Comando (0x01 = CONNECT) |
| DSTPORT | 2 bytes | Porta de destino |
| DSTIP | 4 bytes | IP de destino |
| USERID | variável | String identificadora |
| NULL | 1 byte | 0x00 (terminador) |
Formato da requisição SOCKS4a
O formato é o mesmo, mas com um truque: o campo DSTIP contém um IP inválido no formato 0.0.0.x (onde x > 0). Após o terminador NULL do USERID, o nome de domínio é acrescentado:
| Campo | Tamanho | Descrição |
|---|---|---|
| VER | 1 byte | 0x04 |
| CMD | 1 byte | 0x01 |
| DSTPORT | 2 bytes | Porta de destino |
| DSTIP | 4 bytes | 0.0.0.1 (marcador SOCKS4a) |
| USERID | variável | String identificadora |
| NULL | 1 byte | 0x00 |
| DOMAIN | variável | Nome de domínio (example.com) |
| NULL | 1 byte | 0x00 |
O proxy vê um IP no formato 0.0.0.x e entende que, depois do USERID, vem um nome de domínio para resolução.
SOCKS4 vs SOCKS4a vs SOCKS5
| Parâmetro | SOCKS4 | SOCKS4a | SOCKS5 |
|---|---|---|---|
| DNS do lado do proxy | Não | Sim | Sim |
| Autenticação | Não | Não | Sim |
| UDP | Não | Não | Sim |
| IPv6 | Não | Não | Sim |
| Comando BIND | Sim | Sim | Sim |
| Comando ASSOCIATE | Não | Não | Sim |
Vantagens do SOCKS4a
1. Elimina o vazamento de DNS
A principal vantagem é que o cliente não faz consultas DNS diretamente. Toda a atividade de DNS fica escondida atrás do proxy.
2. Simplicidade do protocolo
O SOCKS4a é mais simples de implementar do que o SOCKS5. Não há fase de autenticação nem suporte a UDP — apenas TCP CONNECT.
3. Compatibilidade retroativa
Um cliente SOCKS4a consegue trabalhar com um proxy SOCKS4a, e o formato da requisição é retrocompatível com o SOCKS4.
4. Acesso a domínios .onion e internos
Como o DNS é resolvido do lado do proxy, o SOCKS4a pode ser usado para acessar domínios que não são resolvidos pelo DNS público (por exemplo, .onion via Tor).
Limitações
1. Sem autenticação
O SOCKS4a não suporta autenticação. Qualquer pessoa que saiba o endereço do proxy pode usá-lo.
2. Sem UDP
Só há suporte a conexões TCP. Consultas DNS, VoIP e tráfego de jogos via UDP não são suportados.
3. Sem IPv6
O campo DSTIP tem 4 bytes, apenas para IPv4.
4. Protocolo obsoleto
O SOCKS5 substituiu o SOCKS4a, oferecendo todos os seus recursos mais autenticação, UDP e IPv6.
Quando usar SOCKS4a
- Sistemas legados — softwares antigos que não suportam SOCKS5
- Cenários simples — quando autenticação e UDP não são necessários
- Conexões Tor — o Tor suporta SOCKS4a para resolução de .onion
- Overhead mínimo — quando a latência mínima do protocolo é importante
Suporte em softwares
| Programa | SOCKS4a |
|---|---|
| curl | Sim (--socks4a) |
| Tor | Sim (protocolo principal) |
| ProxyChains | Sim |
| Firefox | Via network.proxy.socks_remote_dns |
| PuTTY | Sim |
Conclusão
O SOCKS4a foi um passo evolutivo importante em relação ao SOCKS4, resolvendo o problema dos vazamentos de DNS. Embora o SOCKS5 seja o padrão hoje, entender o SOCKS4a é útil para trabalhar com sistemas legados e para compreender a evolução dos protocolos de proxy.
