一 正向代理
① HTTP代理和HTTPS代理的区别 http和https代理的区别
(1) HTTP代理扮演着"中间人"的角色
(2) 中间人的'解读'
[1]、对于'连接到它的客户端'来说,它是'服务端'
[2]、对于'目标服务端'来说,它'HTTP代理'是客户端
[3]、HTTP代理负责在'两端之间无脑'来回传送 HTTP 报文
(3) HTTP代理'工作流程'为:
[1]、客户端浏览器将请求'原封不动'的发送给代理服务器
[2]、代理服务器从'Host头'中获取'目标'的主机地址,将请求'发送给目标主机' --> "重点"
[3]、目标主机'将响应'回传给代理服务器
[4]、代理服务器将响应回'传给客户端'浏览器
(4) HTTP代理流程中'不同role'的感知
[1]、对于'客户端浏览器'来说,他认为'代理服务器'就是目标web服务器
[2]、对于'web服务器'来说来说,它会'把代理当做客户端',完全'察觉不到'真正客户端的存在
HTTP代理特点: 比较'简单的',基本上是'原封不动'的透传
补充: 大多数使用的都是'HTTP协议'的'正向'代理
++++++++++++++ "HTTPS代理" ++++++++++++++
(1) HTTPS是在'HTTP上建立SSL加密层',并对传输数据进行'加密',是HTTP协议的安全版
(2) 它有'两个'主要作用
[1]、一是对'数据进行加密',并建立一个信息'安全通道',来保证'传输过程中'的数据安全
[2]、二是对网站服务器进行'真实身份认证'
(3) HTTPS'代理'工作流程为:
[1]、浏览器首先发送'HTTP Connect请求'给代理服务器,发送'目标主机'信息
[2]、代理服务器建立和目标主机的'TCP连接',并向浏览器'回应Connection Established'应答
[3]、浏览器将请求'发送给代理服务器',代理服务器'透传'给目标主机 --> '请求透传'
[4]、目标主机将响应回给代理服务器,代理服务器将响应回给浏览器 --> '响应透传'
② 正向代理特点
1) 客户端'非常明确'要访问的'目标'服务器地址;
2) 服务器只清楚'请求来自'哪个'代理'服务器,而不清楚来自'哪个具体的客户端'
3) 正向代理模式'屏蔽或者隐藏了'真实客户端信息 --> 看'服务端'记录的日志
4) 场景:第三方'互联网API'的情况时 --> '支付'、'认证'接口,一般'出公网'
5) 正向代理和'翻墙(红杏出墙)'是两码事,有一定联系,取决于'代理服务器'
④ HTTP Tunnel隧道
++++++++++++ "不经过认证" ++++++++++++
⑤ 请求行关于代理
1) CONNECT 使用一种'特殊形式'的'请求目标'
2) 此'method'方法独有,'仅包含'隧道'目标'的'主机和端口号',用'冒号'分隔,'没有默认'端口
3) 当看到'CONNECT'方法就知道'后面的传输的流量'都将'基于隧道'进行传输
++++++++++ "补充" ++++++++++
客户端到网关代理是'CONNECT'请求,网关代理到服务'不是'CONNECT请求
有些'翻墙'软件是用'tunnel'的
⑦ tunnel隧道的常见用途
⑧ 带认证的HTTP Tunnel
+++++++++++ "(1)认证不通过的现象" +++++++++++
+++++++++++ "(2)认证通过的现象" +++++++++++
1)通过用'户名|密码'的形式进行'身份认证'
2) 该认证信息最终会转换为'Proxy-Authorization'请求头
2) 跟随请求一起'发送'给隧道'代理服务器'
备注:该请求头'可能'会发送给'目标'服务器,取决于'proxy'进行鉴权,还是'后端服务'鉴权
同理:curl --proxy-basic --proxy-user 'user:password' -x 172.25.2.100:7765
二 nginx配置https正向代理
1) nginx'默认'作为http的正向代理服务器,但是'不能'用做https的正向代理服务器
2) 因为http正向代理使用的是'GET请求',但是https使用的却是'CONNECT'请求
3) nginx第三方模块'ngx_http_proxy_connect_module' 来支持https的'正向'代理
方案1:基于客户端输入'http请求',nginx通过'proxy_paas https'代理https协议
思路: 通过'proxy_pass https:'将http请求'转换为'https
效果: 'http://www.wzj.com' --> 'https://www.wzj.com'
方案2:基于nginx第三方模块'ngx_http_proxy_connect_module实现'https代理 --> "重点"
特点: 解决 HTTPS 代理的方式属于'透传(隧道)模式',即代理'不解密不感知'上层流量
③ ngx_http_proxy_connect_module
说明: 本次演示使用'1.19.2'版本对应的'patch补丁'
wget http://nginx.org/download/nginx-1.19.2.tar.gz
tar -xf nginx-1.19.2.tar.gz
cd nginx-1.19.2/
yum install -y git
git clone https://github.com/chobits/ngx_http_proxy_connect_module.git
yum install -y patch pcre pcre-devel
patch -p1 \
< ngx_http_proxy_connect_module/patch/proxy_connect_rewrite_1018.patch
# nginx -V'保留'之前的编译参数
./configure --with-http_ssl_module --add-module=ngx_http_proxy_connect_module
make && make install
ln -s /usr/local/nginx/sbin/nginx /usr/local/bin/nginx
细节: 在使用https正向代理的时候,需要注意'openssl版本'问题
⑤ nginx配置的demo
server {
resolver 8.8.8.8;
listen 8080;
proxy_connect;
proxy_connect_allow 443 563;
proxy_connect_connect_timeout 10s;
proxy_connect_read_timeout 10s;
proxy_connect_send_timeout 10s;
location / {
proxy_set_header Host $http_host;
proxy_pass https://$host$request_uri;
}
}
⑥ curl测试
1) 7层需要通过HTTP CONNECT来建立隧道,属于'客户端有感知'的普通代理方式
2)需要在客户端'手动配置HTTP(S)代理'服务器IP和端口
3)在客户端用'curl 加-x参数'访问如下:
curl https://www.google.com -kvI /dev/null -x 172.25.2.100:7765
说明: 注意观察'curl连接代理'的实验现象,这里'不再'演示