学习一下正向代理和反向代理。
概念
反向代理看上去看深奥,其实不然,只是因为汉语言文化的差异导致它看上去深奥。一般反派感觉都比较厉害和神秘。
要理解反向代理,我们就不得不说一下正向代理。
正向代理 (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/question/49629610/