[к списку]

SOCKS-прокси

  1. Необходимо реализовать прокси-сервер, соответствующий стандарту SOCKS версии 5.
  2. В параметрах программе передаётся только порт, на котором прокси будет ждать входящих подключений от клиентов.
  3. Из трёх доступных в протоколе команд, обязательной является только реализация команды 1 (establish a TCP/IP stream connection)
  4. Поддержку аутентификации и IPv6-адресов реализовывать не требуется.
  5. Реализация должна быть основана на неблокирующихся сокетах, все нефункциональные требования к реализации и работе программы такие же как в задаче №6 (пункты 5–9).
  6. Прокси должен поддерживать резолвинг доменных имён (значение 0x03 в поле address). Резолвинг тоже должен быть неблокирующимся. Для этого предлагается использовать следующий подход:
    • На старте программы создать новый UDP-сокет и добавить его в селектор на чтение
    • Когда необходимо отрезолвить доменное имя, отправлять через этот сокет DNS-запрос A-записи на адрес рекурсивного DNS-резолвера
    • В обработчике чтения из сокета обрабатывать случай, когда получен ответ на DNS-запрос, и продолжать работу с полученным адресом
    Для получения адреса рекурсивного резолвера, а также для формирования и парсинга DNS-сообщений на Java предлагается использовать библиотеку dnsjava (для других языков найдите сами).
  7. В качестве основы предлагается использовать код port forwarder-а, реализованного в задаче №6 (но это не обязательно).
Для тестирования можно настроить любой Web-браузер на использование вашего прокси, и посещать любые веб-сайты, богатые контентом.

Описание протокола:
  1. На английской Википедии
  2. SOCKS 5 RFC
  3. SOCKS для самых маленьких
Баллов за задачу: 2