我最近参加了一个讨论,讨论的是客户端从代理服务器请求页面时会发生什么。我只是想确保我对这个事件序列的理解在一般情况下是正确的:
- 用户请求网站
- 客户端向其配置的 DNS 服务器发送 DNS 请求,以解析目标 IP 地址(这首先是为了适应配置为绕过代理的 HTTP 请求)
- 从 DNS 收到目标 IP 后,在发送 HTTP 请求之前,将根据例外列表检查该请求
- 如果目标服务器不在例外列表中,则请求将被转发到代理服务器。
- 如果目标服务器在例外列表中,则根据客户端机器的路由表转发请求。
如有任何反馈,我们将不胜感激。
答案1
不完全是:这取决于客户端的配置方式。让我们以 IE 为例。
如果您将 IE 配置为明确的代理人:例如未勾选其他选项,代理设置为:8080。
用户输入地址
IE 检查地址是否与 IE 代理例外列表的字符串匹配(即“绕过这些地址的代理:”)
A。如果它与旁路列表, 这客户用途自己的 DNS解析名称,然后客户端直接连接到目标 IP 地址在端口 80 上(假设),然后发送如下请求:
GET /something.htm HTTP/1.1
Host: fulldomainame.example.com
b.如果没有匹配的绕过列表条目, 继续:
IE 连接到其配置的代理,并发送以下形式的请求:
GET http://fulldomainname.example.com/something.htm HTTP/1.1
额外信息:这种使用URL 中的 FQDN是你可以告诉客户想它正在与代理而不是真正的网络服务器对话
代理解析该主机名使用它自己的DNS,然后连接到目标站点(就像上面步骤 2 中的客户端一样)等等。
使用 WPAD/PAC 时:
在使用 Web 代理自动发现 (WPAD) 或代理自动配置 (PAC 或 Autoconfig) 脚本(例如启用自动配置时由 ISA/TMG 提供的脚本)的情况下,情况有所不同:
用户输入地址
客户下载当前wpad.dat/自动代理.js/.pac文件从其配置位置
客户端寻找功能“查找代理服务器",并执行它
Autoproxy 脚本处理主机名和网址。这是一个功能有限的 javascript 文件,但仍然可以实现很多功能:
a.这可能包括名称解析(IsInNet,DnsResolve)
b. 这可能包括字符串匹配(ShExpMatch)
c. 这可能包括数到一百万(我++)
d. 这可能包括令人讨厌的警报弹出消息如果管理员是个混蛋
- (或者只是搞笑)
- ((或调试))
这查找代理服务器函数至少返回一个字符串:要使用的最佳代理的有序列表(以分号分隔)
a. 要么“直接的”,在这种情况下,客户端需要自行解析名称并直接连接,就像上面的 Bypass 情况一样
b. 或“PROXY 代理名称:8080”或类似情况,在这种情况下,客户端连接到该代理上的该端口,告诉它获取完整 URL,以及代理执行名称解析。
- 作为例子:如果脚本函数返回“代理 yourProxy:8080;直接”告诉客户端连接到你的代理在 TCP 端口上8080请求此 URL,并且如果那无法建立连接,请尝试直接连接。 笔记TCP 会话设置失败并不是很快,因此对于用户来说,这可能不是一个愉快的故障转移体验,但总比没有好。也许吧。
偶尔会出现故障、细微差别和无法解释的行为,但大多数情况下,只要事情没有以奇怪和有趣的方式发生,以上就是我多年来看到它的工作方式。较新的浏览器正在优化行为、并行化内容并一直在尝试有趣的事情,因此请查看特定浏览器的最新文档以了解详细信息。
WinSock 代理 / ISA 防火墙客户端 / TMG 客户端:
如果您对 Winsock 代理客户端(来自 TMG/ISA 服务器)感兴趣,那么情况就不同了,它具有更大的灵活性和可移动部件。这里就不多说了,但有文档描述了它的工作原理。简而言之:它插入 Windows 套接字,可以拦截基于 TCP/UDP 的流量和基于每个应用程序和每个用户的名称解析请求。非常强大,但现在也已弃用,并且几年没有更新了。
客户可能非常粘人:
一最后说明:一旦 HTTP 客户端决定与给定站点/url 的代理进行通信,代理没有办法告诉它不要这样做。
没有 HTTP 状态代码或标头表示“我不提供该服务,您应该直接转到该服务”...
一旦客户端决定某个 URL 是代理服务,代理死亡之握接踵而至。
避免这种情况的唯一方法是在客户端建立连接之前在 PAC 或 Bypass 列表中获取选择逻辑。
关于区域和 PAC 文件的最后一点说明
IE 会将以下网站视为直接的已连接(即使 URL 中带点)是本地 Intranet 区域的一部分(默认情况下 - 可在区域属性中设置),因此将执行诸如允许集成 Windows 身份验证到这些站点(即 Kerberos 和/或 NTLM 身份验证,透明)之类的操作。因此,控制某些东西是否在本地 Intranet 区域中定义了它在自动身份验证方面的可信程度。同样,至少默认情况下是这样。
答案2
我不确定你的 DNS 部分是否正确。我曾见过一台没有有效 DNS 服务器的机器使用代理在 IE 中顺利获取页面。
答案3
我在 ubuntu 10.04、wine、IE 6.0 和 squid 2.7 中尝试(系统有一个 dns,而 squid 有其他 dns 服务器)
- 用户向代理发送请求
- Squid 发送 DNS 请求到 DNS 服务器
- Squid 接收 DNS 应答。如果 nxdomain 或其他错误,则向 IE 发送错误页面。如果名称解析成功,则获取页面并将其提供给 IE。
IE 6.0 无法解析 DNS 名称。
答案4
我不这么认为 - 如果您输入 IP 和域在例外列表中,或者域和 IP 在例外列表中,它可能仍会通过代理进行。
proxy.pac/wpad.dat 可能会让您强制摆脱这种行为。