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
- 安装msys2
- msys2环境下安装依赖 pacman -Sy gcc make openssl-devel
- 下载socat最新源码包 (http://www.dest-unreach.org/socat/download/)
- 编译 socat
- tar -zxvf socat-1.7.4.4.tar.gz
- cd socat-1.7.4.4
- ./configure
- make
- make install
- 就可以使用socat了
- socat-1.7.4.4.tar.gz 源码镜像地址:https://www.jingjingxyk.com/cloud-soft/socat-1.7.4.4.tar.gz
参考文档
- 使用NGINX作为HTTPS正向代理服务器
- ngx_http_proxy_connect_module
- nginx 允许特定的地址被代理
- nginx TLSv1.3配置
- tengine proxy_connect
- alpine http_proxy_connect 容器打包步骤
- nginx端口复用
- 已经构建好的docker镜像 nginx connect-proxy
- 拷贝容器镜像内的文件到容器外
- Nginx与安全有关的几个配置
- Nginx的几个常用配置和技巧
- 使用acme.sh签发Let's Encrypt 的SSL证书
- 构建能让socat支持TLSv.13特性的容器环境
- nginx http 通用配置
- 保留的 IP 地址
- 判断某个IP是公共IP还是保留IP
- IPV4的保留地址汇总
- 私有网络IP地址段
- socat
- msys2
- MSYS2 镜像
- MSYS2 镜像
- 虚拟机有哪些?PVE qemu kvm VirtualBox Harvester
- 一篇文章让你彻底弄懂SSL/TLS协议
实践文档
- 在线的同步chromium源码的服务实例
- 在线的http代理配置实例文档
- 自建拉取registry.k8s.io、k8s.gcr.io、gcr.io、quay.io、ghcr.io 容器镜像的服务
- 快速下载chromium源码
- 快速下载webRTC源码
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库