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源码