HTTP代理是如何工作的?

85

我在网上搜索了关于http代理的内容。 我读了一些关于代理服务器的维基文章。 但是我仍然不明白http代理是如何工作的,我太蠢了。

这是我对http代理工作原理的假设: 如果我将http代理设置为特定的代理,比如Proxy_A,那么当我启动Chrome/IE并输入一个特定的URL,比如URL_A,Chrome/IE是否会直接将请求发送到Proxy_A, 然后Proxy_A将请求发送到URL_A的真实服务器?


4
是的,大多数情况下代理A会将响应发送回给您。相当简单吧。 - Adam Magaluk
我认为澄清“HTTP代理”或“Web代理”与其他类型的代理之间的区别非常重要;您可以直接将HTTP请求发送到代理服务器(同时附带绝对URL以便它知道转发消息的位置,如果您直接向服务器发出请求,则不需要此信息)。有些人错误地称其他类型的代理为“Web代理”,但它们实际上是在网络层工作,并不了解HTTP。 - spinkus
1
即使客户端只是执行HTTP GET操作 - 如果服务器/后端受到保护(SSL),则客户端必须首先通过执行HTTP CONNECT方法来建立与后端的连接 - 这是由于加密所需。然后才能使用其他HTTP方法,如GET。 - Progruma
这是一个关于该主题的绝佳资源 - Accountant م
显示剩余2条评论
2个回答

117

HTTP代理使用HTTP协议,专门用于HTTP连接,但也可以被滥用于其他协议(这已经成为一种标准)。

浏览器(客户端)向代理发送GET http://SERVER/path HTTP/1.1请求。
现在代理将实际请求转发给服务器。
服务器只会将代理视为连接并像对待客户端一样回答代理。
代理接收响应并将其转发回客户端。

这是一个透明的过程,几乎就像直接与服务器通信一样,因此对于浏览器来说只是一个微小的开销来实现HTTP代理。
还有一些额外的头可以发送以识别客户端,揭示他正在使用代理。
代理有时会在数据流中更改/添加内容,以实现各种目的。
例如,某些代理在特殊的HTTP HEADER中包含您的真实IP地址,该地址可以在服务器端记录或在其脚本中拦截。

CLIENT <---> PROXY <---> SERVER

更新:
与使用代理作为安全/隐私功能相关
正如您在上面的ASCII图中所看到的,客户端和服务器之间没有直接通信。双方只是通过它们之间的代理进行交流。
在现代世界中,客户端通常是浏览器,服务器通常是Web服务器(例如Apache)。

在这样的环境中,用户经常信任代理是安全的,并且不会泄露他们的身份。
但是,由于运行在浏览器上的复杂软件框架,有许多可能破坏此安全模型的方法。
例如,Flash或Java小程序就是一个完美的例子,说明代理连接可能会断开。 Flash和Java都可能不太关心其父应用程序(浏览器)的代理设置。
另一个例子是DNS请求,根据代理和应用程序设置,可以在不使用代理的情况下到达目标名称服务器。
另一个例子是cookie或您的浏览器元数据足迹(分辨率、响应时间、用户代理等),如果Web服务器已经认识您(或者在没有代理的情况下再次遇到您),这两个示例都可能识别您。

最后,代理本身需要得到信任,因为它可以读取通过它传输的所有数据,并且还可能能够破解您的SSL安全性(请阅读有关中间人攻击的内容)。

如何获取代理
代理可以作为服务购买,扫描获取或自行运行。

公共代理
这些是最常用的代理,而通常的术语“公共”相当误导。
更好的术语应该是“开放代理”。如果您运行没有防火墙或身份验证的代理服务器,则全球任何人都可以找到它并滥用它。
大多数销售代理的公司只是扫描互联网寻找此类代理,或者他们使用被黑客攻击的Windows计算机(僵尸网络)并将其出售以进行大多数非法/垃圾邮件活动。
大多数现代国家认为在未经授权的情况下使用开放代理是一种滥用行为,这是很常见的事情,但实际上可能会导致监禁。
可以通过搜索开放端口来扫描代理,典型的免费程序是https://nmap.org
作为谨慎之言:较大规模的扫描几乎肯定会使您的互联网连接被您的ISP禁止。

