在日常使用电脑的过程中,我们经常会遇到需要使用代理的情况。但每次在电脑上进行电脑配置时,都会很疑惑。这么多代理方式,我究竟应该选哪一种?

例如这个是MAC电脑上的代理配置。什么是网页代理,和安全网页代理有什么区别?什么是SOCKS代理?什么又是自动发现代理?
mac代理配置

本文就将以MAC系统的代理配置为基础,同时鉴于我们常常使用的是HTTP/HTTPS服务,来谈谈通过代理访问HTTP/HTTPS服务的一些实现方式。

HTTP代理

HTTP代理即由一台HTTP服务器实现代理功能,包含两种实现方式:普通代理和隧道代理。

普通代理

HTTP普通代理在 XXXX 定义。以访问URL http://abc.xyz/index.html 为例

  1. 浏览器在识别到需要使用代理进行访问后,会向代理服务器发起请求,请求头为 GET http://abc.xyz/index.html 常规的http请求只会传递host之后的路径,由于代理服务器需要知道目标服务器的信息,所以这里请求路径为完整的目标url。
  2. 代理服务器收到请求之后,会向正常的客户端一样,向目标服务器发起请求 GET /index.html
  3. 代理服务器在获取到目标服务器的响应之后,再将响应返回给客户端。

在这个过程中,对于客户端来说,代理服务器扮演的是客户端的角色;对于目标服务器来说,代理服务器扮演的是客户端的角色。代理服务器在整个过程中,扮演“中间人”的角色。代理服务器需要能够识别HTTP请求的内容,因此这种形式的代理又可以认为是四层代理。

隧道代理

上面谈到的普通代理,代理服务器需要识别HTTP请求的内容,才能对报文进行转发。但目前越来越多的网站采用的是HTTPS服务,HTTP报文都进行了端到端的加密,“中间人”方式的普通代理对加密数据就完全无能为力了。因此要对HTTPS服务进行代理,我们需要另外一种代理协议——隧道代理。
隧道代理的整个流程如下图:

浏览器先向代理服务器发送一个CONNECT请求, 让代理服务器创建一个到目标服务器的连接。 一旦连接创建好之后,浏览器就可以直接通过这个连接进行数据的发送,代理完全不用关心数据的内容,直接透传即可。理论上,隧道道理可以代理任何一种基于TCP的应用层协议,因此HTTP隧道代理又可称为三层代理。

如果代理的是HTTPS协议,那么连接建立以后,浏览器就可以像直接访问目标服务器一样,通过这个连接与目标服务器进行TLS的握手,以及握手成功之后的数据发送。使用HTTP这种不安全的协议代理HTTPS,能保证通信的安全吗? 当然是可以的。我们可以看到在整个过程中,除了CONNEECT请求是明文的,其他的数据都要等到TLS握手成功后才会进行,而HTTPS本身就是中间人的天然克星,代理服务器无法获取密钥,也就无法对经过的数据进行解密。而对于CONNECT请求,除了域名和端口之外,不包括url、cookie等其他任何敏感信息。即使是CONNECT请求暴露的域名和端口,在正常不经代理的HTTPS请求中,也可以通过IP信息轻易得到。因此隧道代理并没有影响HTTPS协议的安全性。

正如前面所说,隧道代理可以代理任意一种基于TCP的应用层协议,因此也是可以代理HTTP协议的。然而在各个浏览器的实现都是:如果目标服务器是HTTP服务,那么浏览器会采用普通代理;如果目标服务器是HTTPS服务,则使用隧道代理。

SOCKS代理

和HTTP代理协议是基于HTTP协议的一种扩展相比,SOCKS5协议则是一种直接为了代理而设计的一套协议。SOCK5协议和HTTP隧道代理有一些相似,都是先由客户端请求代理服务器创建到目标服务器的连接,连接创建完成之后,直接透传客户端与目标服务器之间的流量。但相比于HTTP的隧道代理,SOCKS5协议除了支持TCP协议之外,还支持UDP协议的透传。

SOCKS协议的详细细节可以参考: https://www.mojidong.com/post/2015-03-07-socket5-1/

MAC中的配置

在回到前面说的MAC中的配置,经过验证之后发现:

  1. 网页代理(HTTP)只有在访问HTTP服务时才会使用,且使用简单代理协议
  2. 安全网页代理(HTTPS)只有在访问HTTPS服务时才会使用,切使用隧道代理协议
  3. 如果配置了SOCKS代理,无论是否配置了网页代理和安全网页代理,都会优先采用SOCKS代理