内网半透明代理
因为不是传统意义上的透明代理,但是基本体验又差不多,姑且称之半透明代理。 背景 公司网络差,内网服务器的微信页面开发经常会被外网带宽影响到,一方面是因为引用了微信、阿里的js、css、字体等资源文件,另一方面,因为早前开发团队留下的坑,存在七牛云上的静态文件从接口端下发的url都带了实时的时间戳。 思路 先处理图片url带时间戳的坑,一方面接口是公共的,我在中间加了一层代理后,把无用的参数过滤掉,强制对结果做了一次小缓存;再安排接口端的同学改造遗留问题,确定了有意义的数据作为版本参数。这样至少保证终端用户能看到304,而不是每次都是200。 然后,所引用的静态文件,都是长时间不会修改的,公司网络如此糟糕的情况下,完全可以在本地搭建一个代理,把请求文件缓存下来。 方案 HTTP的代理很简单,nginx配置一个反向代理即可。 之前某些原因,nginx外边还加了一个haproxy,具体原因会在其他文章里解释。 haproxy可以作为 SNI proxy 使用,而流入的请求无非是http明文传输,或者https传输,需要代理的都是TCP的,所以 nginx 处理 http请求,haproxy 判断 SNI,转发tcp到定制的backend。 在此之前,需要在内网搭建 DNS 服务器,(这里我用了 dnsmasq),可以选择将内网 DHCP 的DNS服务器指向这里,或者把非 DNS 所在服务器的所有UDP 53的包转发到这个服务器上。 我的方案里,所有的服务都在内网的一台机器上。haproxy 监听了 内网IP的80,443端口,nginx 监听了 127.0.0.1:80,还有127.0.0.1:443给gitlab使用。 nginx配置很简单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
proxy_cache_path /var/cache/rescache levels=2:2 keys_zone=rescache:1024m; server { listen 127.0.0.1:80; server_name at.alicdn.com res.wx.qq.com *.bkt.clouddn.com; location / { resolver 114.114.114.114; proxy_pass http://$http_host$uri$is_args$args; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $http_host; add_header X-Cached $upstream_cache_status; proxy_cache rescache; proxy_cache_key $http_host$uri; proxy_cache_revalidate on; proxy_cache_valid 200 1d; proxy_cache_valid any 1m; } } |
haproxy的配置同样:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
frontend nginx_fe bind 192.168.1.10:80 default_backend nginx_local backend nginx_local mode http server mid 127.0.0.1:80 frontend ssl_fe mode tcp option tcplog option logasap option tcpka tcp-request inspect-delay 5s tcp-request content accept if { req_ssl_hello_type 1 } bind 192.168.1.10:443 acl acl_sni_at_alicdn_com req.ssl_sni -i at.alicdn.com use_backend bk_at_alicdn_com if acl_sni_at_alicdn_com acl acl_sni_res_wx_qq_com req.ssl_sni -i res.wx.qq.com use_backend bk_res_wx_qq_com if acl_sni_res_wx_qq_com acl acl_sni_bkt_clouddn_com req.ssl_sni -i xxxxxx.bkt.clouddn.com use_backend bk_bkt_clouddn_com if acl_sni_bkt_clouddn_com default_backend bk_local_ssl backend bk_local_ssl mode tcp server server1 127.0.0.1:443 backend bk_at_alicdn_com mode tcp server server1 at.alicdn.com.danuoyi.alicdn.com:443 backend bk_res_wx_qq_com mode tcp server server1 reswx.tc.qq.com:443 backend bk_bkt_clouddn_com mode tcp server server1 tbkt.china.line.qiniudns.com:443 |
需要指出的是,我ssl的backend的server,都是 dig 实际域名,拿第一级cname来用的。 最后 dnsmasq 劫持你所需要的域名的解析即可。 Incoming search terms:clawse3m半透明代理energy6psend61ldrivingsy6dozenxegdeserth65deer7dncow5zgcorrecty76clothing76wadvice3bichurchqdnchoice5qrchairhwdcare9j1cannotcuablindtadbeingpemavailablewddLink to this post!