This is a placeholder. And, this article won’t be public.
You are not authorised to read all content in this post.
Please login…
sskaje's blog, study & research on technology
This is a placeholder. And, this article won’t be public.
You are not authorised to read all content in this post.
Please login…
因为不是传统意义上的透明代理,但是基本体验又差不多,姑且称之半透明代理。
公司网络差,内网服务器的微信页面开发经常会被外网带宽影响到,一方面是因为引用了微信、阿里的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 劫持你所需要的域名的解析即可。
VPN的方案可以参考 Set up OpenVPN Site-to-Site on UBNT EdgeRouter Lite 或 EdgeOS PPTP VPN客户端配置。
由于某些国际CDN的问题,部分网站不适合用IP路由来设定跳转。所以这里的需求是,针对特定域名把80/443的请求转由VPN的设备出去,其他的不管。
思路1,用EdgeMax自带的webproxy功能,但是很可惜,squid不支持选择outgoing的interface,只能选目标IP。所以放弃。
思路2,DPI监测域名或SNI,但是EdgeRouter Lite的最新版beta 1.8.0b3文档不完整,自己测试了一下相关命令,没搞成,理论上有戏。
思路3,本地socks5代理。我一直会用firefox+foxyproxy作为专用浏览器,正常的需求都用chrome。而且最近secure pipes经常掉,不确定什么情况,包括用国内vps代理远端ssh的方案也不行。
尝试了一些方案,包括dante-server 选上行interface, SSH Tunnel + DNAT,都不行。DNAT的方案不想直接用iptables,怕配置命令保存不方便,所以最终回到了haproxy的方案。
VPS上,配置socks5代理。方案很简单,参考命令如下:
1 |
ssh -f -N -D 10.99.99.2:31080 -D 192.168.121.1:31080 sskaje@127.0.0.1 |
10.99.99.2 和 192.168.121.1 分别是我两种vpn方案的服务端私有IP。
这行命令被我加到了rc.local。当然,还得配ssh 公钥登录。
路由上,安装配置haproxy。依旧参考 使用HAProxy搭建SSH代理。
/etc/haproxy/haproxy.cfg
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 |
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon defaults log global mode tcp timeout connect 5000 timeout client 50000 timeout server 50000 listen proxy option tcplog option logasap option tcpka maxconn 9999 bind 0.0.0.0:31080 server server-1 10.99.99.2:31080 maxconn 5000 server server-2 192.168.121.1:31080 maxconn 5000 retries 10 timeout connect 500 timeout client 5000 timeout server 5000 |
VPS SSH经常被封杀,只能国内找个某云,配个HAProxy,实现效果参考 windows 的netsh portproxy。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy daemon defaults log global mode tcp timeout connect 5000 timeout client 50000 timeout server 50000 listen proxy option tcplog option logasap option tcpka maxconn 9999 bind 0.0.0.0:监听端口 server server-1 VPS主机:22 maxconn 5000 |
更多方案参考:https://www.digi77.com/the-art-of-port-forwarding-on-linux/