Почему SOCKS5 требует ретрансляции UDP поверх UDP?

Протокол SOCKS5, описанный RFC1928 обеспечивает поддержку UDP.

Подводя итог, клиент, желающий ретранслировать UDP-пакеты через сервер SOCKS5, должен, как минимум:

  • открыть TCP-соединение с сервером SOCKS5;
  • отправить UDP ASSOCIATE запрос (см. раздел 4);
  • получать от сервера адрес и порт, по которому он должен отправлять UDP-пакеты для ретрансляции;
  • отправлять датаграммы (UDP) на этот адрес, инкапсулированные с некоторыми заголовками (см. раздел 7 ).

Вот некоторые соответствующие цитаты из раздела 6:

Связь UDP завершается, когда завершается соединение TCP, по которому поступил запрос UDP ASSOCIATE.

В ответе на запрос UDP ASSOCIATE поля BND.PORT и BND.ADDR указывают номер / адрес порта, на который клиент ДОЛЖЕН отправлять сообщения запроса UDP для ретрансляции.

и раздел 7:

Клиент на основе UDP ДОЛЖЕН отправлять свои дейтаграммы на сервер ретрансляции UDP на порт UDP, указанный BND.PORT в ответе на запрос UDP ASSOCIATE.

Почему так много сложностей? Почему бы просто не отправлять UDP-пакеты в уже существующем TCP-соединении?

РЕДАКТИРОВАТЬ: чтобы уточнить, Я ожидаю, что прокси-сервер SOCKS будет получать пакеты UDP через поток TCP, а затем передавать их цели, используя фактический UDP. Затем получите UDP-пакеты от цели и отправьте их обратно по TCP-потоку.


Вот какой-то контекст.

Моя цель - реализовать обратный модем, чтобы устройство Android могло использовать подключение к Интернету компьютера, к которому оно подключено, не требуя доступа root как на устройстве, так и на компьютере (SimpleRT работает, но требует доступа root на компьютере).

Моя первая идея заключалась в том, чтобы запустить простой сервер SOCKS5 с ssh -D на компьютере, так что мне нужно было только реализовать клиент. Пакеты будут передаваться с устройства на компьютер через adb благодаря переадресации удаленного порта, предоставляемой adb reverse

К сожалению, OpenSSH сервер SOCKS не поддерживает не поддерживает UDP. Но это было просто ограничение реализации, вместо этого я мог бы использовать другой сервер SOCKS.

Однако adb reverse также не поддерживает пересылку UDP.

Отсюда мой вопрос о протоколе SOCKS5.

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


person rom1v    schedule 31.01.2017    source источник
comment
Вы не можете отправлять дейтаграммы через TCP-соединение. TCP - это протокол потока байтов. Вопрос хочу иметь смысл.   -  person user207421    schedule 01.02.2017
comment
Я имею в виду, конечно, UDP-пакет, обернутый поверх TCP-потока в качестве полезной нагрузки.   -  person rom1v    schedule 01.02.2017
comment
@ rom1v: Если бы пакеты UDP были обернуты в поток TCP, это уже не был бы UDP, это был бы TCP. Существующее программное обеспечение UDP за прокси-сервером не знает, как выполнить упаковку TCP. На ум приходит один сценарий: одно приложение подключается к прокси-серверу SOCKS и открывает порт ретрансляции UDP, а затем другое приложение выполняет фактическую отправку пакетов UDP через прокси. Поскольку протокол UDP не требует установления соединения, этому ничто не препятствует. Ничто не требует, чтобы приложение, открывающее порт UDP, и приложение, отправляющее данные UDP, были одним и тем же приложением. TCP, с другой стороны, этого не допустил.   -  person Remy Lebeau    schedule 01.02.2017
comment
@ rom1v: ожидаете ли вы, что прокси-сервер SOCKS будет получать пакеты UDP через поток TCP, а затем передавать их цели, используя фактический UDP? А затем получать UDP-пакеты от цели и отправлять их обратно по TCP-потоку?   -  person Remy Lebeau    schedule 01.02.2017
comment
@ Реми Лебо. Я отредактировал свой вопрос, чтобы добавить вашу формулировку, что идеально ;-)   -  person rom1v    schedule 01.02.2017


Ответы (1)


Я отвечаю на свой вопрос: вероятно, чтобы избежать механизмов TCP (повторная передача пакетов, head-of -строчная блокировка…).

Однако для локального инструмента обратного модема это не проблема, поэтому я реализовал UDP через TCP без использования SOCKS.

person rom1v    schedule 30.03.2017