目录
代理是什么?正向代理、反向代理与 SOCKS5
代理就是替你转发网络请求的「中间人」。本文讲清正向代理和反向代理的区别、HTTP 代理与 SOCKS5 工作在哪一层,代理能看到什么、不能做什么,并配三张时序图展示它们的工作过程。
网络原理系列:① 打开一个网页时发生了什么 → ② 网络分层模型 → ③ 常见网络协议 → ④ 代理是什么 → ⑤ 加密隧道是什么 → ⑥ 加密隧道与代理的区别 → ⑦ HTTPS 加密了什么 → ⑧ 系统代理与 TUN 模式 → ⑨ 分流是什么 → ⑩ DNS 污染与泄漏 → ⑪ 晚高峰为什么变慢 → ⑫ 延迟、丢包与带宽
代理(Proxy)就是一个替你转发网络请求的「中间人」:你不直接访问目标,而是把请求交给代理,由代理去访问,再把结果转交给你。按「替谁办事」可以分成两类:正向代理替用户办事(例如公司网络的上网出口),反向代理替网站办事(例如 CDN、Nginx)。常见的代理协议有 HTTP 代理和 SOCKS5,它们本身都不加密,这是代理和加密隧道最大的区别之一。
- ① 用户把请求交给正向代理
- ② 正向代理替用户出门访问各个网站
- ③ 网站只看到代理,看不到背后的用户
- ④ 访客以为自己直接在访问网站
- ⑤ 反向代理站在网站前面接待、分配、缓存
- ⑥ 源站真正的服务器,藏在代理后面
代理的本质:替你转发请求的「中间人」
没有代理时,你的设备直接和网站通信;有了代理,通信就被拆成了两段:
- 你 ↔ 代理:你把「我想访问哪个网站」告诉代理;
- 代理 ↔ 网站:代理以自己的身份去访问,网站看到的访问者是代理的 IP 地址。
正因为夹在中间,代理能做很多事:缓存常用内容、过滤访问、隐藏一方的身份、把流量分给不同的服务器……也正因为夹在中间,它能看到经过它的所有未加密内容。
正向代理与反向代理
两者的技术原理相同,区别在于代理站在哪一边、替谁服务:
| 正向代理 | 反向代理 | |
|---|---|---|
| 替谁办事 | 用户(客户端) | 网站(服务器) |
| 谁需要知道它的存在 | 用户要主动配置 | 用户通常不知道,以为自己访问的就是网站 |
| 隐藏了谁 | 隐藏用户:网站只看到代理的 IP | 隐藏服务器:访客只看到代理,看不到背后的源站 |
| 常见用途 | 公司 / 学校统一上网出口、访问控制、缓存 | CDN 加速、负载均衡、防攻击、统一配置 HTTPS 证书 |
| 生活中的例子 | 公司网络要求浏览器填写的代理地址 | 你访问的大型网站,几乎都先经过 CDN |
正向代理怎么转发 HTTPS?
现在的网站基本都是 HTTPS,内容是加密的,代理没法、也不需要读懂。浏览器会先用 CONNECT 方法让代理「打通一条通道」,之后的加密数据由代理原样转发:
| 步骤 | 在做什么 |
|---|---|
| ① CONNECT | 浏览器告诉代理:帮我连到 example.com 的 443 端口 |
| ② 建立连接 | 代理以自己的身份和网站建立 TCP 连接 |
| ③ 200 | 代理回复「连接已建立」,通道打通 |
| ④ TLS 握手 | 浏览器直接和网站做 TLS 握手,代理只是原样搬运 |
| ⑤–⑥ 加密数据 | 之后的请求和网页内容都是加密的,代理看不懂,只负责转发 |
所以对 HTTPS 网站来说,正向代理能看到你访问了哪个域名、什么时候、传了多少数据,但看不到具体内容。而如果访问的是不加密的 HTTP 网站,代理能看到全部内容,甚至可以修改。
反向代理:网站前面的「前台」
你访问一个大型网站时,接待你的往往不是网站真正的服务器(源站),而是挡在前面的反向代理或 CDN 节点:
| 步骤 | 在做什么 |
|---|---|
| ①–③ 缓存命中 | 图片、样式等不常变化的内容,反向代理已经缓存了一份,直接返回,源站完全不用参与 |
| ④–⑤ 缓存未命中 | 请求的是没有缓存的内容 |
| ⑥–⑦ 回源 | 反向代理把请求转给源站,源站生成页面后返回 |
| ⑧ 缓存 | 按网站设置的规则把结果存一份,下一位访客就能直接拿到 |
| ⑨ 返回 | 把页面交给访客 |
这样做的好处是:访客从离自己近的节点取数据,速度更快;源站的压力大大减轻;源站的真实地址不暴露,更不容易被攻击。
HTTP 代理与 SOCKS5:分别工作在哪一层
| HTTP 代理 | SOCKS5 代理 | |
|---|---|---|
| 工作层级 | 应用层:理解 HTTP 协议 | 会话层(介于应用层和传输层之间):不关心上面跑的是什么协议 |
| 能转发什么 | 主要是网页流量(HTTP,以及通过 CONNECT 转发的 HTTPS) | 任意 TCP 连接,也支持 UDP,例如邮件、游戏、聊天软件 |
| 加密 | 不加密 | 不加密 |
| 认证 | 可选:用户名和密码 | 可选:用户名和密码 |
SOCKS5 的工作过程很简单:先打招呼、认证,再告诉代理要连到哪里,之后就只负责转发:
| 步骤 | 在做什么 |
|---|---|
| ①–② 问候 | 程序列出自己支持的认证方式,代理从中选一种 |
| ③–④ 认证 | 程序发送用户名和密码,代理核对通过。注意:这一步也是明文的 |
| ⑤ 请求连接 | 程序告诉代理目标的地址和端口 |
| ⑥–⑦ 建立连接 | 代理去连接目标服务器,成功后告诉程序 |
| ⑧ 转发 | 此后双方的数据由代理原样转发,代理不解析也不加密 |
代理能做什么、不能做什么
能做的:
- 隐藏你的 IP:网站看到的是代理的地址;
- 集中管控:公司可以统一过滤、审计员工的上网行为;
- 缓存加速:常用的内容存在代理上,多人访问时更快;
- 分担压力:反向代理把访客分配到多台服务器上。
不能做的:
- 不能保护你的隐私不被代理看到:代理本身不加密,经过它的未加密内容一览无余,即使是 HTTPS 也能看到你访问的域名;
- 不能防止沿途窃听:你和代理之间的这一段,如果用的是普通 HTTP 代理或 SOCKS5,同一网络里的人或运营商也能看到你要连哪里、甚至你的代理密码;
- 不能接管整台设备:只有配置了代理的程序才会走代理,其他程序照样直连。
后两条,正是加密隧道要解决的问题:它把你和服务器之间的整条通道都加密,并通过虚拟网卡接管整台设备的流量。两者的区别在下一篇详细说明。
相关阅读
常见问题
浏览器里设置了代理,为什么有些软件还是不走代理?
系统或浏览器的代理设置只对「主动遵守这个设置」的程序有效。很多命令行工具、游戏和部分 App 会直接联网,不读这个设置。要让整台设备的流量都经过转发,需要用虚拟网卡(TUN)接管,详见「加密隧道是什么」。
免费的公共代理能用吗?
不建议用来登录账号或处理任何敏感信息。代理处在你和网站之间,不加密的内容它都能看到;来路不明的免费代理可能记录甚至篡改你的流量。
CDN 和代理是什么关系?
CDN 本质上就是分布在世界各地的一大批反向代理:它们站在网站前面,替网站接待访客、缓存内容,让访客从离自己最近的节点取数据。