Как пройти через среды прокси-серверов для нестандартных сервисов? - PullRequest
1 голос
/ 08 июня 2010

Я не совсем понимаю, какую роль могут сыграть сегодняшние прокси-серверы, и я учусь, поэтому будьте спокойны со мной :-) У меня есть система клиент / сервер, которую я написал с использованием собственного протокола, и мне нужноулучшить клиентскую сторону для согласования выхода из прокси-среды.

У меня есть существующая клиентская и серверная система, написанная на C и C ++ для скорости и небольшое количество MFC в клиенте для обработки пользователя.интерфейс.Я написал как серверную, так и клиентскую часть системы в Windows (люди, на которых я работаю, в основном веб-разработчики, использующие все для Windows, а не выбор), придерживаясь сокетов Berkeley, как это было с помощью wsock32, для эффективности.Клиенты подключаются к серверу через нестандартный порт (хотя использование порта 80 - это вариант для выхода из некоторых сред, но протокол, который проходит через него, не HTTP).Соединения TCP остаются открытыми на время участия клиентов в конференциях в реальном времени.

Наша клиентская база распространяется на все виды сетевых сред.Мне удалось решить множество проблем, добавив возможность безопасного соединения через порт 443 и используя безопасные сокеты, которые позволяют протоколу проходить через множество сред, поскольку внутренние пакеты не могут быть перехвачены.Но все больше и больше наших клиентов находятся в среде прокси-серверов, и мои прямые подключения не проходят через них.Мое старое школьное понимание прокси-серверов заключается в том, что они действуют как прокси-сервер для внешнего HTML-контента через HTTP, возможно, локально кэшируя популярные материалы для более быстрого локального доступа, а также позволяют своим ИТ-специалистам помещать в черный список определенные сайты назначения.Заказчики жалуются на то, что мое программное обеспечение не распознает и легко перемещается по их прокси-средам, но мне трудно решить, каким должно быть мое «наилучшее соответствие».Мое программное обеспечение не разрывает соединение после каждого клиентского запроса, и в дополнение к этому пакеты могут приходить с любой стороны в любое время, в основном это ваша обычная система клиент / сервер для определенной ниши.

Мой первыйРеакция такова: «Почему они не могут просто добавить адреса моего сервера в свой белый список», но если есть программный способ, которым я могу воспользоваться, не требуя от своих ИТ-специалистов помочь ему, это политически лучше и, возможно, в любом случае, возможно, является лучшим решением.Плюс, может быть, я до сих пор не понимаю роль и назначение прокси-серверов и сред, в которых они выросли в наши дни.

Моей первой попыткой было использование WinInet с различными прокси-возможностями для установления соединения.через порт 80 на мой нестандартный сервер протоколов (который знает достаточно, чтобы распознать и ответить на простой HTTP-запрос GET и ответить на него простой страницей ответа HTTP, чтобы обойти некоторые среды, в которых используется начальный анализ пакетов (DPI)).Я получил фактический дескриптор SOCKET за объектом запроса WinInet HINTERNET и надеялся использовать его вместо существующего соединения SOCKET моего программного обеспечения, и, надеюсь, не нужно больше менять на стороне клиента.Сначала это казалось моим решением, но при дальнейшей проверке кажется, что ОС получает первый шанс при получении данных на этом сокете, так как, когда я получаю уведомление о событиях через стандартный оператор select (...) на сокете и запрашиваюразмер данных, доступных через ioctlsocket, вызов успешен, но возвращает 0 доступных байтов, чтение не работает, и оттуда идет спуск.

Может кто-нибудь рассказать мне о клиентской библиотеке (коммерческая подойдет)Позвольте мне обойти эти прокси-серверы с минимально возможной помощью пользователей и ИТ-персонала?Из того, что я прочитал, оно вышло за рамки SOCKS, и я полагаю, что кто-то должен был решить эту проблему до меня.

Спасибо за чтение моего скучного вопроса,

Ripred

1 Ответ

2 голосов
/ 08 июня 2010

Если ваше программное обеспечение может устанавливать SSL-соединение через порт 443, то вы на 99% пути.

Обычно прокси HTTP настроены на прокси SSL-on-443 (для целей HTTPS). Вам просто нужно научить ваше программное обеспечение использовать HTTP-прокси. Проверьте HTTP RFC для получения полной информации, но версия Cliffs Notes:

  • Подключение к прокси-серверу HTTP через порт прокси;
  • Отправить на прокси:

.

 CONNECT your.real.server:443 HTTP/1.1\r\n
 Host: your.real.server:443\r\n
 User-Agent: YourSoftware/1.234\r\n
 \r\n
  • Затем выполните синтаксический анализ ответа прокси-сервера, который начинается с кода состояния HTTP, за которым следуют заголовки HTTP и пустая строка. Затем вы будете разговаривать с пунктом назначения (если код состояния в любом случае указывает на успех) и можете начать говорить по SSL.

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

...