nginx 的http_proxy_connect_module模块使用

文档说明: 只记录关键地方; 2022-08-11;

目的: 为了解决同步 chromium 源码问题

原理: 此模块实现了 HTTP 协议中的 CONNECT 方法

要求:

需要清楚 隧道 和 代理区别;
通常它俩都是结合使用,也可以分开使用 。
通常用SSL/TLS保证隧道安全

使用 免安装 nginx 、socat 运行时 无需容器运行环境

免安装的 nginx 运行时(已包含http_proxy_connect_module 模块)
免安装的 socat 运行时


curl -L https://gitee.com/jingjingxyk/quickstart-nginx-php-fpm/raw/main/setup-nginx-runtime.sh | bash 
 
curl -L https://github.com/jingjingxyk/build-static-socat/blob/main/setup-socat-runtime.sh?raw=true | bash -s --

使用 docker-compose 启动 nginx 服务端

域名证书,域名证书创建参考: https://www.cnblogs.com/jingjingxyk/p/16830714.html

容器镜像生成参考: https://github.com/jingjingxyk/ngx_http_proxy_connect_module/tree/main/docker/alpine/nginx

version: "3"
services:
    nginx-proxy:
        image: docker.io/jingjingxyk/nginx:alpine-1.21.1-connect-proxy-20221028T0546Z
        ports:
            - "8017:8017/tcp"
        container_name: nginx
        restart: always
        volumes:
            - ./default.conf:/usr/local/nginx/etc/conf.d/default.conf
            - ./tls:/tls 

nginx的配置文件 default.conf

# CONNECT HOST 允许通过代理的域名
map $host $allow_proxy_domain_flag {
       default 0;
       ~^([\w|-]+?)\.googlesource\.com$ 1;
       ~^([\w|-]+?)\.googleapis\.com$ 1;
       chrome-infra-packages.appspot.com 1;
       http-proxy.xiaoshuogeng.com 1; # 为了这个commondatastorage.googleapis.com 下载地址不报错
       ssl.google-analytics.com 1;    # 为了下载不报错,加上这个地址,按说这个地址不需要(解决这个问题的命令是: NO_PROXY=ssl.google-analytics.com )
}

server {

    listen 8017 ssl http2   ;
    server_name http-proxy.xiaoshuogeng.com;

    charset utf-8;

    ssl_certificate     /tls/wildcard.xiaoshuogeng.com.fullchain.pem;
    ssl_certificate_key /tls/wildcard.xiaoshuogeng.com.key.pem;
    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;  # about 40000 sessions
    ssl_session_tickets off;

    ssl_protocols  TLSv1.3;
    ssl_prefer_server_ciphers off;
    # dns resolver used by forward proxying
    resolver  1.0.0.1 1.0.0.2 1.0.0.3 1.1.1.1  ipv6=off;

    # 判断请求方法是否 connect
    if ( $request_method != "CONNECT" ) {
         return 405 '{"status":"405","result":"请求方法不允许","message":"405"}';
    }
    # 判断域名是否允许通过
    if ( $allow_proxy_domain_flag != 1  ) {
         return 403 '{"status":"403","result":"域名不允许通过","message":"403"}';
    }

    proxy_connect;
    proxy_connect_allow all;
    proxy_connect_connect_timeout 600s;
    proxy_connect_read_timeout 75s;
    proxy_connect_send_timeout 75s;
}

阻止服务被滥用的办法: nginx IP地址白名单机制

在nginx的 default.conf 文件中添加如下配置
IP 白名单机制
下面介绍2种方法

# 方法一: 

# 允许通过的白名单
map $remote_addr $allow_client_ip_flag {
     default 0;
    '42.83.144.13'   1;
}



# 白名单以外的IP地址处理逻辑
if ( $allow_client_ip_flag != 1) {
     return 403 '{"status":"403","result":"ip is refused","message":"403"}';
}


# 方法二:

    allow 192.168.1.0/24;
    allow 10.0.0.0/8;
    allow 172.16.0.0/12;

    allow 42.83.144.13;
    deny all;

本地使用 nginx 提供的代理服务方式一:

如果用不了,很大原因是:你的 socat 版本低,不支持相关参数
那么请选择使用方式二


