Ngnix本身可以做服务器以及反向代理的同时,同样支持正向代理。
说之前: 吐槽一下OSChina的编辑器,图片大小,字体,颜色,各种问题,在我印象中没有好过,以后还能不能用啊
正向代理与反向代理的区别是,前者为企业防火墙以内的Client做代理进行访问防火墙外的服务器,后者恰好相反,反向代理为防火墙外的Client做代理访问防火墙内的服务器。
###一.关于HTTP代理 http proxy分为2种,第一种是透明代理,第二种是通过CONNECT建立隧道(Tunnel)的访问技术。
1.第一种代理 请求部分
Proxy-Connection: keep-alive来指示这种代理
然后转发请求头和请求体,请求头中如果要支持HTTP TRACE,无非需要加一个Via,或者为了服务器得到正式的ip,添加X-Real-ip。
注意:国内有些人称这种代理是GET代理,莫名其妙至极,本身这种代理支持HTTP现有的大多数MEDHOD(PUT,POST,GET,DELETE,OPTIONS...),称为“透明代理”再恰当不过了。
响应部分 因为这种代理是正常请求,因此不要通过TCP TLS通道便可以通信,因此他的响应头没啥和正常访问区别.
对于这种代理,我们用一张图来说明
2.第2种代理HTTP Tunnel隧道
对于HTTPS网站,大多数代理都是TCP隧道代理,当然透明代理也不例外,主要看Client能否正常接收SSL数据决定。
请求部分 注意:此处的请求没有请求体,无论是否是POST请求
然后代理服务器应该做的是,建立 普通的Socket 连接(注意,连接www.example.com:443),然后根据目标服务器的连接状态返回给Client,比如如果连接正常,着
否则关闭Client连接。
如果连接正常,Client收到HTTP/1.1 200 Connection established后,然后可以从Client读取TLS加密的数据。
接下来,把读取到的数据发送给支持SSLSocketServer(HTTPS)服务器。服务器收到数据后进行TLS握手,握手结束,把数据返回给代理。代理把数据转发给Client.
由此,代理活动结束。
我们再看一张图来展示整个代理过程 图可能太大,没显示出来,大家看这里( https://i-blog.csdnimg.cn/blog_migrate/8a205a247490ed76f5408aa93024ac81.png )
3.我们用WireShark+Fiddler进行模拟
( https://i-blog.csdnimg.cn/blog_migrate/650b3994aae06b062de53aec8fc35b18.png )
( https://i-blog.csdnimg.cn/blog_migrate/07427afa6d49b5e3ff5e83698933b486.png )
整个过程相当复杂,尤其是握手过程。
但大多数都是TLS层进行的,我们无需理会太多,只要做好Socket转发即可,就想本文第2张图一样。
目前我在写一款HTTP Proxy,遇到了握手问题,不知道如何是好,哈哈,待续吧,没准以后可以解决问题,到时候我写一篇博客发布出来。
###二、Nginx 正向代理配置:
1,配置 DNS 解析 IP 地址以及超时时间(5秒)。
resolver 114.114.114.114;
resolver_timeout 5s;
2,配置正向代理参数,均是由 Nginx 变量组成。其中 proxy_set_header 部分的配置,是为了解决如果 URL 中带 "."(点)后 Nginx 503 错误。
proxy_pass $ scheme://$host$request_uri ;
proxy_set_header Host $http_host;
3,配置缓存大小,关闭磁盘缓存读写减少I/O,以及代理连接超时时间。
proxy_buffers 256 4k;
proxy_max_temp_file_size 0;
proxy_connect_timeout 30;
4,配置代理服务器 Http 状态缓存时间。
proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
###三、支持SSL/TLS隧道代理
因为 Nginx 默认不支持HTTP CONNECT隧道代理,所以无法正向代理 Https 网站(网上银行,Gmail)。 如果访问 Https 网站,比如: https://www.google.com,Nginx access.log 日志如下:
"ConNECT www.google.com:443 HTTP/1.1" 400
####关于HTTP代理测试,我们可以使用 Chrome的SwicthSharp扩展,指向代理服务器 ####关于HTTPD代理,如果我们不想使用代理客户端,直接修改DNS,让需要代理的网站域名地址指向代理服务器
参考博客: Windows DNS服务器
HTTP代理方式
VPS+Squid+stunnel实现安全代理隧道
HTTP GET/CONNECT代理区别