同样是通过代理发出去的请求,代理能看懂的内容却不一样:有的请求,代理知道你要访问哪个页面、提交了什么;有的请求,代理手里只有一串看不懂的加密字节,只知道你连了哪个域名。差别不在于代理的能力,而在于它搬运数据的方式不同。
明文请求是怎么被转发的
当请求本身没有加密时,代理收到的是一个可以读懂的完整请求。它会按规则对请求做一些处理——补上或改写用于标识来源的字段、按目标地址重新组织请求行,然后以自己的名义转发给目标站。目标站看到的来访者是代理,返回的内容也先到代理这里,再由代理交回给客户端。整个过程代理全程参与,内容对它而言是可读的。
加密请求走的是另一条路
加密请求的处理方式完全不同。客户端先向代理发一个建立通道的指令,说明要连到哪个域名和端口;代理与目标建立好链路之后,回一句”通道已通”,此后客户端与目标之间传什么,代理不再拆开看,只负责把字节原样搬过去。对代理来说,这段内容是密文,它既不知道具体路径,也不知道传输内容,能观察到的只有域名、端口和数据量。
那代理到底能看到多少
分两层看。加密隧道之下,代理能看到目标域名与端口、大致的数据量和时间规律,看不到具体路径与内容。但有一处容易忽略:解析环节。如果域名解析不是一并交给代理处理的,那么你要访问哪个域名,在解析那一步仍然可能被本地网络观察到,等于在加密之外又留了一个口子。
两种方式对使用有什么影响
明文转发的好处是代理可以做更多事,比如缓存、压缩、内容过滤,代价是只适用于未加密的流量,如今这类流量已经很少。加密隧道的优势是通用,几乎可以承载任何基于连接的协议,不做任何改动,代价是代理无法做任何内容层面的优化。实际使用中两种模式通常并存,由客户端根据目标是否加密自动选择。
| 对比维度 | 明文转发 | 加密隧道 |
|---|---|---|
| 代理可见内容 | 完整请求与响应 | 仅域名、端口与数据量 |
| 是否改写请求 | 会补写来源相关字段 | 不改写,原样搬运 |
| 可承载的协议 | 仅限未加密的同类请求 | 几乎任意基于连接的协议 |
| 能否做内容优化 | 可以缓存与压缩 | 无法介入内容 |
| 典型使用占比 | 越来越少 | 当前主流 |
常见做法是只盯着代理能不能看到内容,觉得走加密就万事大吉,于是把解析、登录状态这些环节完全留在本机处理。忽略了解析这一环,等于把访问了哪些域名这件事原样留在本地网络里。
更稳妥的做法是把整条链路当成一个整体来看:解析是否一并走代理、请求是否全程加密、连接是否在同一出口上保持一致,三处都对齐,代理提供的出口身份才完整成立,任何一处留口子都会让前面的安排打折扣。
- 分清两种模式:是否加密决定了代理以哪种方式搬运,可见范围差别很大
- 解析别留旁路:域名解析一并交给代理处理,避免域名信息从本地泄露
- 加密不等于万能:域名与访问规律依然可见,行为规范仍是前提
- 按协议选模式:非常规协议只能走隧道,不要指望代理替你做内容优化
代理搬运的是字节还是内容,取决于你交给它的是密文还是明文,而加密之外还有解析这一个口子。
