Отправка пакетов UDP через прокси SOCKS

Я создаю простое приложение, которое должно отправлять пакеты UDP-дейтаграмм через прокси socks4 / 5. Я использую подход UDP, поэтому мне не нужно держать соединение открытым.

Однако это было не так просто, как я думал. В соответствии с этой схемой я делаю вывод, что не могу отправлять данные UDP через прокси-сервер, не установив сначала TCP-соединение с прокси-сервером.
введите описание изображения здесь

Тем не менее я не смог найти подходящий пример построения такой связи в CPP. Буду благодарен за любые ресурсы 🙂

2

Решение

Это возможно. Вы должны указать значение 0x03 в поле 2 запроса подключения вашего клиента в соответствии с википедия описание протокола SOCKS5.

The client's connection request is
field 1: SOCKS version number, 1 byte (must be 0x05 for this version)
field 2: command code, 1 byte:
0x01 = establish a TCP/IP stream connection
0x02 = establish a TCP/IP port binding
0x03 = associate a UDP port
field 3: reserved, must be 0x00
field 4: address type, 1 byte:
0x01 = IPv4 address
0x03 = Domain name
0x04 = IPv6 address
field 5: destination address of
4 bytes for IPv4 address
1 byte of name length followed by the name for Domain name
16 bytes for IPv6 address
field 6: port number in a network byte order, 2 bytes

Как указал Хастуркун

Ваш код не работает, потому что вы не отправляете запрос на подключение
совсем. Вы должны отправить запрос UDP ASSOCIATE (по соединению TCP),
и вам нужно использовать порт и адрес из ответа, чтобы получить ваш
датаграммы передаются.

Вы должны действительно взглянуть на Socks5 RFC

4

Другие решения

Майк, твой код не работает, потому что ты пытаешься отправить команду связывания UDP через дейтаграмму UDP. Рукопожатие SOCKS5 должно быть через управляющее соединение TCP.

Возможно, вашему серверу необходимо поддерживать одно открытое TCP-соединение для каждого клиента, но каждому клиенту не нужно много открытых TCP-соединений — одно TCP-соединение может обрабатывать любое количество связанных с UDP команд.

Если ваша единственная цель — вообще не использовать TCP на стороне сервера, он не достигнет того, чего вы хотите. Соединение TCP необходимо для того, чтобы прокси-сервер SOCKS знал, когда следует отключить порты UDP (а именно, когда соединение TCP прерывается).

Тем не менее, ваше серверное приложение не должно беспокоиться об этом вообще. Управляющее соединение TCP заканчивается на сервере SOCKS, как показано на диаграмме.

Советую почитать RFC.

2

По вопросам рекламы [email protected]