nginx的正向代理
妍妍的宝贝 2024-07-25 08:37:06 阅读 81
目录
1 正向代理
1.1 使用正向代理的作用
1.2 Nginx正向代理实战
1.2.1 下载对应版本的nginx(源码编译)
1.2.2 下载 https 代理模块
1.2.3 使用https代理模块对源代码修改
1.2.4 源码安装
1.2.5 编写systemd 服务单元
1.2.6 修改nginx的主配置文件
1.2.7 定义子配置文件
1.2.8 在客户端机器上做测试
1.3 设置客户端指定代理服务器
1.3.1 Linux下
1.3.2 windows下
正向代理
正向代理,架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。
反向代理
反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。
1 正向代理
1.1 使用正向代理的作用
使用正向代理有多种目的和好处,主要包括但不限于以下几点:
访问控制与过滤:组织或公司可以利用正向代理作为访问互联网的唯一出口点,这样可以集中实施访问控制策略,过滤不适当的内容,或者限制对特定网站的访问,以提高网络安全和员工生产效率。
匿名性:正向代理可以隐藏客户端的真实IP地址,使得请求看起来像是从代理服务器发起的。这对于保护用户隐私,或者绕过基于IP的地理限制访问内容(如某些网站或服务仅对特定国家开放)非常有用。
缓存与加速:代理服务器可以缓存经常访问的网页或其他网络资源,当后续请求相同内容时,可以直接从缓存中快速提供,无需再次向原始服务器请求,从而加快访问速度,减少带宽消耗。
负载均衡与故障转移:虽然通常这是反向代理的功能,但正向代理也可以用于在多个后端服务器之间分配请求,以平衡负载,或者在某个服务器不可用时重定向请求至其他可用服务器。
合规性与审计:作为所有出站流量的单一出口点,正向代理可以用于记录和监控网络活动,帮助组织满足法规遵从性和审计需求。
突破网络限制:在存在严格网络限制的环境中(如学校、公司或某些国家),正向代理可以帮助用户访问原本被屏蔽的服务或内容。
节约带宽:通过压缩数据、去除重复内容等机制,正向代理有助于减少通过网络传输的数据量,特别是在带宽有限的网络环境中尤为重要。
正向代理通过提供额外的控制层、增强隐私保护、提升性能和协助遵守政策要求,为网络管理和用户访问提供了灵活性和便利性。
1.2 Nginx正向代理实战
代理服务器 192.168.239.137/24
客户端 192.168.239.155/24
nginx正向代理的功能
由于nginx正向代理的功能指令较少,只需要进行简单的配置即可
<code>server {
resolver 114.114.114.114; #指定DNS服务器IP地址
listen 8080;
location / {
proxy_pass http://$http_host$request_uri; #设定代理服务器的协议和地址
}
}
以上的配置只能访问80 端口的网站,而不能访问https443端口的网站,现在的网站基本上都是https的要解决技能访问http80端口也能访问https443端口的网站,需要置两个SERVER节点,一个处理HTTP转发,另一个处理HTTPS转发,而客户端都通过HTTP来访问代理,通过访问代理不同的端口,来区分HTTP和HTTPS请求。
由于原生 nginx 只支持 http 正向代理,为了 nginx 支持 https 正向代理,可以打 ngx_http_proxy_connect_module 补丁+ ssl 模块支持。
准备环境:
确保系统中安装了编译所需的工具和依赖,例如GCC、make、pcre-devel( pere 库 )、zlib-devel、openssl-devel(https)等。可以通过以下命令安装:
yum install gcc make pcre-devel zlib-devel openssl-devel
1.2.1 下载对应版本的nginx(源码编译)
(因为需要进行源代码编译)
<code>wget https://nginx.org/download/nginx-1.20.2.tar.gz
tar -zxvf nginx-1.15.12.tar.gz -C /usr/local/src
cd /usr/local/src
[root@web01 src] ls
nginx-1.20.2
[root@web01 src] cd nginx-1.20.2/
[root@web01 nginx-1.20.2] ll
总用量 796
drwxr-xr-x. 6 1001 1001 4096 6月 17 11:06 auto
-rw-r--r--. 1 1001 1001 312251 11月 16 2021 CHANGES
-rw-r--r--. 1 1001 1001 476577 11月 16 2021 CHANGES.ru
drwxr-xr-x. 2 1001 1001 168 6月 17 11:06 conf
-rwxr-xr-x. 1 1001 1001 2590 11月 16 2021 configure
drwxr-xr-x. 4 1001 1001 72 6月 17 11:06 contrib
drwxr-xr-x. 2 1001 1001 40 6月 17 11:06 html
-rw-r--r--. 1 1001 1001 1397 11月 16 2021 LICENSE
-rw-r--r--. 1 root root 438 6月 17 11:38 Makefile
drwxr-xr-x. 2 1001 1001 21 6月 17 11:06 man
drwxr-xr-x. 4 root root 187 6月 17 11:39 objs
-rw-r--r--. 1 1001 1001 49 11月 16 2021 README
drwxr-xr-x. 9 1001 1001 91 6月 17 11:06 src
扩展
Nginx 的源码目录下通过 make
命令完成编译过程后,会得到一个二进制可执行文件,通常命名为 nginx
。这个文件是在 objs
目录下生成的,它是 Nginx 的核心。
1.2.2 下载 https 代理模块
<code>[root@web01 src] yum install git
[root@web01 src] git clone https://github.com/chobits/ngx_http_proxy_connect_module
[root@web01 src] cd nginx-1.20.2
[root@web01 nginx-1.20.2] ls
auto CHANGES CHANGES.ru conf configure contrib html LICENSE Makefile man ngx_http_proxy_connect_module objs README src
[root@web01 src] ll ngx_http_proxy_connect_module/
总用量 108
-rw-r--r--. 1 root root 441 6月 17 11:05 config
-rw-r--r--. 1 root root 1499 6月 17 11:05 LICENSE
-rw-r--r--. 1 root root 64998 6月 17 11:05 ngx_http_proxy_connect_module.c
drwxr-xr-x. 2 root root 4096 6月 17 11:05 patch
-rw-r--r--. 1 root root 30373 6月 17 11:05 README.md
drwxr-xr-x. 2 root root 184 6月 17 11:05 t
当前目录ngx_http_proxy_connect_module
下包含了一些文件和子目录,这些内容是与Nginx的ngx_http_proxy_connect_module
第三方模块相关的。这个模块用于增强Nginx,使其支持HTTP CONNECT方法,从而能够作为正向代理处理SSL/TLS连接,尤其是对HTTPS流量的代理。
下面是列出的各文件和目录的简要说明:
config
:这是配置文件,用来定义编译该模块时的一些特定配置或宏定义。LICENSE
:包含该模块的许可协议信息。ngx_http_proxy_connect_module.c
:核心源代码文件,实现了模块的功能。patch
:这个子目录内包含了用于将该模块集成到Nginx源代码的补丁文件,README.md
:自述文件,通常会包含模块的简介、安装指南、配置示例等重要信息。t
:这个子目录可能包含一些测试脚本或示例,用于验证模块功能是否正常工作。
如果打算编译并安装这个模块到Nginx,一般流程包括:
阅读README.md
:了解详细的安装步骤、依赖关系以及任何特殊的配置要求。应用补丁:根据README.md
的指导,选择合适的补丁文件,并应用到Nginx源代码中。配置Nginx:在Nginx的./configure
命令中确保指定了该模块,例如,如果模块的配置文件或说明中有特定的--add-module
参数,需要在配置时加入。编译并安装Nginx:执行make
和make install
命令完成编译和安装。配置Nginx配置文件:在Nginx的配置文件(如nginx.conf
)中,根据模块的文档添加相应的配置指令以启用和配置HTTP CONNECT代理功能。
[root@web01 patch] ll /usr/local/src/ngx_http_proxy_connect_module/patch/
总用量 96
-rw-r--r--. 1 root root 9849 6月 17 11:05 proxy_connect_1014.patch
-rw-r--r--. 1 root root 9697 6月 17 11:05 proxy_connect.patch
-rw-r--r--. 1 root root 9408 6月 17 11:05 proxy_connect_rewrite_1014.patch
-rw-r--r--. 1 root root 9505 6月 17 11:05 proxy_connect_rewrite_101504.patch
-rw-r--r--. 1 root root 9496 6月 17 11:05 proxy_connect_rewrite_1015.patch
-rw-r--r--. 1 root root 9553 6月 17 11:05 proxy_connect_rewrite_1018.patch
-rw-r--r--. 1 root root 9306 6月 17 11:05 proxy_connect_rewrite_102101.patch
-rw-r--r--. 1 root root 9337 6月 17 11:05 proxy_connect_rewrite.patch
1.2.3 使用https代理模块对源代码修改
选择增加模块需要打补丁的版本
对 nginx 源码修改,这一步很重要,不然后面的 make 过不去
<code>[root@web01 patch] patch -d /usr/local/src/nginx-1.20.2 -p 1 < /usr/local/src/ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_1018.patch
patching file src/http/ngx_http_core_module.c
patching file src/http/ngx_http_parse.c
patching file src/http/ngx_http_request.c
patching file src/http/ngx_http_request.h
patching file src/http/ngx_http_variables.c
1.2.4 源码安装
指定安装的路径和关联的模块并且增加所需的模块
<code>[root@web01 nginx-1.20.2] ./configure --prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-file-aio --with-http_realip_module \
--add-module=/usr/local/src/ngx_http_proxy_connect_module/
[root@web01 nginx-1.20.2] make
[root@web01 nginx-1.20.2] make install
查看安装情况
[root@web01 ~] tree /usr/local/nginx/
/usr/local/nginx/
├── conf
│ ├── fastcgi.conf
│ ├── fastcgi.conf.default
│ ├── fastcgi_params
│ ├── fastcgi_params.default
│ ├── koi-utf
│ ├── koi-win
│ ├── mime.types
│ ├── mime.types.default
│ ├── nginx.conf # nginx主配置文件
│ ├── nginx.conf.default
│ ├── scgi_params
│ ├── scgi_params.default
│ ├── uwsgi_params
│ ├── uwsgi_params.default
│ └── win-utf
├── html
│ ├── 50x.html
│ └── index.html
├── logs
└── sbin
└── nginx # Nginx 的二进制可执行文件,这是通过源码编译得到的 nginx 可执行程序,可以直接在这个目录下通过 ./nginx 命令启动 Nginx 服务器
安装版本信息查看
[root@web01 ~] /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.20.2
built by gcc 11.4.1 20231218 (Red Hat 11.4.1-3) (GCC)
built with OpenSSL 3.0.7 1 Nov 2022
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --with-http_stub_status_module
--with-http_ssl_module --with-file-aio
--with-http_realip_module --add-module=/usr/local/src/ngx_http_proxy_connect_module/
1.2.5 编写systemd 服务单元
# 创建Nginx服务单元文件
# 注意:确保你具有足够的权限来编辑系统配置文件
# 使用Vim编辑器打开或创建nginx.service文件
# 该文件位于systemd系统服务文件的目录下
# 通常,这个目录是/usr/lib/systemd/system
[root@web01 ~] vim /usr/lib/systemd/system/nginx.service
# 开始写入Nginx服务单元文件的配置
# [Unit] 部分
[Unit]
# 描述Nginx服务
Description=nginx - high performance web server
# 提供Nginx官方文档的链接
Documentation=http://nginx.org/en/docs/
# 指定Nginx应该在network.target和remote-fs.target之后启动
After=network.target remote-fs.target nss-lookup.target
# [Service] 部分
[Service]
# 服务类型为forking,这意味着主进程会在后台运行,并可能产生子进程
Type=forking
# 指定PID文件的位置,这用于追踪Nginx主进程
PIDFile=/run/nginx.pid
# 启动前预检查Nginx配置文件的正确性
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
# 启动Nginx,指定配置文件的位置
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
# 重新加载Nginx配置时发送HUP信号给主进程
ExecReload=/bin/kill -s HUP $MAINPID
# 停止Nginx时发送QUIT信号给主进程
ExecStop=/bin/kill -s QUIT $MAINPID
# 设置私有临时文件系统
PrivateTmp=true
# [Install] 部分
[Install]
# 当multi-user.target目标激活时,Nginx服务应启动
WantedBy=multi-user.target
[Unit]
部分:
Description
定义了服务的描述,这里是 "nginx - high performance web server"。Documentation
提供了关于 Nginx 文档的 URL。After
列出了此服务依赖的其他目标,Nginx 应该在网络服务和远程文件系统挂载完成后才开始。
[Service]
部分:
Type=forking
表明这是一个 forking 类型的服务,意味着主进程会在后台运行并可能产生子进程。PIDFile
设置了用来跟踪主进程 PID 的文件位置。ExecStartPre
在启动服务前执行预启动检查,这里使用nginx -t
来测试配置文件的正确性。ExecStart
定义了启动 Nginx 的命令,指定了配置文件的位置。ExecReload
定义了重新加载 Nginx 配置的命令,使用HUP
信号。ExecStop
定义了停止 Nginx 的命令,使用QUIT
信号。PrivateTmp
设置了是否为服务提供私有临时文件系统。
[Install]
部分:
WantedBy
指定此服务应在 multi-user.target 这个目标实现时启动。
更新 systemd 的服务数据库
[root@web01 ~] systemctl daemon-reload
1.2.6 修改nginx的主配置文件
[root@web01 ~] vim /usr/local/nginx/conf/nginx.conf
nginx中定义pid的路径必须与编写服务的pid对应,不然会报错
使用include参数同时读取 /usr/local/nginx/conf.d/*.conf 文件 --子配置文件12
1.2.7 定义子配置文件
<code>[root@web01 ~] mkdir /usr/local/nginx/conf.d
[root@web01 ~] cd /usr/local/nginx/conf.d/
[root@web01 conf.d] vim aa.conf
server {
listen 38080;
# 解析域名
resolver 8.8.8.8;
# ngx_http_proxy_connect_module
proxy_connect;
proxy_connect_allow 443 563;
proxy_connect_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
location / {
proxy_pass $scheme://$http_host$request_uri;
}
}
listen 38080;
表示服务器监听38080端口接收请求。resolver 8.8.8.8;
配置DNS解析器,使用Google的公共DNS服务器进行域名解析。proxy_connect;
开启代理连接模块,通常用于处理HTTPS代理。proxy_connect_allow 443 563;
允许代理连接到443(HTTPS标准端口)和563(通常用于某些加密的实时通信协议)端口。proxy_connect_connect_timeout 10s;
,proxy_connect_read_timeout 10s;
,proxy_connect_send_timeout 10s;
分别设置了HTTPS代理连接的建立、读取和发送超时时间,均为10秒。location / { ... }
匹配所有请求,并使用proxy_pass
指令将请求代理到相同方案(HTTP或HTTPS)、相同主机和相同URI的地址。
请注意,
proxy_pass
语句中使用的变量$scheme
,$http_host
和$request_uri
是从请求中捕获的,这样可以保持原始请求的完整性,当转发请求到后端时,这些变量将被替换为实际的请求值。
将启动nginx二进制文件创建软链接
[root@web01 sbin] ln -s /usr/local/nginx/sbin/nginx /usr/sbin/nginx
检查语法是否正确
[root@web01 ~] nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
重启nginx
[root@web01 ~] systemctl start nginx 或者 [root@web01 ~] nginx -s reload
1.2.8 在客户端机器上做测试
代理服务器 192.168.239.137/24
客户端 192.168.239.155/24
使用
curl
命令行工具加上-I
选项时,请求获取的是目标网址的 HTTP 头信息,而不下载完整的页面内容。结合-v
选项,curl
会显示详细的交互过程,包括发送的请求和接收到的响应头信息。-x
选项用于指定一个 HTTP 代理服务器,格式为IP:port
。
执行命令
curl -I https://www.baidu.com -v -x 192.168.239.137:38080
将做以下事情:
发送一个 HEAD 请求到
https://www.baidu.com
。使用位于192.168.239.137
的代理服务器,端口号为38080
。显示详细的交互信息,包括curl
如何与代理服务器及目标服务器进行通信的细节。
HTTP
[root@LVS ~] curl -I http://www.baidu.com -v -x 192.168.239.137:38080
* Trying 192.168.239.137:38080...
* Connected to (nil) (192.168.239.137) port 38080 (#0)
> HEAD http://www.baidu.com/ HTTP/1.1
> Host: www.baidu.com
> User-Agent: curl/7.79.1
> Accept: */*
> Proxy-Connection: Keep-Alive
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Server: nginx/1.20.2
Server: nginx/1.20.2
< Date: Mon, 17 Jun 2024 08:47:58 GMT
Date: Mon, 17 Jun 2024 08:47:58 GMT
< Content-Type: text/html
Content-Type: text/html
< Content-Length: 277
Content-Length: 277
< Connection: keep-alive
Connection: keep-alive
< Accept-Ranges: bytes
Accept-Ranges: bytes
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Etag: "575e1f71-115"
Etag: "575e1f71-115"
< Last-Modified: Mon, 13 Jun 2016 02:50:25 GMT
Last-Modified: Mon, 13 Jun 2016 02:50:25 GMT
< Pragma: no-cache
Pragma: no-cache
<
* Connection #0 to host (nil) left intact
HTTPS(需要增加https代理模块才能使用)
[root@LVS ~] curl -I https://www.baidu.com -v -x 192.168.239.137:38080
* Trying 192.168.239.137:38080...
* Connected to (nil) (192.168.239.137) port 38080 (#0)
* allocate connect buffer!
* Establish HTTP proxy tunnel to www.baidu.com:443
> CONNECT www.baidu.com:443 HTTP/1.1
> Host: www.baidu.com:443
> User-Agent: curl/7.79.1
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 Connection Established
HTTP/1.1 200 Connection Established
< Proxy-agent: nginx
Proxy-agent: nginx
<
* Proxy replied 200 to CONNECT request
* CONNECT phase completed!
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /etc/pki/tls/certs/ca-bundle.crt
* CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.2 (IN), TLS handshake, Certificate (11):
* TLSv1.2 (IN), TLS handshake, Server key exchange (12):
* TLSv1.2 (IN), TLS handshake, Server finished (14):
* TLSv1.2 (OUT), TLS handshake, Client key exchange (16):
* TLSv1.2 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.2 (OUT), TLS handshake, Finished (20):
* TLSv1.2 (IN), TLS handshake, Finished (20):
* SSL connection using TLSv1.2 / ECDHE-RSA-AES128-GCM-SHA256
* ALPN, server accepted to use http/1.1
* Server certificate:
* subject: C=CN; ST=beijing; L=beijing; O=Beijing Baidu Netcom Science Technology Co., Ltd; CN=baidu.com
* start date: Jul 6 01:51:06 2023 GMT
* expire date: Aug 6 01:51:05 2024 GMT
* subjectAltName: host "www.baidu.com" matched cert's "*.baidu.com"
* issuer: C=BE; O=GlobalSign nv-sa; CN=GlobalSign RSA OV SSL CA 2018
* SSL certificate verify ok.
> HEAD / HTTP/1.1
> Host: www.baidu.com
> User-Agent: curl/7.79.1
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Accept-Ranges: bytes
Accept-Ranges: bytes
< Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
< Connection: keep-alive
Connection: keep-alive
< Content-Length: 277
Content-Length: 277
< Content-Type: text/html
Content-Type: text/html
< Date: Mon, 17 Jun 2024 08:34:49 GMT
Date: Mon, 17 Jun 2024 08:34:49 GMT
< Etag: "575e1f71-115"
Etag: "575e1f71-115"
< Last-Modified: Mon, 13 Jun 2016 02:50:25 GMT
Last-Modified: Mon, 13 Jun 2016 02:50:25 GMT
< Pragma: no-cache
Pragma: no-cache
< Server: bfe/1.0.8.18
Server: bfe/1.0.8.18
<
* Connection #0 to host (nil) left intact
为了让的系统能够通过正向代理服务器访问外网,可以按照以下步骤分别针对 yum
、wget
和全局环境变量进行配置:
1.3 设置客户端指定代理服务器
1.3.1 Linux下
1. 配置 yum 使用正向代理
编辑 /etc/yum.conf
文件并添加代理信息:
vim /etc/yum.conf
在文件中添加以下行:
proxy=http://192.168.239.137:38080
或者,如果想同时配置 FTP 代理,可以添加:
proxy=http://192.168.239.137:38080
proxy=ftp://192.168.239.137:38080
2. 配置 wget 使用正向代理
编辑 /etc/wgetrc
文件并添加代理信息:
vim /etc/wgetrc
在文件中添加以下行:
http_proxy=192.168.239.137:38080
如果代理服务器同时支持 HTTPS,可以添加:
http_proxy=192.168.239.137:38080
https_proxy=192.168.239.137:38080
3. 配置全局环境变量以使用正向代理
编辑 /etc/profile
文件并添加代理环境变量:
vim /etc/profile
在文件中添加以下行:
http_proxy=192.168.239.137:38080
https_proxy=192.168.239.137:38080
ftp_proxy=192.168.239.137:38080
接下来,导出这些环境变量:
export http_proxy
export https_proxy
export ftp_proxy
为了使这些更改立即生效,需要重新加载 /etc/profile
文件:
source /etc/profile
1.3.2 windows下
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。