首页

基于nginx正向代理访问外网

kkcode
2023-07-31  阅读 517

前言

正向代理服务器的作用是将客户端请求转发给其他服务器,并将响应返回给客户端。使用正向代理服务器可以隐藏客户端的真实IP地址,提高访问速度和安全性。

以下是使用Nginx作为正向代理服务器的配置示例。

配置nginx正向代理

前提是你已经安装的nginx,如果没有安装请自行Google或百度。

http {
    # 定义代理服务器列表
    upstream backend {
        server 10.0.0.1:80;
        server 10.0.0.2:80;
    }

    # 定义代理服务器
    server {
        listen 80;

        # 定义代理服务器名称
        server_name proxy.example.com;

        # 定义日志文件
        access_log /var/log/nginx/proxy_access.log;
        error_log /var/log/nginx/proxy_error.log;

        # 定义代理配置
        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}复制代码

测试代理服务器

保存配置文件并重新加载Nginx:

sudo systemctl reload nginx复制代码

接下来,可以使用curl命令测试代理服务器。例如:

curl --proxy http://proxy.example.com:80 http://www.example.com

# 示例:
curl -x http://proxy.example.com:80 http://www.baidu.com复制代码

其中,--proxy参数指定代理服务器的地址和端口号,后面跟随需要代理的URL地址。在上面的示例中,代理服务器名称为proxy.example.com,端口号为80。--proxy可简写为-x

如果一切正常,应该能够看到来自代理服务器的响应。但是如果你去请求https://www.baidu.com可能不行。因为nginx默认不支持https的代理。ngx_http_proxy_connect_module 模块可以实现隧道SSL请求的代理服务器

让nginx支持https

nginx安装ngx_http_proxy_connect_module模块,目前该模块截止2023-04-14插件支持的版本 file

我的nginx为nginx/1.20.1,因此下载 proxy_connect_rewrite_1018.patch为补丁包

[root@web root] wget https://d.frps.cn/file/tools/nginx/model/ngx_http_proxy_connect_module.tar.gz
[root@web root] tar xf ngx_http_proxy_connect_module.tar.gz   #解压复制代码

安装patch命令

yum install -y patch复制代码

进入nginx源码目录,修改编译参数

[root@web nginx-1.20.1]# patch -p1 < /root/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复制代码

如果没有安装nginx,请使用下面的命令进行编译安装:

./configure --prefix=/opt/nginx-1.20 --with-openssl=/usr/local/src/openssl-1.1.1t  --with-pcre=/usr/local/src/pcre-8.45  --with-zlib=/usr/local/src/zlib-1.2.13  --with-http_ssl_module --with-http_stub_status_module --with-stream --with-http_stub_status_module --with-http_gzip_static_module  --add-module=/root/ngx_http_proxy_connect_module
#编译安装
make && make install
#--add-module=/root/ngx_http_proxy_connect_module 模块目录(注意指定目录!)复制代码

如果安装的nginx,请参考这篇文章:Nginx 装好后,追加模块

创建验证文件

http {
    # 定义代理服务器列表
    upstream backend {
        server 10.0.0.1:80;
        server 10.0.0.2:80;
    }

    # 定义代理服务器
    server {
        listen 80;
        listen 443;
        # 定义代理服务器名称
        server_name proxy.example.com;

        proxy_connect;                          #启用 CONNECT HTTP方法
        proxy_connect_allow            443 80;  #指定代理CONNECT方法可以连接的端口号或范围的列表
        proxy_connect_connect_timeout  20s;     #定义客户端与代理服务器建立连接的超时时间
        proxy_connect_read_timeout     20s;     #定义客户端从代理服务器读取响应的超时时间
        proxy_connect_send_timeout     20s;     #设置客户端将请求传输到代理服务器的超时时间

        # 定义日志文件
        access_log /var/log/nginx/proxy_access.log;
        error_log /var/log/nginx/proxy_error.log;

        # 定义代理配置
        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}复制代码

如果一切正常的话,应该支持https了,测试结果如下:

file

如果还不正常,欢迎讨论。

参考

  1. nginx正向代理http, https亲测可用
  2. Nginx Ngx_http_proxy_connect_module模块实现SSL正向代理
  3. Nginx 装好后,追加模块
  4. nginx正向代理http和https
  5. nginx正向代理的配置和使用
  6. webman作为http代理服务器
本文为作者原创文章,转载无需和我联系,但请注明转载链接。 【前端黑猫】
排序: 时间 投票
server{
      listen 9999;

      resolver 8.8.8.8 114.114.114.114 223.5.5.5;

      proxy_connect;
      proxy_ignore_client_abort on;
      proxy_connect_allow            443 563;
      proxy_connect_connect_timeout  10s;
      proxy_connect_read_timeout     10s;
      proxy_connect_send_timeout     10s;

      location / {
          proxy_pass http://$host;
          proxy_set_header Host $host;
          #proxy_pass $scheme://$host$request_uri;
      }

      access_log  /www/wwwlogs/access-proxy.log;
    }
2023-09-13 回复