Протокол 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, но я разочарован тем, что не могу использовать стандартный протокол (и извлекать выгоду из существующих реализаций).