赞
踩
目录
正向代理,架设在客户机与目标主机之间,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中。
反向代理
反向代理服务器架设在服务器端,通过缓冲经常被请求的页面来缓解服务器的工作量,将客户机请求转发给内部网络上的目标服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器与目标主机一起对外表现为一个服务器。
使用正向代理有多种目的和好处,主要包括但不限于以下几点:
访问控制与过滤:组织或公司可以利用正向代理作为访问互联网的唯一出口点,这样可以集中实施访问控制策略,过滤不适当的内容,或者限制对特定网站的访问,以提高网络安全和员工生产效率。
匿名性:正向代理可以隐藏客户端的真实IP地址,使得请求看起来像是从代理服务器发起的。这对于保护用户隐私,或者绕过基于IP的地理限制访问内容(如某些网站或服务仅对特定国家开放)非常有用。
缓存与加速:代理服务器可以缓存经常访问的网页或其他网络资源,当后续请求相同内容时,可以直接从缓存中快速提供,无需再次向原始服务器请求,从而加快访问速度,减少带宽消耗。
负载均衡与故障转移:虽然通常这是反向代理的功能,但正向代理也可以用于在多个后端服务器之间分配请求,以平衡负载,或者在某个服务器不可用时重定向请求至其他可用服务器。
合规性与审计:作为所有出站流量的单一出口点,正向代理可以用于记录和监控网络活动,帮助组织满足法规遵从性和审计需求。
突破网络限制:在存在严格网络限制的环境中(如学校、公司或某些国家),正向代理可以帮助用户访问原本被屏蔽的服务或内容。
节约带宽:通过压缩数据、去除重复内容等机制,正向代理有助于减少通过网络传输的数据量,特别是在带宽有限的网络环境中尤为重要。
正向代理通过提供额外的控制层、增强隐私保护、提升性能和协助遵守政策要求,为网络管理和用户访问提供了灵活性和便利性。
代理服务器 192.168.239.137/24
客户端 192.168.239.155/24
nginx正向代理的功能
由于nginx正向代理的功能指令较少,只需要进行简单的配置即可
- 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
(因为需要进行源代码编译)
- 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 的核心。
- [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源代码中。./configure
命令中确保指定了该模块,例如,如果模块的配置文件或说明中有特定的--add-module
参数,需要在配置时加入。make
和make install
命令完成编译和安装。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
选择增加模块需要打补丁的版本
对 nginx 源码修改,这一步很重要,不然后面的 make 过不去
- [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
指定安装的路径和关联的模块并且增加所需的模块
- [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/
- # 创建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
[root@web01 ~] vim /usr/local/nginx/conf/nginx.conf
nginx中定义pid的路径必须与编写服务的pid对应,不然会报错
使用include参数同时读取 /usr/local/nginx/conf.d/*.conf 文件 --子配置文件12
- [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
代理服务器 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. 配置 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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。