在IE中使用HTTP代理(或不使用)时,DNS查询如何工作

我最近参加了一个关于当客户端从代理服务器请求页面时会发生什么的讨论。 我只想确保在一般情况下,我对这一系列事件的理解是正确的:

  1. 用户请求网站
  2. DNS请求由客户端发送到其configuration的DNS服务器以parsing目标IP地址(这是为了适应被configuration为绕过代理的HTTP请求首先完成的)
  3. 一旦从DNS接收到目的地IP,并且在发送HTTP请求之前,将针对例外列表检查请求
  4. 如果目标服务器不在例外列表中,请求被转发到代理服务器。
  5. 如果目标服务器位于例外列表中,则根据客户机的路由表转发请求。

任何反馈将不胜感激。

不完全是:这取决于如何configuration客户端。 我们以IE为例子。

如果您使用显式代理configurationIE:例如,没有其他选项打勾,代理设置为:8080。

  1. 用户input地址

  2. IE检查地址是否与IE代理例外列表 (即“这些地址的旁路代理:”)进行string匹配

    一个。 如果它与Bypass列表中的条目匹配 ,则客户端使用自己的DNSparsing名称,然后客户端直接连接到端口80上的目标IP地址 (假定),然后发送如下请求:

    GET /something.htm HTTP/1.1
    Host: fulldomainame.example.com

    是匹配条目的结尾

    C。 如果没有旁路列表条目匹配 ,请继续:

  3. IE连接到其configuration的代理 ,并发送一个表单的请求:

    GET http://fulldomainname.example.com/something.htm HTTP/1.1

    (顺便说一句:这个使用FQDN作为URL是一种方式,你可以告诉客户端认为它是与代理服务器而不是真正的Web服务器)

  4. 代理使用自己的DNS parsing主机名 ,连接到目标站点等

使用WPAD / PAC时:

在使用WPAD或自动configuration脚本(例如在启用自动configuration时由ISA / TMG提供)的情况下,它是不同的:

  1. 用户input地址

  2. 客户端从其configuration的位置下载当前的wpad.dat / autoproxy.js / .pac文件

  3. 客户端在js文件中查找入口点“ FindProxyForUrl ”,并执行它

  4. Autoproxy脚本处理主机名URL 。 这是一个function有限的JavaScript文件,但很多东西仍然有可能:

    一个。 这可能包括名称parsing (IsInNet,DnsResolve)

    湾 这可能包括string匹配 (ShExpMatch)

    C。 这可能包括数百万 (i ++)

    d。 这可能包括narky警报popup消息,如果pipe理员是一个混蛋(或只是有趣的(或debugging))

  5. FindProxyForUrl函数返回至less一个string :使用的最佳代理的有序列表(以分号分隔)

    一个。 要么是“直接” ,在这种情况下,客户端需要自己parsing名称并直接连接,如上面的绕过案例

    湾 或“PROXY proxyname:8080”或类似的,在这种情况下,客户端连接到该代理上的端口,告诉它获取完整的URL ,并且代理执行名称parsing

    • 例如 :如果脚本函数返回“PROXY yourProxy:8080; DIRECT” ,它告诉客户端连接到TCP端口8080上的yourproxy以请求此URL,并且如果无法build立连接,请尝试直接。 请注意 ,TCP会话设置失败并不是很快,所以这对于用户来说不太可能是一个愉快的故障转移体验,但是没有任何优势。 也许。

偶尔会出现小故障,微妙和不明原因的行为,但大多数情况下,当事情不是以怪异和有趣的方式打破时,以上是我多年来看到的。 较新的浏览器正在优化行为,并行化,并尝试有趣的东西,所以检查给定浏览器的最新文档,以了解细节。

WinSock代理/ ISA防火墙客户端/ TMG客户端

如果您对Winsock代理客户端(来自TMG / ISA Server)感兴趣,那么这是一个不同的故事,具有更多的灵活性和移动部分。 进入这里太多了,但是有些文档描述了它是如何工作的。 简而言之:它插入Windows套接字,并可以拦截基于TCP / UDP的stream量和名称parsing请求在每个应用程序和每个用户的基础上。 非常强大,但现在也不推荐使用,并且在几年内还没有更新。

客户可以是真正紧贴:

最后一个注意事项 :一旦HTTP客户端决定与给定站点/ URL 的代理进行通信,代理就无法告诉它不要

没有HTTP状态代码或标题为“我不服务,你应该直接去它”,而不是…

一旦客户端决定一个特定的URL被代理服务,随之而来的是代理死锁。

避免这种情况的唯一方法是在客户端进行连接之前,在PAC或Bypass列表中获取select逻辑。

我不确定你的DNS部分是否正确。 我看到一台机器没有有效的DNS服务器在IE中使用代理获取页面。

我尝试在Ubuntu 10.04,酒,IE 6.0和鱿鱼2.7(系统有一个DNS和鱿鱼有其他DNS服务器)

  1. 用户发送请求到代理
  2. Squid发送DNS请求到DNS服务器
  3. 鱿鱼收到DNS答案。 如果nxdomain或其他错误,发送错误页面到IE。 如果名称parsing,获取页面,并将其提供给IE。

IE 6.0不能parsingDNS名称。

我不认为这是 – 如果您在例外列表或域中键入IP和域名,并且IP位于例外列表中,则可能仍然通过代理服务器。

proxy.pac / wpad.dat可能会使你强迫你摆脱这种行为。