Java DatagramSocket e retransmissão UDP por SOCKS5
Entenda por que um socket UDP Java precisa de uma implementação SOCKS5 UDP mesmo quando as conexões TCP já usam SOCKS.
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.