Seu pedido HTTP Java funciona através de SOCKS, mas um recurso UDP ainda envia tráfego diretamente ou falha. Definir as propriedades SOCKS da JVM não dá a DatagramSocket uma implementação SOCKS5 UDP.

A API DatagramSocket envia e recebe datagramas endereçados a pontos de extremidade da rede. Seu método connect() escolhe um par para esse socket. Ele não realiza uma negociação SOCKS com o par.

Uma rota UDP por SOCKS5 exige trabalho extra

O SOCKS5 define uma associação UDP estabelecida sobre uma conexão de controle TCP. O cliente então troca datagramas encapsulados com o endereço de retransmissão fornecido pelo proxy. Cada mensagem encapsulada identifica seu destino. Uma implementação de cliente precisa tratar esse encapsulamento e o tempo de vida da conexão de controle.

Apontar um socket UDP comum para a porta de escuta TCP do proxy ignora essas etapas. Enviar os datagramas brutos da sua aplicação para esse endereço não substitui a associação.

Escolha uma biblioteca ou recurso da aplicação que suporte explicitamente a retransmissão UDP por SOCKS5 e confirme que o servidor também a suporta. Uma biblioteca que anuncia suporte a SOCKS pode implementar apenas TCP CONNECT. A especificação do protocolo distingue os comandos.

A retransmissão UDP também precisa de um caminho utilizável

Uma conexão TCP bem-sucedida ao proxy estabelece apenas o caminho de controle. Firewalls ou o comportamento de NAT ainda podem interferir nos datagramas enviados à retransmissão. Reúna o ponto de extremidade de retransmissão retornado e qualquer erro de retransmissão antes de concluir que o destino da aplicação está offline.

Por fim, o suporte de transporte SOCKS não acrescenta garantias de entrega ao UDP. Os tempos limite da sua aplicação, o tratamento de perdas e os limites de tamanho de mensagem continuam a valer depois que a rota muda.

Artigos relacionados