图解「正向代理」的原理 + 实践应用

489次阅读  |  发布于1年以前

本文主要内容如下:

在工作中经常和正向代理和反向代理打交道,有必要总结下正向代理的原理和实践应用了。(反向代理安排在下篇吧)

如何理解正向代理

代理(Proxy)服务通常被我们称为正向代理服务,如下图所示:

大白话聊聊正向代理

一位企业老总,他有一位助理小李,当老总想要订火车票时,就会委托小李帮忙订票,当老总想要订酒店时,小李就会负责查找合适的酒店并安排老总入住。助理小李帮老总办了很多事情,也就是代理了一些事情,而助理小李就充当了一个代理服务器的角色。如下图所示:

正向代理的作用

企业可以使用正向代理来增强网络安全、访问控制、性能优化和隐私保护等方面的功能。以下是企业中如何使用正向代理的一些常见场景和方法:

企业中如何使用正向代理

在企业中,正向代理工具用于多种场景,以增强网络安全性、访问控制、性能优化和隐私保护。以下是一些常见的正向代理工具和它们在不同场景中的用途:

项目中如何使用正向代理

以下是一个 Nginx 的正向代理的配置,

http {
    server {
        listen       80;
        server_name  www.passjava.cn;

        location / {
            proxy_pass http://target_server;
            proxy_set_header Host $host;
        }
    }
}

上述配置表明当客户端通过浏览器或其他方式发送请求到 www.passjava.cn 这个域名时,Nginx 将监听 HTTP 请求的端口 80,并将这些请求代理到 target_server 指定的目标服务器。这是一个典型的正向代理配置,用于隐藏客户端的真实 IP 地址,同时将请求转发到其他服务器上。这在一些网络安全和访问控制方面非常有用。

真实场景的一个应用

我们项目中大量使用 Nginx 作为正向代理和反向代理,这里举一个我用 Nginx 作为正向代理的真实案例。

背景

公司生产一些硬件设备,而这些设备在生产的过程中,需要调用我们后台系统的接口,我们后台系统所在的网络和设备的网络并不在同一个网段内,想要实现网络互通,我们在设备和系统之间加了一层正向代理服务器,设备先将请求发送给代理服务器,由代理服务器将请求转发给后台系统。

解决方案

如下图所示:

设备 1 和设备 2 的 IP 在 192.168.1.0/24 IP 地址段内,HTTP 请求先发到代理服务器,然后转发到后台服务器集群的网关地址(192.168.52.123)。

代理服务器上有两个网卡,和设备之间的网络是通的,和服务器集群之间的网络也是通的。这样就能保证设备的请求能够正常发送到系统了。疑问:为啥不把后台系统的服务器 IP 改成和设备同一网段?

答:问题出在不能保证设备和后台系统在同一局域网内。有的设备是在其他局域网内生产的,即使在同一个网段内,但是是跨局域网的,设备和后台系统也是无法连通的。

完整的 NGINX 配置如下:

正向代理后如何获取真实 IP

另外我们的系统还需要获取设备的真实 IP,这就需要在 Nginx 加上配置:

# location 模块中加入以下配置:
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

上述配置可以暴露客户端的真实 IP 地址给目标服务器,特别是 proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 这两行配置。

让我解释一下这三行配置的含义:

  1. proxy_set_header Host $host;:这一行配置将客户端请求中的 Host 头部信息传递给目标服务器。这是正常的 HTTP 头部信息传递,不涉及客户端 IP 地址。
  2. proxy_set_header X-Real-IP $remote_addr;:这一行配置将客户端的真实 IP 地址作为 X-Real-IP 头部信息传递给目标服务器。这意味着目标服务器可以访问到客户端的真实 IP 地址。
  3. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;:这一行配置将客户端的 IP 地址添加到 X-Forwarded-For 头部信息中,并传递给目标服务器。这是为了记录代理请求的前几个客户端的 IP 地址,通常包括客户端的真实 IP 地址。

当目标服务器收到这些头部信息时,它可以通过 X-Real-IPX-Forwarded-For 头部来获取客户端的真实 IP 地址。

容易误以为的正向代理

比如我的网站项目 passjava.cn,项目是纯静态页面,部署在了一台服务器上。如下图所示,当我在浏览器访问这个域名时,请求会先经过 DNS 域名解析,拿到域名绑定的 IP 地址,而这个 IP 地址又是我购买的云服务器地址,在这个服务器上有网站的静态页面。

以下是 Nginx 的配置:

server {
    listen       80;
    server_name  www.passjava.cn;

    location / {
        root   /home/ubuntu/docs;
        index  index.html;
    }
}

我开始以为这是一个正向代理的配置,其实并不是,这个配置只是一个简单的虚拟主机配置,用于托管静态网站。这个配置定义了一个 Nginx 虚拟主机,用于处理来自 www.passjava.cn 域名的 HTTP 请求,并提供静态网页。

解释下这些配置项含义:

  1. server { ... }:这是一个 server 块,用于定义一个虚拟主机。每个 server 块通常用于配置一个不同的虚拟主机,以处理特定域名或 IP 地址的请求。
  2. listen 80;:这一行指定了监听的端口号,这里是 80,表示该虚拟主机将处理来自客户端的 HTTP 请求,这是 HTTP 的标准端口号。
  3. server_name www.passjava.cn;:这一行定义了虚拟主机所处理的域名。在这个例子中,虚拟主机将处理来自 www.passjava.cn 域名的请求。当客户端发送请求到这个域名时,Nginx 将使用这个 server 块中的配置来响应请求。
  4. location / { ... }:这是一个 location 块,它定义了如何处理特定 URI(统一资源标识符)路径的请求。在这里,location / 匹配所有请求的根路径。
  5. root /home/ubuntu/docs;:这一行指定了 Nginx 服务器上要提供的文件的根目录。当客户端请求根路径时,Nginx 将在 /home/ubuntu/docs 目录中查找文件来提供给客户端。
  6. index index.html;:这一行指定了默认的索引文件,当客户端请求的路径是一个目录时,Nginx 将尝试提供 index.html 文件作为默认文档。如果 /home/ubuntu/docs 目录中存在 index.html 文件,它将作为默认文档提供给客户端。

注意:正向代理配置通常涉及将客户端的请求代理到其他服务器,而不是提供自己的网页内容。正向代理的配置会包括一些额外的代理设置,用于将请求转发到目标服务器,而不是提供本地静态文件。

Copyright© 2013-2020

All Rights Reserved 京ICP备2023019179号-8