nginx正向代理https

Posted hobby云说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nginx正向代理https相关的知识,希望对你有一定的参考价值。

在上一篇讲解了ng正向代理的种类,本篇将着重介绍如何配置。

http connect 隧道

七层解决方案是在应用层来进行解决的,并不存在对数据包进行解密的一个过程。它需要通过http connect来建立一个隧道(通俗理解就是一个指定的用来连接的通道),这里需要在客户端配置https代理服务器的ip和端口

具体连接过程如下:

1、客户端给代理服务器发送http connect请求,并将要访问的url一并发给代理服务器;

2、代理用客户端发来的url去到dns服务器找到对应的ip,连上443端口;

3、代理连上服务端443端口后,给客户端发送一个HTTP/1.1 200 Connection Established(即http200响应);

4、此时客户端和代理服务器成功建立一个http connect隧道;

5、客户端发送https流量给到代理服务器,代理服务器直接将此https流量直接发送给到服务器;

至此,整个七层的http connect隧道就建立成功,换句话说就是成功搭建了nginx正向代理https服务。

流程图如下:

nginx正向代理https七层方案配置

在前言已跟大家介绍,nginx官方并未提供http connect方法,但是github上已有相关模块,可以自行下载安装ngx_http_proxy_connect_module

【添加gx_http_proxy_connect_module模块步骤】

对于已经编译安装完的nginx环境,加入此模块步骤如下

# 确定已安装git应用

[root@hobby ~]# yum install -y git

# git上下载此模块

[root@hobby ~]# git clone https://github.com/chobits/ngx_http_proxy_connect_module.git

# 确定模块下载存放的路径

[root@hobby ngx_http_proxy_connect_module]# pwd

/root/ngx_http_proxy_connect_module

# 停止nginx

[root@hobby ~]# systemctl stop nginx.

# 备份原nginx执行

[root@hobby ~]# cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

# 进到nginx源代码文件夹

[root@hobby ~]# cd /root/nginx-1.16.0

# 然后生成makefile,为编译做准备

[root@hobby nginx-1.16.0]# ./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

# 进行编译,切记,不要安装,即不要make install

[root@hobby nginx-1.16.0]# make

# 将生成的nginx可执行文件拷贝到原来的位置,覆盖原来的文件

[root@hobby nginx-1.16.0]# cp objs/nginx /usr/local/nginx/sbin/nginx

【七层方案nginx.conf文件配置】

server {

listen 443 ssl;

resolver 114.114.114.114;

proxy_connect;

proxy_connect_allow           443;

proxy_connect_connect_timeout  10s;

proxy_connect_read_timeout     10s;

proxy_connect_send_timeout     10s;

 

    location / {

            proxy_pass https://$host;

            proxy_set_header Host $host;

        }

}

【中间人代理】

从传输层透传应用层的流量,那么可不可以不建立http connect,将域名直接dns解析到代理服务器呢?随着时代的变迁,技术的发展,nginx的更新,这一切当然是可以的~

nginx自战斗民族的老铁2004年发布以来,一直在不断的进步,到1.9.0版本开始支持ngx_stream_ssl_module模块了,编译安装并不会默认安装,需要带上--with-streamyum会默认安装这个模块。

那么这个时候问题来了,没了http connect,要怎么做呢?首先,在内网中,将dns域名解析到代理服务器上,这个时候你会问,解析到代理服务器上?客户端发送的可是https流量,代理没有ca证书,怎么解开?怎么可能读取https里面的信息呢?这个问题问的非常有水平,作为一名还未入流的白帽子,第一想法就是,既然没有,那就造一个噻。代理服务器和客户端商量好,你只要信任我的证书,直接把https流量发送给我,我帮你(假装是你)传达给你想传达但又没法直接传达的人(即服务端)。至于如何自建ca证书,请移步这里:

具体流程请看下图:

【中间人代理https配置】

server {

    listen 443 ssl;

    server_name scwipe.cn;

           ssl_certificate     /etc/nginx/ca/scwipe.pem;

           ssl_certificate_key /etc/nginx/ca/scwipe.key;

 

           ssl_protocols    SSLv3 TLSv1 TLSv1.1 TLSv1.2;

 

           ssl_ciphers      ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;

           ssl_prefer_server_ciphers on;

           ssl_session_timeout  10m;

           ssl_session_cache shared:SSL:10m;

           ssl_session_tickets off; # Requires nginx >= 1.5.9

 

 

        location / {

            proxy_redirect https://scwipe.cn/    /;

            proxy_pass https://scwipe.cn;

            proxy_set_header Host $host;

            proxy_set_header X-Real-IP $remote_addr;

            proxy_set_header REMOTE-HOST $remote_addr;

            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        }

}


以上是关于nginx正向代理https的主要内容,如果未能解决你的问题,请参考以下文章

nginx实战 正向代理支持https

nginx正向代理配置

nginx实现正向代理和反向代理

nginx正向代理

NGINX学习--nginx做正向代理

nginx 正向代理