正/反向代理与科学上网
代理
你可能听过许多 反向代理(Reverse Proxy) 软件例如 Nginx、Apache 等,它们性能优越,被广泛应用于实际场景中,那么你是否知道 “反向” 是什么意思,为什么叫反向呢,明白这个问题有助于我们更深入的理解它们。还有许多框架中常用的的 控制反转(IOC)/依赖注入(DI) 等概念,你是否理解 反转 或 注入 的真正含义。
既然有反向代理,就有正向代理,常用的科学上网就是使用了这个技术,你所见过的例如 ss/ssr/socks5 等等仅仅是协议名,配合上一些混淆方式,它们的技术原理还是 正向代理( Forward Proxy)。
之前我在「刷」面试题的时候,就遇到过相关问题,“墙以及科学上网的原理”。相信读完这本文你会得到答案。
在了解正反向代理之前先牢记一句话,反向代理
代理并 隐藏服务端,正向代理
与之相反,隐藏客户端。
反向代理
OK,记住了这句话,想想 Nginx/Apache 的功能,你将服务部署在服务器上,只公开了 80/443 端口,而内部服务有很多个,通过不同域名访问,然后使用 Nginx/Apache 来接受外界请求,利用提供的指令,例如 sever_name
,listen
,index
,location
来控制其进行转发到不同的内部端口上,由于其使用了非常高效的 epoll IO多路复用模型,效率非常高。
那么你的脑海中应该有大致这么一张图,类似这样:
Reverse Proxy
+------------------------------------------------------+
| |
| +---------+ |
| +-------> | Server1 | |
| | +---------+ |
+--------------+ | +-----------------+ | |
| | | | | | +---------+ |
| Client +-----------+-->| google.com +->+-------->| Server2 | |
| | | | | | +---------+ |
+--------------+ | +-----------------+ | ... |
| | +---------+ |
| +-------->| Server99| |
| +---------+ |
| |
+------------------------------------------------------+
正向代理
与反向代理相反,正向代理的作用是隐藏客户端,比较容易理解的例子还是科学上网,直接访问会受到运营商防火墙的限制例如 DNS 污染等导致查询失败。
而 “梯子”“代理”等等工具就是购买了一台服务器 S,在你需要请求这些受限网站 Google 时,直接请求 S,由于可以访问 S ,就由 S 替我们去访问 Google,再将结果返回给我们,就完成了一次 “科学上网”。
Forward Proxy
+-----------------------------------------------------+
| |
| |
| +--------------+ +---------------+ | +--------------------+
| | | | | | | |
| | Client +---------->| Proxy Server +---->| ----------->| Google/GitHub,etc |
| | | | | | | |
| +--------------+ +---------------+ | +--------------------+
| |
| |
+-----------------------------------------------------+
当然,大致过程很简单,但是其中的细节非常多。为了限制网民的这种行为,会对访问境外的流量进行分析,如果有可疑特征,则直接拦截。现在甚至研究出了利用机器学习等技术智能审查流量的机。因此通过 SS/SSR 的方式由于特征明显,已经基本被淘汰。