Подключение TCP-сокета Asio к слушателю SOCKS5 завершает лишь один шаг: TCP-соединение с этим слушателем. Оно не просит прокси соединиться с конечным сервером. Для разрешённой проверки публичной цели список прокси SOCKS5 предлагает кандидатов для этой первой TCP-точки; соединителю всё равно нужно выполнить обмен, описанный ниже.

Затем соединитель SOCKS5 должен выполнить обмен протокола:

  1. Отправить приветствие версии 5 со списком методов аутентификации, поддерживаемых клиентом.
  2. Прочитать выбранный метод и выполнить его обмен аутентификации, когда это требуется.
  3. Отправить CONNECT с типом адреса назначения, адресом и портом в сетевом порядке байтов.
  4. Прочитать ответ, проверить его версию и код результата, затем поглотить полный связанный адрес и порт переменной длины.
  5. Передать установленный поток протоколу приложения.

Помощник с именем socks5::async_proxy_connect относится к реализации SOCKS, предоставляющей этого помощника. Упоминание рядом с boost::asio не делает его частью интерфейса TCP-сокета Asio.

Чтения TCP могут вернуть лишь часть ответа. Составляйте чтения для нужного числа байт, затем выбирайте оставшуюся длину из поля типа адреса. Не предполагайте, что каждый ответ сервера имеет фиксированную раскладку IPv4.

Для HTTPS выполняйте TLS-рукопожатие с адресатом только после успешного SOCKS CONNECT, сохраняя SNI адресата и проверку имени хоста. Один успешный ответ прокси сам по себе не аутентифицирует веб-сайт.

Сохраняйте отмену и сроки на протяжении всей последовательности настройки. Если время установления TCP-соединения истечёт, последующие обмены приветствия, аутентификации и CONNECT останутся без ограничений.

Похожие статьи