如何通过代理服务器环境获取非标准服务?
Posted
技术标签:
【中文标题】如何通过代理服务器环境获取非标准服务?【英文标题】:How do I get through proxy server environments for non-standard services? 【发布时间】:2010-06-08 07:03:06 【问题描述】:我并不真正了解当今的代理服务器可以扮演什么角色,我正在学习,所以请放轻松 :-) 我有一个使用本土协议编写的客户端/服务器系统,并且需要增强客户端协商摆脱代理环境的能力。
我有一个用 C 和 C++ 编写的现有客户端和服务器系统以提高速度,并在客户端中使用少量 MFC 来处理用户界面。我已经在 Windows 上编写了系统的服务器端和客户端(我工作的人主要是使用 Windows 一切的 Web 开发人员 - 不是一种选择)坚持使用 Berkeley Sockets,因为它是通过 wsock32 来提高效率的。客户端通过非标准端口连接到服务器(即使使用端口 80 是退出某些环境的一种选择,但通过它的协议不是 HTTP)。 TCP 连接在客户端参与实时会议期间保持打开状态。
我们的客户群正在扩展到各种网络环境。我已经能够通过添加通过端口 443 安全连接的能力和使用安全套接字来解决很多问题,因为无法嗅探内部数据包,因此该协议允许协议通过很多环境。但是越来越多的客户使用代理服务器环境,而我的直接连接无法通过。我对代理服务器的老派理解是,它们通过 HTTP 充当外部 html 内容的代理,可能在本地缓存流行的材料以加快本地访问速度,还允许其 IT 人员将某些目标站点列入黑名单。客户抱怨我的软件无法识别并且无法轻松地在他们的代理环境中导航,但我发现很难决定我的“最合适”的解决方案应该是什么。我的软件不会在每次客户端请求后断开连接,而且数据包可以随时来自任何一方,基本上是针对特定领域的典型自定义客户端/服务器系统。
我的第一反应是“他们为什么不能将我的服务器地址添加到他们的白名单中”,但如果有一种程序化的方式我可以通过而不需要他们的 IT 人员帮助它在政治上更好,并且可以说是更好的解决方案反正。另外,也许我仍然不了解代理服务器和环境这些天发展起来的角色和目的。
我对解决方案的第一次尝试是使用 WinInet 及其各种代理功能通过端口 80 与我的非标准协议服务器建立连接(它知道并回答一个简单的 HTTP 外观的 GET 请求并回答它通过一个简单的 HTTP 响应页面来绕过一些使用初始数据包嗅探 (DPI) 的环境。我检索了 WinInet 的 HINTERNET 请求对象背后的实际 SOCKET 句柄,并希望使用它来代替我的软件现有的 SOCKET 连接,并且希望不需要在客户端进行更多更改。它最初似乎是我的解决方案,但经过进一步检查,操作系统似乎首先获得了在此套接字上接收到的数据的机会,因为当我通过套接字上的标准 select(...) 语句收到事件通知并查询通过 ioctlsocket 可用的数据大小调用成功但返回 0 个字节可用,读取不起作用,从那里开始走下坡路。
谁能告诉我一个客户端库(商业很好)可以让我在尽可能少的用户和 IT 人员帮助的情况下通过这些代理服务器环境吗?从我读到的内容来看,它已经超越了 SOCKS,我认为必须有人在我之前解决了这个问题。
感谢您阅读我冗长的问题,
盗版
【问题讨论】:
【参考方案1】:如果您的软件可以在端口 443 上建立 SSL 连接,那么您已经成功了 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。
【讨论】:
谢谢,我会尝试您提到的内容,但使用端口 80。我提到能够在 443 上安全连接,然后我只是说端口 80,所以我想稍微澄清/完善我的问题。我雇来实施 SSL 解决方案的人使用了 STunnel。他们在 127.0.0.1:xx 本地连接到它,它执行安全远程连接部分。我曾希望他们会使用 OpenSSL 库,但他们的解决方案奏效了,因此很难争论重构它。知道了,我是否只需要处理您上面推荐的代理协商并将远程地址指定为 127.0.0.1:xx? @Ripred:不,你不能告诉代理连接到127.0.0.1
- 这只会让它尝试连接到自己。您需要进行代理协商,然后让stunnel
开始通过代理连接进行对话,这听起来您必须进行一些重构才能完成。请记住,许多代理会限制您可以使用 CONNECT
方法的端口 - 可能仅限于端口 443。以上是关于如何通过代理服务器环境获取非标准服务?的主要内容,如果未能解决你的问题,请参考以下文章