Почему моя реализация SOCKS5 UDP не работает? - PullRequest
0 голосов
/ 11 июня 2018

Я потратил более 50 часов на эту ерунду, почему моя реализация UDP не работает?Проблема в том, что сервер не получает UDP-пакет.Я сделал серверное приложение для регистрации событий в консоли и вижу, что он ничего не получает.Вот документация SOCKS5, за которой я следовал: https://www.ietf.org/rfc/rfc1928.txt

byte[] response = new byte[256];
int responseLength;
Socket socket = new Socket(proxyHost, proxyPort);
DatagramSocket clientSocket = new DatagramSocket();

DataOutputStream writer = new DataOutputStream(new BufferedOutputStream(socket.getOutputStream()));
DataInputStream reader = new DataInputStream(new BufferedInputStream(socket.getInputStream()));

// connect/authorization request
writer.writeByte(0x05); // VER
writer.writeByte(1); // NMETHODS
writer.writeByte(0); // METHODS
writer.flush();

// connect/authorization response
responseLength = reader.read(response); // RESPONSE IS: 5 0

// udp associate request
writer.writeByte(0x05); // VER
writer.writeByte(0x03); // CMD - UDP ASSOCIATE
writer.writeByte(0x00); // RSV
writer.writeByte(0x01); // ATYP
// is what I'm sending here as DST.ADDR & DST.PORT okay?
writer.write(clientSocket.getLocalAddress().getAddress()); // DST.ADDR
writer.writeShort(clientSocket.getLocalPort()); // DST.PORT
//writer.write(InetAddress.getByName(trackerHost).getAddress());
//writer.writeShort(trackerPort);
writer.flush();

// udp associate response
reader.skipBytes(4); // skip VER, REP, RSV, ATYP bytes
relayAddress = reader.readInt();
InetAddress relayInetAddress = InetAddress.getByAddress(ByteBuffer.allocate(4).putInt(relayAddress).array());
relayPort = reader.readUnsignedShort(); // server returns some random port

// connect to relay server via datagramsocket
clientSocket.connect(relayInetAddress, relayPort);

// send package to destination server
ByteBuffer byteBuffer = ByteBuffer.allocate(16 + 10);
//header - 10 bytes
byteBuffer.putShort((short) 0); // RSV
byteBuffer.put((byte) 0); // FRAG
byteBuffer.put((byte) 1); // ATYP
byteBuffer.put(trackerInetAddress.getAddress()); // DST.ADDR
byteBuffer.putShort((short) targetPort); // DST.PORT
//packet data
byteBuffer.putLong(1);
byteBuffer.putInt(0);
byteBuffer.putInt(1);
// send packet
packet = byteBuffer.array();
DatagramPacket sendPacket = new DatagramPacket(packet, packet.length);//, relayInetAddress, relayPort);
clientSocket.send(sendPacket); // SERVER DOES NOT RECEIVE THIS

Целевой хост работает на 100% без прокси.Использование полу-выделенных прокси от https://blazingseollc.com/proxy/, которые поддерживают SOCKS5

1 Ответ

0 голосов
/ 11 июня 2018

Оказывается, прокси-провайдер не поддерживает UDP-ассоциацию SOCKS5.Оказывается, большинство прокси-провайдеров не поддерживают его.

...