概念
反向代理看上去看深奥,其实不然,只是因为汉语言文化的差异导致它看上去深奥。一般反派感觉都比较厉害和神秘。
要理解反向代理,我们就不得不说一下正向代理。
正向代理 (Forward Proxy)
所谓正向代理,就是大家通常说的代理。打个通俗的比方,你想跟你舅舅借钱,但不好开口(或者你舅妈会设法阻拦),就跟你妈说。这时母亲大人就是个正向代理。此时代理本质就是个桥的作用,这个桥让你能和桥对面的人交换信息。
正向代理是多对一的概念,例如你姐,你妹你可以通过你妈去跟舅舅借钱,但舅舅只有一个舅舅。舅舅有可能并不知道到底是谁真正在借钱,只知道钱给了你妈。
反向代理 (Reserve Proxy)
大家都有打客服电话的经历,比如10086,一般上来就是个语音系统,转接人工服务后嘟嘟嘟好几声才有人接听,说我是工号xxx,很高兴为你服务。这个客服总机号码10086就是个反向代理,
反向代理隐藏了真实的服务端,有可能有N个客服对应N个号码,但你只需要记一个10086,它会平衡客服之间的压力给你安排合适的人。
反向代理是一对多的概念,刚好和正向代理反过来了。
- 正向代理代理的对象是客户端
- 反向代理代理的对象是服务端
反向代理最常见的作用就是负载均衡。比如你访问baidu的域名后,baidu会根据你的ip地址和网络情况给你分配最快的服务器,这个分配服务器的服务器就是反向代理。
反向代理还有一个场景就是内网穿透,因为服务对象是在内网里,你需要通过代理才能访问到。
内网穿透
从外网是没办法直接访问到内网的资源的,因为内网是一个局域网不在一个网段,而且还有防火墙在。
这时候你弄个反向代理就可以解决这个问题:
- 内网服务器访问代理服务器
- 握手,建立通道
- 外网用户访问代理,代理通过通道和内网通信
举一个具体例子,TeamViewer的服务端(外网)就是个反向代理,它需要和TeamViewer客户端(内网)一直保持通信,建立一个通道(TeamViewer ID)。当远程连接这台机器时,你需要登录到TeamViewer服务器,然后通过代理通道(TeamViewer ID)和远程机器连接。
一些反向代理服务
远程连接内网机器的桌面服务是最常见的需求,有时候我们希望做的是自己的机器上跑一些服务能够从外网访问,比如demo,博客,甚至私有云等等。
TeamViewer和向日葵大家可能都知道,我说一些不一样的。
frp
开源界最流行的反向代理之一,frp全称FaskReverseProxy,它的目标是做最快速可靠的反向代理,用GO语言实现,在Github上正在快速迭代中。安装和配置都非常简单,只需要几个命令就可以完成。frp支持的客户端非常丰富,树莓派,路由器,安卓手机等等,可玩性很高。
frp服务可以让你本地的web项目提供给外网访问,特别适合向别人展示你本机的web demo 以及调试一些远程的API (比如微信公众号,企业号的开发)。
FRP还可以轻松代理TCP,HTTPS,SSH等等协议,你需要有一台具有公网IP的机器,最好加一个域名。
ngrok
曾经是开源界反向代理软件的老大,到2.0以后选择闭源,最后开源的版本2016年后就没有再更新,止于1.7。基于C语言实现,配置略复杂,不过据说灵活性和稳定性超好。
ngrok也可以代理常见的各种协议,自己搭建只能用早期的开源版本。或者选择商业公司提供的收费服务,国内外可以搜到很多提供NGROK服务的网站,可不可靠不太敢说,但真的很多。
这里列举一些知乎推荐过的,你也可以通过ngrok这个关键字搜索到很多。
- natapp.cn
- 小米球
- Sunny-Ngrok
- echosite
dog-tunnel
翻译过来就是狗洞吧,国人做的,基于GO语言开发,在GitHub上活跃度还不错,有1k+的星星,有兴趣可以试一下。
serveo.net
无需注册,无需配置,只需要 ssh 就行,没有客户端,支持多端口映射,支持自定义子域名,只要一行代码。
ssh -R 80:localhost:3000 http://serveo.net
我试了一下,临时用一下真的很棒!
写在最后
内网服务本来就是比较敏感的,所以从数据安全的角度看我觉得还是自己搭建代理服务更可靠。用不靠谱的服务有很大风险,还有可能很坑,非常坑。
比如nat123和花生壳,一步一步诱导你付费,协议,端口,流量,速度,域名每个细节都要收费,还不一次说清楚,你付完钱才知道后面还要付钱的,别问我怎么知道的。
更多讨论,你也可以去看知乎:https://www.zhihu.com/questio...
关于作者:
Toby Qin, Python 技术爱好者,目前从事测试开发相关工作,转载请注明原文出处。
欢迎关注我的博客 https://tobyqin.cn,你可以到我的公众号中去当吃瓜群众。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。