付费代理
这里有4种类型的代理:
1) 付费公共(开放)代理
基本上,这些卖家出售或转售大量的代理列表,定期刷新以删除失效的代理。
这些代理被大规模滥用,并且通常在包括Google在内的大多数网站上被列入黑名单。
此外,这些代理通常非常不稳定和非常缓慢。
绝大多数这些代理只是滥用了错误配置的服务器。 这是一个非常竞争的“市场”,谷歌会给出许多例子。

2) 付费黑客(僵尸网络)代理
这些代理滥用计算机,主要是物联网或Windows桌面作为代理主机。攻击者大规模使用它们进行各种非法目的。
卖家通常将它们称为“住宅代理”,以隐藏它们的非法性质。
使用这样的代理毫无疑问是非法的,被滥用的用户可以轻松记录“您”的IP,包括劫持您连接到目标的可能性。
根据来源,这些IP可能没有列入黑名单,因此“质量”比公共代理好得多。

3) 付费共享代理
这些是数据中心代理,通常合法并具有快速上行链路。
由于存在大量的电子商务垃圾邮件,这些IP经常被滥用,并且通常会被列入黑名单。
典型用途是规避Craigslist限制或地理限制。

4) 付费私人/专用代理
“私人”表示专用。如果运营商是专业的,则意味着您的代理不与其他人共享。
这些通常用于更专业和合法的活动,特别是当代理IP租用时间较长时。
著名的运营商包括https://us-proxies.com

自己的代理
也可以运行自己的代理,有各种开源项目可用。
最常用的代理服务器是https://squid-cache.org


18
那么原始的URL是如何发送到代理服务器的? - edwin
@John - 如果服务器将代理视为“客户端”,那么像cookie这样的东西是如何处理的呢?换句话说,是什么防止了cookie被放在代理上而不是实际的客户端上? - Howiecamp
嗨John(或任何其他未来的访问者),我有一个问题:如果我理解正确,代理服务器可以隐藏客户端的真实ID,使其无法被接收方服务器(即http://host.tld/的服务器)发现,但它无法隐藏客户端ID不被ISP的服务器发现,对吗?如果是这样,有没有办法从ISP隐藏呢? - jeff
在Google中搜索TOR或者Cloakfish。 - John
1
和@edwin一样,我也有同样的问题。我不得不重新读了几遍。也许让我困惑的是在例子中我认为“host.tld”是PROXY,但实际上它是SERVER。答案是准确的,但对于未经培训的人来说可能需要一些改进,这样一次阅读就足够了。可能只需删除host.tld的引用,例如“发送类似于GET http://SERVER/path HTTP/1.1到PROXY”。或者...其他什么。 - Lee Richardson
显示剩余9条评论

27

除了John上面的精彩回答之外,还有一个重要的步骤是PROXY和CLIENT之间的初始连接握手。参见Websocket RFC

CONNECT example.com:80 HTTP/1.1
Host: example.com

这是客户端用来打开SSL隧道的相同请求,本质上使用代理


3
我觉得这是答案中比较复杂的部分,而且被接受的答案没有涉及到这一点。你已经回答了重要的部分:代理是如何发生的。或者至少你提供了更多信息的线索。 - Ivan P
6
不,伊凡说的并不正确。他只是描述了CONNECT方法,但问题实际上是关于http代理的。CONNECT用于建立通用的TCP/IP隧道,而正如你在我的回答中所看到的,GET则用于特定的HTTP隧道。对于SSL,由于加密的缘故,需要一个原始隧道,这就是为什么要使用CONNECT的原因。 - John
2
谢谢,如果没有这部分的解释,我们会问,在https中,如果一切都被加密了,代理服务器如何知道所需的目标!这就是为什么在浏览器开始与网站通信之前,先向代理发送明文的“CONNECT”请求,而代理只是在它们之间转发加密数据。 - Accountant م
@John,是否可以将HTTP CONNECT用于普通的HTTP请求? - omjego
@omjego CONNECT 是用于代理的,而不是用于 Web 服务器的。它们使用 GET/POST/PUT 等。 CONNECT 只是一个代码词,它被称为“连接”,这样人们就可以理解它是一个请求连接到其他地方,而 GET 或 POST 则意味着与您刚刚连接的服务器通信。 - John
哦,我的意思是是否可以使用CONNECT通过代理访问HTTP服务器?这样我就可以通过代理创建的隧道访问服务器了。 - omjego

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接