HTTP1.1(二十一)如何通过HTTP隧道访问被限制的网络

一  正向代理

①   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) 正向代理和'翻墙(红杏出墙)'是两码事,有一定联系,取决于'代理服务器'

ip被墙

③  HTTP和HTTPS的分类

④  HTTP Tunnel隧道

交互流程解读 

++++++++++++  "不经过认证"  ++++++++++++

⑤  请求行关于代理

⑥  CONNECT请求方法

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 

⑨  Proxy-Authorization

 

 二   nginx配置https正向代理

①   为什么 NGINX 不能做 HTTPS 正向代理服务器

1) nginx'默认'作为http的正向代理服务器,但是'不能'用做https的正向代理服务器

2) 因为http正向代理使用的是'GET请求',但是https使用的却是'CONNECT'请求

3) nginx第三方模块'ngx_http_proxy_connect_module' 来支持https的'正向'代理

②   nginx搭建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补丁'

④  nginx编译安装

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连接代理'的实验现象,这里'不再'演示

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值