Skip to content

TCP прокси-сервер, соответствующий стандарту SOCKS версии 5

License

Notifications You must be signed in to change notification settings

ptrvsrg/tcp-proxy

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

12 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

SOCKS-прокси

Задание

Необходимо реализовать прокси-сервер, соответствующий стандарту SOCKS версии 5.

Требования

  • В параметрах программе передаётся только порт, на котором прокси будет ждать входящих подключений от клиентов.

  • Из трёх доступных в протоколе команд, обязательной является только реализация команды 1 (establish a TCP/IP stream connection)

  • Поддержку аутентификации и IPv6-адресов реализовывать не требуется.

  • Для реализации прокси использовать неблокирующиеся сокеты, работая с ними в рамках одного треда. Дополнительные треды использовать не допускается. Соответственно, никаких блокирующихся вызовов (кроме вызова селектора) не допускается.

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

  • В приложении не должно быть холостых циклов ни в каких ситуациях. Другими словами, не должно быть возможно состояние программы, при котором неоднократно выполняется тело цикла, которое не делает ни одной фактической передачи данных за итерацию.

  • Не допускается неограниченное расходование памяти для обслуживания одного клиента.

  • Производительность работы через прокси не должна быть заметно хуже, чем без прокси. Для отслеживания корректности и скорости работы можно глядеть в Developer tools браузера на вкладку Network.

  • Прокси должен поддерживать резолвинг доменных имён (значение 0x03 в поле address). Резолвинг тоже должен быть неблокирующимся. Для этого предлагается использовать следующий подход:

    • На старте программы создать новый UDP-сокет и добавить его в селектор на чтение
    • Когда необходимо отрезолвить доменное имя, отправлять через этот сокет DNS-запрос A-записи на адрес рекурсивного DNS-резолвера
    • В обработчике чтения из сокета обрабатывать случай, когда получен ответ на DNS-запрос, и продолжать работу с полученным адресом
    • Для получения адреса рекурсивного резолвера, а также для формирования и парсинга DNS-сообщений на Java предлагается использовать библиотеку dnsjava (для других языков найдите сами).

Тестирование

Для тестирования можно настроить любой Web-браузер на использование вашего прокси, и посещать любые веб-сайты, богатые контентом.

About

TCP прокси-сервер, соответствующий стандарту SOCKS версии 5

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published