使用Nginx做正向代理

news/2025/2/11 22:27:57/文章来源:https://www.cnblogs.com/dayuchen/p/18710596

使用nginx做正向代理

https://github.com/chobits/ngx_http_proxy_connect_module

HTTP/HTTPS代理服务器

nginx作为一个反向代理工具,刚开始的时候是不支持正向代理的, 后来支持了。代理本身不复杂 ,有一个难点在于如何加密https的流量。解决这个问题有两种方法。

  1. 代理服务器不处理加密

    它在客户机和服务器之间建立一个TUNNEL, 客户机然后直接与服务器通信。本文件讨论的nginx正向代理都用的是这种不解密的方式。

  2. “中间人”代理服务器,Man-in-the-Middle (MITM):

    代理服务器用一个自签名的证书完成与客户机的TLS handshake,然后转头再去和服务器完成TLS 握手。 在这种配置中, 代理服务器上用的那个自签名证书的CA得被客户机信任。 这种代理通常以Web Gateway的方式存在企业环境中,对用户来说是透明的,用户也不需要配置客户机的代理服务器环境变量或者相关配置。

Nginx提供了两种方案来解决这个问题, 即L7和L4方案。

HTTP CONNECT (L7 方案)

Nginx设计出来是做反向代理的,所以它天生不支持HTTP CONNECT这个Method, github上有个大哥写了这么个插件 https://github.com/chobits/ngx_http_proxy_connect_module,需要通过编译的方式来安装nginx.

  1. 下载nginx源码

  2. 下载ngx_http_proxy_connect_module源码

  3. 根据nginx的版本patch connect module中带的指定patch文件,这在github的Readme中有说明,比如本文举例子用的nginx-1.16.1对应的是 proxy_connect_rewrite_101504.patch

    $ cd /root
    $ git clone https://github.com/chobits/ngx_http_proxy_connect_module
    $ wget http://nginx.org/download/nginx-1.16.1.tar.gz
    $ tar zxvf nginx-1.16.1.tar.gz
    $ cd nginx-1.16.1
    $ patch -p1 < ../ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_101504.patch
    
  4. 编译时指定connect module的源码位置

    $ yum update
    $ yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel#添加用户和组
    $ groupadd www
    $ useradd -g www www
    $ cd /root/nginx-1.16.1
    $ ./configure \
    --user=www \
    --group=www \
    --prefix=/usr/local/nginx \
    --with-http_ssl_module \
    --with-http_stub_status_module \
    --with-http_realip_module \
    --with-threads \
    --add-module=/root/ngx_http_proxy_connect_module## 如果已经有nginx环境了,可以不执行make install, make之后把./objs/nginx二进行文件拷贝出来就能用, 执行nginx -V可以显示编译的参数
    $ make && make install
  5. nginx.conf 的配置样例

    server {listen  8001;# dns resolver used by forward proxyingresolver  114.114.114.114;# forward proxy for CONNECT requestproxy_connect;proxy_connect_allow            443;proxy_connect_connect_timeout  10s;proxy_connect_read_timeout     10s;proxy_connect_send_timeout     10s;# forward proxy for non-CONNECT requestlocation / {proxy_pass http://$host;proxy_set_header Host $host;}}
    
    1. 测试
    ## 在局域网中找另外一台机器,执行下面的命令, 把http://192.168.1.100:8001配置到环境变量里面就可以正常工作了
    curl https://www.baidu.com -svo /dev/null -x 192.168.1.100:8001About to connect() to proxy 192.168.1.100 port 8001 (#0)
    *   Trying 192.168.1.100...
    * Connected to 192.168.1.100 (192.168.1.100) port 8001 (#0)
    * 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.29.0
    > Proxy-Connection: Keep-Alive
    >
    < HTTP/1.1 200 Connection Established
    < Proxy-agent: nginx
    <
    * Proxy replied OK to CONNECT request
    * Initializing NSS with certpath: sql:/etc/pki/nssdb
    *   CAfile: /etc/pki/tls/certs/ca-bundle.crtCApath: none
    * SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
    * Server certificate:
    *     subject: CN=baidu.com,O="Beijing Baidu Netcom Science Technology Co., Ltd",OU=service operation department,L=beijing,ST=beijing,C=CN
    ...
    > GET / HTTP/1.1
    > User-Agent: curl/7.29.0
    > Host: www.baidu.com
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    ...

NGINX Stream (L4方案)

在L4方案中, nginx可以做透明代理, nginx需要的编译模块和L7的不一样, 不需要下载connect module,只需要下载nginx的源码,并使用以下

  1. 编译参数
$ ./configure \
--user=www \
--group=www \
--prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_realip_module \
--with-threads \
--with-stream \
--with-stream_ssl_preread_module \
--with-stream_ssl_module
  1. nginx.conf 配置例
stream {resolver 114.114.114.114;server {listen 443;ssl_preread on;proxy_connect_timeout 5s;proxy_pass $ssl_preread_server_name:$server_port;}
}
  1. DNS劫持

使用这个“代理”需要使用DNS的力量, 把需要走代理的域名解析到nginx代理所在的服务器地址。PS: 这个用法好奇怪 ,不知道在啥环境下能用起来。

注册nginx到Systemd

vi /etc/systemd/system/nginx.service[Unit]
Description=The NGINX HTTP and reverse proxy server
After=network.target[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx      # Nginx 可执行文件的路径
ExecReload=/usr/local/nginx/sbin/nginx  -s reload
ExecStop=/usr/local/nginx/sbin/nginx  -s stop
PIDFile=/var/run/nginx.pid          # Nginx 的 PID 文件路径
PrivateTmp=true[Install]
WantedBy=multi-user.target

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/882286.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题解:SP6517 JOCHEF - Farmer Sepp

怎么题解全是 dp?可以用笛卡尔树啊!笛卡尔树的介绍 笛卡尔树,是一种二叉搜索树,它满足如下条件:每个节点的编号满足二叉搜索树的性质。 每个节点的权值满足小根堆或大根堆的性质。大概是这个样子:笛卡尔树的建树 请看这里。 笛卡尔树的用途 它可以用来解决区间最值问题,…

4.1 内存的物理机制很简单

内存实际上是一种名为内存IC的电子元件。 内存IC中有电源、地址信号、数据信号、控制信号等用于输入输出的大量引脚(IC的引脚),通过为其指定地址,来进行数据的书写。 虽然这是一个虚拟的内存IC,但他的引脚和实际的内存IC是一样的。1024=1K 8位=1字节 计算机使用的内存IC中…

洛谷P1191 矩形 题解

笛卡尔树的介绍 笛卡尔树,是一种二叉搜索树,它满足如下条件:每个节点的编号满足二叉搜索树的性质。 每个节点的权值满足小根堆或大根堆的性质。大概是这个样子:笛卡尔树的建树 请看这里。 笛卡尔树的用途 它可以用来解决区间最值问题,它有一个重要性质:当这个笛卡尔树为小…

洛谷P2701 [USACO5.3] 巨大的牛棚Big Barn 题解

怎么题解全是清一色的 dp?可以用笛卡尔树啊(虽然麻烦了很多,但是我热爱)!笛卡尔树的介绍 笛卡尔树,是一种二叉搜索树,它满足如下条件:每个节点的编号满足二叉搜索树的性质。 每个节点的权值满足小根堆或大根堆的性质。大概是这个样子:笛卡尔树的建树 请看这里。 笛卡尔…

告别 DeepSeek 系统繁忙,七个 DeepSeek 曲线救国平替入口,官网崩溃也能用!

前言 DeepSeek作为一款备受瞩目的国产大模型,以其强大的功能和卓越的性能赢得了众多用户的青睐。然而,随着用户量的激增,DeepSeek官网近期频繁遭遇服务器繁忙甚至崩溃的问题,给广大用户带来了不小的困扰。面对这一现状,许多用户急于寻找能够替代或绕过官网限制的方法,以继…

第一章笔记

1.2CPU是寄存器的集合体 程序是把寄存器作为对象来描述的。 通常我们将汇编语言编写的程序转化成机器语言的过程称为汇编;反之,机器语言程序转化成汇编语言程序的过程则称为反汇编。 汇编语言采用助记符(memonic)来编写程序,每一个原本是电气信号的机器语言 指令都会有一个…

ARC191 192 题解

ARC191 题解 A - Replace Digits简要题意给定一个长为 \(n\) 的字符串 \(a\)。\(m\) 次操作,第 \(k\) 次给定一个字符 \(b_k\),你需要选择一个 \(i \in [1, n]\) 并将 \(a_i\) 替换成 \(b_k\)。 求最后能得到的所有字符串中,字典序最大的是什么。 \(1 \leq n, m \leq 10^6\)…

最近,测试的招聘市场已经疯掉了…

这是我入行测试的第1007天,门槛低,技术难度不高,食物链最底端。出现严重的bug,首先背锅的就是测试...📝 博主首页 : 「码上生花」 ,同名公众号 :「伤心的辣条」📝 面试求职: 「面试试题小程序」 ,内容涵盖 测试基础、Linux操作系统、MySQL数据库、Web功能测试、接口…

P1083 [NOIP 2012 提高组] 借教室(差分)

说实话竟然没想到还能这样差分,这道题我们需要二分查找m个订单,对于每次二分用一次差分,然后看如果只考虑1到mid个订单是否会出现教室不够用的情况,如果够用说明导致教室不够用的订单在后面,应该让begin=mid+1;反之让end-1;其实这道题就是让我们找第一个出现教室不够用的…

来吃糖

先放犯错后 be like:1 return // 倍增求 lca int bfs(int x) {queue<int> q;q.push(x);dep[x] = 1;while (q.size()) {x = q.front(), q.pop();for (auto it : G[x]) {int y = it.first, z = it.second;if (dep[y]) continue;dep[y] = dep[x] + 1;d[0][y] = z;f[0][y] =…

P9330 [JOISC 2023] JOI 国的节日 2 题解

Description 对于以下问题:给定长度为 \(n\) 的序列 \(a\)、\(b\),满足以下条件:在序列 \(a\) 与序列 \(b\) 中,\(1\) 到 \(2n\) 的整数各出现恰好一次; 对于 \(1\leq i\leq n\),\(a_i<b_i\); 对于 \(1\leq i<n\),\(a_i<a_{i+1}\)。求:最多能在 \([a_i,b_i]\…

一站式合同自动化:飞书审批与腾讯电子签的完美融合

Z国际教育中心专注于将全球顶尖教育资源引入中国,通过本地化整合与优化,将这些优质资源转化为中国青年触手可及的学习机会。我们的使命是帮助学生培养深厚的家国情怀与开阔的国际视野,助力他们成长为未来社会的栋梁之才。 遇到的问题 1. 业务种类多,合同审批繁琐 通过飞书平…