INFO
Categories

反转反向代理→正向代理

什么是正向代理?

正向代理代理的是客户端
正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从目标服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转发请求,将获得的内容返回给客户端

1.1.2 正向代理的作用

为在防火墙内的局域网客户端提供访问Internet的途径
可以使用缓冲特性减少网络使用率
使用代理后会隐藏真实的IP地址(安全类应用:跳板机)
访问受地理位置限制的网络(最常用for me)

Nginx 代理还可以分为正向代理和反向代理。反向代理是代替服务端处理请求,正向代理正好相反,Nginx 正向代理是代替客户端处理请求。

正向代理的主要作用就是代替客户端发送请求给服务端,获得服务端响应数据后再返回给客户端,如图所示

从服务端的角度来看,客户端仿佛就是这台 Nginx 正向代理服务器,但事实上并不是,它仅仅是一个中转站而已。

正向代理的实际应用场景也有很多,常见的是匿名访问,例如为了保护自己的隐私,通过正向代理服务器访问某些网站,这样网站的管理员无法得知访问者的真实位置。

另一个应用是用作跳板机,很多企业的云服务器都在使用专有网络,没有在允许访问名单里的IP地址无法访问服务器,这个时候就需要一台跳板机,通过它来访问专有网络内的服务器。

网络上有很多免费的正向代理服务器,甚至有些代理服务器可以让你访问到国外的一些网站,但是切记,千万不要用它来做违法的事情!

在 Nginx 主配置文件中配置正向代理的示例如下:

location / {
    resolver 114.114.114.114 223.5.5.5;
    resolver_timeout 30s;
    proxy_pass $scheme://$host$request_uri;
}

示例中:

  • resolver 用于配置 DNS 服务器地址。可以配置多个,以轮询方式请求;
  • resolver_timeout 用于解析超时时间;
  • proxy_pass$scheme://$host$request_uri 为正向代理核心配置,用于转发客户端请求。

案例演示

通过 Nginx 正向代理服务器访问网站。

在虚拟机二(192.168.1.130)上搭建一个简单的网站,在虚拟机一(192.168.1.128)上搭建 Nginx 正向代理服务器,Nginx 正向代理案例的架构如下图所示。我们在机器本身配置正向代理的地址,访问虚拟机二的网站,查看网站的访问日志记录的是谁的 IP 地址。

1) 在虚拟机二(192.168.1.130)上搭建一个简单的网站。直接用 DNF 部署 Nginx 服务,再在 Nginx 服务上放一个网站,最后启动 Nginx 服务访问网站。

2) 在虚拟机一(192.168.1.128)中部署 Nginx 服务并配置正向代理。

-----省略编译安装 Nginx 服务步骤-----
[root@linux nginx]# vim conf/nginx.conf
user nginx;
pid logs/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       80;  #端口使用默认的 80 端口
        server_name  localhost;

        location / {
            resolver 114.114.114.114 223.5.5.5;
            resolver_timeout 30s;
            proxy_pass $scheme://$host$request_uri;
        }

        error_page  500 502 503 504 /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

3) 因为使用本地计算机作为客户端,充当用户的角色,所以我们需要为本地计算机(Windows系统)配置代理,指向 Nginx 正向代理服务器,步骤如下图所示。

4) 计算机本身的代理配置完成后,使用浏览器访问虚拟机二(192.168.1.130)的网站,如下图所示。再去虚拟机二上查看 Nginx 访问日志,查看访问网站的 IP 地址。

[root@localhost nginx]# tail -f /usr/local/nginx/logs/access.log
192.168.1.1 - - [19/Dec/2021:17:01:53 +0800] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" "-"
192.168.1.128 - - [19/Dec/2021:17:21:22 +0800] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36" "-"

通过访问日志可以看到有两条访问记录:

  • 第一条访问记录的客户端 IP 地址是计算机本身,这是因为在步骤一搭建好网站后访问了一下确认网站是否搭建成功;
  • 第二条访问记录是在计算机配置了代理后访问的,记录的客户端 IP 地址是 Nginx 正向代理服务器的,说明 Nginx 正向代理配置成功。

因为客户端访问网站时是通过 Nginx 代理服务器访问的,代理服务器将访问的结果再转发给客户端,这样网站的访问日志中记录的来访人员只能是代理服务器。对于网站来说,它并不知道客户端的存在。

Nginx服务器正向代理服务的配置的3个指令

在实际应用中,使用Nginx服务器代理服务功能的情况相对少一些,Nginx代理服务本向也相对简单,涉及的主要指令不多。这些指令原则上可以出现在Nginx配置文件的http块、server块或者location块中,但一般是在搭建的Nginx服务器中单独配置一个server块用来设置代理服务。

1.resolver指令

该指令用于指定DNS服务器的IP地址。DNS服务器的主要工作是进行域名的解析,将域名映射为对应的IP地址。该指令的语法结构为:

1resolver address ... [valid=time];

address,DNS服务器的IP地址。如果不指定商品号,默认使用53端口。

time,设置数据包在网络中的有效时间。出现该指令的主要原因是,在访问站点时,有很多情况使得数据包在一定时间内不能被传递到目的地,但是又不能让该数据包无期限地存在,于是就需要设定一段时间,当数据包在这段时间内没有到达目的地,就会被丢弃,然后发送都会接收到一个消息,并决定是否要重发数据包。

使用该指令的一个例子如下:

1resolver 127.0.0.1 [::1}:5353 valid=30s

在实际应用中,一般不需要设置这么复杂,只要将DNS服务器的IP地址设置给该指令即可。

从Nginx1.1.7版本开始,该指令支持设置多个IP地址,从Nginx1.3.1开发版本和Nginx1.2.2稳定版本开始,该指令支持设置IPV6地址。

2.resolver_timeount指令

1resolver_timeount time;

该指令用于设置DNS服务器域名解析超时时间,语法结果为:

3.proxy_pass指令

该指令用于设置代理服务器的协议和地址,它不仅仅用于Nginx服务器的代理服务器,更主要的是应用于反向代理服务,我们马上就会谈及。该指令的语法结构为:

1proxy_pass URL;

其中,URL即为设置的代理服务器协议和地址。

在代理服务配置中,该指令的设置相对固定,因此在这里就不介绍其他细节了,具体内容在学习Nginx服务器的反向代理服务时再重点阐述。在代理服务配置中,该指令配置为:

1proxy_pass http://$http_host$request_uri;

其中,代理服务器协议设置为HTTP,httphost和request_uri两个变量是Nginx配置支持的用于自动获取主机和URI的变量。配置代理服务时,一般不要改变该指令的配置。

 正向代理服务使用示例

server
{
    resolver 8.8.8.8;
    listen 82;
    location /
    {
        proxy_pass http://$http_host$request_uri;
    }
}

实现的片段很简单,设置DNS服务器地址为8.8.8.8,使用默认的53号端口作为DNS服务器的服务端口,代理服务的监听端口设置为82端口,Nginx服务器接收到的所有请求都由第5行的location块进行过滤处理。

Nginx服务器代理服务使用的场合不多,从上一节的配置指令来看,功能也相对简单。在使用过程中,有一些需要注意的事项在这里说明一下。

首先,我们在上面提到过,设置Nginx服务器的代理服务器,一般是配置到一个server块中,注意,在该server块中,不要出现 server_name指令,即不要设置虚拟主机的名称或IP。而resolver指令是必需的,如果没有该指令,Nginx服务器无法处理接收到的域名。

其次,Nginx服务器的代理服务器不支持正向代理HTTPS站点。