socat -d -d   TCP4-LISTEN:8016,reuseaddr,fork ssl:http-proxy.xiaoshuogeng.com:8017,verify=1,snihost=http-proxy.xiaoshuogeng.com,commonname=http-proxy.xiaoshuogeng.com,openssl-min-proto-version=TLS1.3,openssl-max-proto-version=TLS1.3


本地使用 nginx 提供的代理服务方式二:

version: "3"
services:
  socat-http-proxy-8016:
    image: registry.cn-beijing.aliyuncs.com/jingjingxyk-public/app:socat-alpine-20221018T1839Z
    restart: always
    container_name: socat-http-proxy-8016
    ports:
        - "8016:8016"
    command:
      - /bin/sh
      - -c
      - |
        socat -d -d   TCP4-LISTEN:8016,reuseaddr,fork ssl:http-proxy.xiaoshuogeng.com:8017,verify=1,snihost=http-proxy.xiaoshuogeng.com,commonname=http-proxy.xiaoshuogeng.com,openssl-min-proto-version=TLS1.3,openssl-max-proto-version=TLS1.3


docker-compose 启动、关闭、查看日志的命令

# 启动
docker-compose -f docker-compose.yaml up -d 
# 关闭
docker-compose -f docker-compose.yaml down --remove-orphans
# 查看日志
docker-compose -f docker-compose.yaml logs -f 

现在可以下载chromium 相关源码了


export http_proxy=http://127.0.0.1:8016
export https_proxy=http://127.0.0.1:8016
export no_proxy="127.0.0.1,localhost,ssl.google-analytics.com"

git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git --depth=1 --progress

额外相关项: window 下使用socat

当然也可以使用虚拟机 比如virtualbox

  1. 安装msys2
  2. msys2环境下安装依赖 pacman -Sy gcc make openssl-devel
  3. 下载socat最新源码包 (http://www.dest-unreach.org/socat/download/)
  4. 编译 socat
  5. tar -zxvf socat-1.7.4.4.tar.gz
  6. cd socat-1.7.4.4
  7. ./configure
  8. make
  9. make install
  10. 就可以使用socat了
  11. socat-1.7.4.4.tar.gz 源码镜像地址:https://www.jingjingxyk.com/cloud-soft/socat-1.7.4.4.tar.gz

参考文档

  1. 使用NGINX作为HTTPS正向代理服务器
  2. ngx_http_proxy_connect_module
  3. nginx 允许特定的地址被代理
  4. nginx TLSv1.3配置
  5. tengine proxy_connect
  6. alpine http_proxy_connect 容器打包步骤
  7. nginx端口复用
  8. 已经构建好的docker镜像 nginx connect-proxy
  9. 拷贝容器镜像内的文件到容器外
  10. Nginx与安全有关的几个配置
  11. Nginx的几个常用配置和技巧
  12. 使用acme.sh签发Let's Encrypt 的SSL证书
  13. 构建能让socat支持TLSv.13特性的容器环境
  14. nginx http 通用配置
  15. 保留的 IP 地址
  16. 判断某个IP是公共IP还是保留IP
  17. IPV4的保留地址汇总
  18. 私有网络IP地址段
  19. socat
  20. msys2
  21. MSYS2 镜像
  22. MSYS2 镜像
  23. 虚拟机有哪些?PVE qemu kvm VirtualBox Harvester
  24. 一篇文章让你彻底弄懂SSL/TLS协议

实践文档

  1. 在线的同步chromium源码的服务实例
  2. 在线的http代理配置实例文档
  3. 自建拉取registry.k8s.io、k8s.gcr.io、gcr.io、quay.io、ghcr.io 容器镜像的服务
  4. 快速下载chromium源码
  5. 快速下载webRTC源码

法律法规

  1. 立法禁止非法使用网络地址自动切换系统
  2. 中华人民共和国反电信网络诈骗法
  3. 中华人民共和国网络安全法
  4. 中华人民共和国反电信网络诈骗法
  5. 帮信罪
  6. 破坏计算机信息系统犯罪
  7. 中华人民共和国个人信息保护法
  8. 互联网信息服务管理办法
posted @ 2022-08-11 20:46  jingjingxyk  阅读(2563)  评论(0编辑  收藏  举报