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


20

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

  1. 用户请求网站
  2. 客户端将DNS请求发送到其配置的DNS服务器,以解析目标IP地址(首先完成此操作是为了适应配置为绕过代理的HTTP请求)
  3. 从DNS接收到目标IP后,并且在发送HTTP请求之前,将根据例外列表检查该请求
  4. 如果目标服务器不在例外列表中,则请求将转发到代理服务器。
  5. 如果目标服务器在例外列表中,则根据客户端计算机的路由表转发请求。

任何反馈将不胜感激。

Answers:


21

不完全是:这取决于客户端的配置方式。让我们以IE为例。

如果使用显式代理配置IE :例如,未勾选任何其他选项,则代理设置为something:8080。

  1. 用户输入地址

  2. IE会根据IE代理例外列表检查地址是否有字符串匹配(即“绕过这些地址的代理:”)

    一种。如果与“ 旁路”列表中的条目匹配,则客户端使用其自己的DNS来解析名称,然后客户端直接连接到端口80(假定)上的目标IP地址,然后发送如下请求:

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

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

  3. IE连接到其配置的代理,并发送以下形式的请求:

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

    额外的事实:在URL中使用FQDN是一种可以告诉客户端认为客户端正在与代理而不是真正的Web服务器通信的方法

  4. 代理使用自己的 DNS 解析该主机名,然后连接到目标站点(类似于上述步骤2中的客户端),等等。

使用WPAD / PAC时:

如果使用的是Web代理自动发现(WPAD)或代理自动配置(PAC或自动配置)脚本,例如启用自动配置时ISA / TMG提供的脚本,则有所不同:

  1. 用户输入地址

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

  3. 客户端在js文件中查找函数“ FindProxyForUrl ”并执行

  4. Autoproxy脚本处理主机名URL。这是功能有限的javascript文件,但仍有许多可能:

    一种。这可能包括名称解析(IsInNet,DnsResolve)

    b。这可能包括字符串匹配(ShExpMatch)

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

    d。如果管理员是个混蛋,这可能会包括晦涩的警报弹出消息

    • (或只是很有趣)
    • ((或调试))
  5. FindProxyForUrl至少一个字符串函数返回最佳的代理来使用的有序列表(分号分隔):

    一种。要么是“ DIRECT”,在这种情况下,客户端需要根据上面的“绕过”情况自行解析名称并直接连接

    b。或“ PROXY proxyname:8080”或类似的名称,在这种情况下,客户端连接到该代理上的该端口,告诉客户端获取完整的URL,然后代理执行名称解析

    • 作为一个例子:如果脚本函数返回“PROXY yourProxy:8080; DIRECT”,告诉客户端连接到yourproxy TCP端口8080来请求该URL,如果连接不能建立,尝试将直接。 请注意,TCP会话设置失败并非很快,因此对于用户而言,这不太可能是一种令人愉悦的故障转移体验,但却无所不能。也许。

偶尔会有小故障,微妙之处和无法解释的行为,但是在大多数情况下,如果事情没有以怪异和有趣的方式被破坏,以上就是我多年来看到它的方式。较新的浏览器一直在优化行为,并行化内容以及一直尝试有趣的事情,因此请查看给定浏览器的最新文档以了解详细信息。

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

如果您对Winsock代理客户端(来自TMG / ISA Server)感兴趣,那就不一样了,它具有更多的灵活性和可移动的部分。这里太多了,但是周围有一些文档描述了它是如何工作的。简而言之:它插入Windows套接字,并且可以基于每个应用程序和每个用户拦截基于TCP / UDP的流量和名称解析请求。功能强大,但现在已弃用,并且几年未更新。

客户可能真的很狡猾:

一个最后要注意:一旦一个HTTP客户端已决定跟一个代理指定网站/ URL,也没有办法为代理告诉它不要

没有用于“我不提供服务,您应该直接转到它”的HTTP状态代码或标头...

一旦客户端确定特定的URL由代理服务,便会发生proxy-death-grip

避免这种情况的唯一方法是在PAC或“旁路”列表中,在客户端建立连接之前就获得选择逻辑。

有关区域和PAC文件的最终说明

IE将直接连接的站点(即使它们在URL中包含点)视为本地Intranet区域的一部分(默认情况下,可以在“区域”属性中设置),因此将执行诸如允许对这些站点进行集成Windows身份验证的操作(即Kerberos和/或NTLM身份验证,透明地)。因此,控制某项内容是否在本地Intranet区域中可以定义其在自动身份验证方面的信任程度。同样,至少默认情况下。


是否有一个RFC,指出客户端应的标准或部分通过代理连接之前执行DNS解析?
惠勒

据我所知,只是常规和/或效率。旧的Microsoft Winsock代理客户端用于允许您使用名称解析选项。没有什么可以阻止您编写一个进行名称解析然后使用代理的PAC了……刚开始时并不是这样。
TristanK

0

我不确定您的DNS部分是否正确。我见过没有有效DNS服务器的计算机可以使用代理在IE中正常获取页面。


我知道一个ISA Server Web代理客户端使用ISA服务器的DNS来解析目标地址,但是我很确定XP / Win7计算机的Internet选项中设置的基本HTTP代理可以如上所述解析...
orange_aurelius

...哦 我只是做了一个证明自己错的测试,至少在IE中是如此。因此,我想我的下一个问题是,如何对代理例外列表中的地址解析DNS?也许是时候摆脱嗅探器了。
orange_aurelius

0

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

  1. 用户向代理发送请求
  2. Squid向DNS服务器发送DNS请求
  3. Squid收到DNS答复。如果出现nxdomain或其他错误,请将错误页面发送到IE。如果名称解析,则获取页面并将其提供给IE。

IE 6.0无法解析DNS名称。


0

我不认为这是-如果您在例外列表或域中输入IP和域,并且IP在例外列表中,则该IP可能仍会通过代理。

proxy.pac / wpad.dat可能使您能够强行摆脱这种行为。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.