反向代理的基本思想非常简单。它是用户和后端服务器之间的中间服务器。它的目的可能大不相同但它可以根据URL将请求,路由到各种后端,也可以只是保护免受某些攻击。实现方式也可以不同,但是步骤的主要顺序是完全相同的。
反向代理必须接收请求,它必须处理该请求,对该请求执行一些操作,然后转发给后端。
处理请求包括几个主要步骤:
解析
当反向代理接收到一个请求时,它必须解析它:获取一个动词,一个路径,一个HTTP版本,主机头以及其他头和主体。GET /path HTTP/1.1 Host: example.com Header: something
一切看起来都非常简单,但是如果您深入研究细节,将会发现实现是不同的。
URL解码
根据标准,URL中具有特殊含义的符号必须经过URL编码(%-encoding
),例如双引号("
)或“大于”符号(>
)。但是实际上,任何符号都可以进行URL编码并在路径部分中发送。许多Web服务器在处理请求时执行URL解码,因此它们将以相同的方式处理下一个请求。GET /index.php HTTP/1.1
GET %2f%69%6e%64%65%78%2e%70%68%70 HTTP/1.1
路径规范化
许多Web服务器都支持路径规范化。主要案例是众所周知的:/long/../path/here -> /path/here /long/./path/here -> /long/path/here
但是呢
/..
?对于Apache,它等效于/../
,但对于Nginx,则毫无意义。/long/path/here/.. -> /long/path/ - Apache /long/path/here/.. -> /long/path/here/.. - Nginx
与
//
(“空”目录)相同。Nginx将其仅转换为一个斜杠/
,但是,如果不是第一个斜杠,Apache会将其视为目录。//long//path//here -> /long/path/here - Nginx //long/path/here -> /long/path/here - Apache /long//path/here -> /long//path/here - Apache
这是某些Web服务器支持的一些其他(奇怪)功能。例如:支持路径参数–
/..;/
对Tomcat和Jetty或带有反斜杠(..
)的遍历有效。
b)对请求应用规则并执行操作
处理请求后,由于其配置,反向代理可以对请求执行某些操作。重要的是要注意,在许多情况下,反向代理的规则是基于路径(位置)的。如果路径为pathA
,则做一件事;如果pathB
–则做另一件事。
取决于实现方式或配置,反向代理将根据已处理(解析的,URL解码的,规范化的)路径或未处理的路径(罕见情况)应用规则。对于我们来说,注意是否区分大小写也很重要。例如,反向代理会平等对待下一个路径吗?:
/path1/ == /Path1/ == /p%61th1/ == /lala/../path1/
C)转发到后端
反向代理处理了一个请求,找到了相应的规则并执行了必要的操作。现在,它必须将其发送(转发)到后端。它会发送已处理的请求还是初始请求?显然,如果它已经修改了请求,那么它将发送修改后的版本,但是在这种情况下,它必须执行所有必要的步骤,例如,执行特殊符号的URL编码。但是,如果反向代理仅将所有请求转发到一个后端怎么办,也许转发初始请求是一个好主意?
反向代理的基本思想非常简单。它是用户和后端服务器之间的中间服务器。它的目的可能大不相同但它可以根据URL将请求,路由到各种后端,也可以只是保护免受某些攻击。实现方式也可以不同,但是步骤的主要顺序是完全相同的。反向代理必须接收请求,它必须处理该请求,对该请求执行一些操作,然后转发给后端。
网络安全中的网络代理主要有以下分类:
HTTP代理:WWW对于每一个上网的人都再熟悉不过了,WWW连接请求就是采用的HTTP协议,所以我们在浏览网页、下载数据(也可采用FTP协议)时就是用HTTP代理。它通常绑定在代理服务器的80、3128和8080等端口上。
Socks代理:相应地,采用Socks协议的代理服务器就是SOCKS服务器,是一种通用的代理服务器。Socks是个电路级的底层网关,是DavidKoblas在1990年开发的,此后就一直作为Internet RFC标准的开放标准。Socks不要求应用程序遵循特定的操作系统平台,Socks代理与应用层代理、HTTP层代理不同,Socks代理只是简单地传递数据包,而不必关心是何种应用协议(比如FTP、HTTP和NNTP请求)。所以,Socks代理比其他应用层代理要快得多。它通常绑定在代理服务器的1080端口上。如果用户在企业网或校园网上,需要透过防火墙或通过代理服务器访问Internet就可能需要使用Socks代理。一般情况下,对于拨号上网用户都不需要使用它。
VPN代理:指在共用网络上建立专用网络的技术。之所以称为虚拟网主要是因为整个VPN网络的任意两个结点之间的连接并没有传统专网建设所需的点到点的物理链路,而是架构在公用网络服务商ISP所提供的网络平台之上的逻辑网络。用户的数据是通过ISP在公共网络(Internet)中建立的逻辑隧道(Tunnel),即点到点的虚拟专线进行传输的。通过相应的加密和认证技术来保证用户内部网络数据在公网上安全传输,从而真正实现网络数据的专有性。
反向代理:反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量。反向代理不需要在使用的电脑上配置 IP 和端口,它的目的刚好和正向代理类比(说相反不太恰当,因为都是为了解决跨网域问题)。例如用户想要访问某个公司内部局域网的某台服务器,如果直接输入 10.10.10.10 是根本行不通的。但是,如果这个公司有一台电脑,具备公网 IP,那它就可以做反向代理服务器,用户访问这个公网 IP,由反向代理服务器去访问内网资源,再转发响应给用户。
正向代理:正向代理通常用在局域网想访问万维网上某服务器的情况,例如国内用户(墙内也是一个大的局域网)想访问 YouTube 服务器,如果直接在浏览器中输入 www.youtube.com 通常是无法访问的。这个时候,如果存在一台服务器,它可以访问 YouTube,你可以访问它,那就可以把它作为一个正向代理服务器。当你想访问 YouTube 的时候,你把请求发给正向代理服务器,由它转发请求去访问 YouTube,并将响应返还给你。