目录
科普原理

代理是什么?正向代理、反向代理与 SOCKS5

代理就是替你转发网络请求的「中间人」。本文讲清正向代理和反向代理的区别、HTTP 代理与 SOCKS5 工作在哪一层,代理能看到什么、不能做什么,并配三张时序图展示它们的工作过程。

最后更新:

代理(Proxy)就是一个替你转发网络请求的「中间人」:你不直接访问目标,而是把请求交给代理,由代理去访问,再把结果转交给你。按「替谁办事」可以分成两类:正向代理替用户办事(例如公司网络的上网出口),反向代理替网站办事(例如 CDN、Nginx)。常见的代理协议有 HTTP 代理和 SOCKS5,它们本身都不加密,这是代理和加密隧道最大的区别之一。

插图:左边快递员站在用户一侧,替多个用户把请求送往各个网站;右边前台站在服务器一侧,接待众多访客并分配到后面的服务器
  1. ① 用户把请求交给正向代理
  2. ② 正向代理替用户出门访问各个网站
  3. ③ 网站只看到代理,看不到背后的用户
  4. ④ 访客以为自己直接在访问网站
  5. ⑤ 反向代理站在网站前面接待、分配、缓存
  6. ⑥ 源站真正的服务器,藏在代理后面

代理的本质:替你转发请求的「中间人」

没有代理时,你的设备直接和网站通信;有了代理,通信就被拆成了两段:

  1. 你 ↔ 代理:你把「我想访问哪个网站」告诉代理;
  2. 代理 ↔ 网站:代理以自己的身份去访问,网站看到的访问者是代理的 IP 地址。

正因为夹在中间,代理能做很多事:缓存常用内容、过滤访问、隐藏一方的身份、把流量分给不同的服务器……也正因为夹在中间,它能看到经过它的所有未加密内容。

正向代理与反向代理

两者的技术原理相同,区别在于代理站在哪一边、替谁服务:

正向代理反向代理
替谁办事用户(客户端)网站(服务器)
谁需要知道它的存在用户要主动配置用户通常不知道,以为自己访问的就是网站
隐藏了谁隐藏用户:网站只看到代理的 IP隐藏服务器:访客只看到代理,看不到背后的源站
常见用途公司 / 学校统一上网出口、访问控制、缓存CDN 加速、负载均衡、防攻击、统一配置 HTTPS 证书
生活中的例子公司网络要求浏览器填写的代理地址你访问的大型网站,几乎都先经过 CDN

正向代理怎么转发 HTTPS?

现在的网站基本都是 HTTPS,内容是加密的,代理没法、也不需要读懂。浏览器会先用 CONNECT 方法让代理「打通一条通道」,之后的加密数据由代理原样转发:

浏览器 代理服务器 网站 CONNECT example.com:443 1 代你建立 TCP 连接 2 200 连接已建立 3 TLS 握手(代理原样转发) 4 加密的 HTTP 请求 5 加密的网页内容 6
粗线表示加密数据。代理只看得到你要连的域名和端口,看不到加密后的内容。
步骤在做什么
① CONNECT浏览器告诉代理:帮我连到 example.com 的 443 端口
② 建立连接代理以自己的身份和网站建立 TCP 连接
③ 200代理回复「连接已建立」,通道打通
④ TLS 握手浏览器直接和网站做 TLS 握手,代理只是原样搬运
⑤–⑥ 加密数据之后的请求和网页内容都是加密的,代理看不懂,只负责转发

所以对 HTTPS 网站来说,正向代理能看到你访问了哪个域名、什么时候、传了多少数据,但看不到具体内容。而如果访问的是不加密的 HTTP 网站,代理能看到全部内容,甚至可以修改。

反向代理:网站前面的「前台」

你访问一个大型网站时,接待你的往往不是网站真正的服务器(源站),而是挡在前面的反向代理或 CDN 节点:

访客 反向代理 / CDN 源站 缓存命中 GET /logo.png 1 缓存里有,直接返回 2 logo.png 3 缓存未命中 GET /news 4 缓存里没有 5 转发给源站 6 生成页面 7 按规则缓存一份 8 返回页面 9
访客只和反向代理打交道,并不知道背后还有源站。
步骤在做什么
①–③ 缓存命中图片、样式等不常变化的内容,反向代理已经缓存了一份,直接返回,源站完全不用参与
④–⑤ 缓存未命中请求的是没有缓存的内容
⑥–⑦ 回源反向代理把请求转给源站,源站生成页面后返回
⑧ 缓存按网站设置的规则把结果存一份,下一位访客就能直接拿到
⑨ 返回把页面交给访客

这样做的好处是:访客从离自己近的节点取数据,速度更快;源站的压力大大减轻;源站的真实地址不暴露,更不容易被攻击。

HTTP 代理与 SOCKS5:分别工作在哪一层

HTTP 代理SOCKS5 代理
工作层级应用层:理解 HTTP 协议会话层(介于应用层和传输层之间):不关心上面跑的是什么协议
能转发什么主要是网页流量(HTTP,以及通过 CONNECT 转发的 HTTPS)任意 TCP 连接,也支持 UDP,例如邮件、游戏、聊天软件
加密不加密不加密
认证可选:用户名和密码可选:用户名和密码

SOCKS5 的工作过程很简单:先打招呼、认证,再告诉代理要连到哪里,之后就只负责转发:

应用程序 SOCKS5 代理 目标服务器 问候与认证 问候:我支持这些认证方式 1 选定:用户名密码认证 2 用户名 + 密码 3 认证通过 4 请求连接 CONNECT 目标地址:端口 5 建立 TCP 连接 6 成功 7 转发数据 之后的数据由代理原样转发 8
SOCKS5 本身不加密:握手完成后,代理只负责把两边的数据原样转发。
步骤在做什么
①–② 问候程序列出自己支持的认证方式,代理从中选一种
③–④ 认证程序发送用户名和密码,代理核对通过。注意:这一步也是明文的
⑤ 请求连接程序告诉代理目标的地址和端口
⑥–⑦ 建立连接代理去连接目标服务器,成功后告诉程序
⑧ 转发此后双方的数据由代理原样转发,代理不解析也不加密

代理能做什么、不能做什么

能做的:

  • 隐藏你的 IP:网站看到的是代理的地址;
  • 集中管控:公司可以统一过滤、审计员工的上网行为;
  • 缓存加速:常用的内容存在代理上,多人访问时更快;
  • 分担压力:反向代理把访客分配到多台服务器上。

不能做的:

  • 不能保护你的隐私不被代理看到:代理本身不加密,经过它的未加密内容一览无余,即使是 HTTPS 也能看到你访问的域名;
  • 不能防止沿途窃听:你和代理之间的这一段,如果用的是普通 HTTP 代理或 SOCKS5,同一网络里的人或运营商也能看到你要连哪里、甚至你的代理密码;
  • 不能接管整台设备:只有配置了代理的程序才会走代理,其他程序照样直连。

后两条,正是加密隧道要解决的问题:它把你和服务器之间的整条通道都加密,并通过虚拟网卡接管整台设备的流量。两者的区别在下一篇详细说明。

相关阅读

常见问题

浏览器里设置了代理,为什么有些软件还是不走代理?

系统或浏览器的代理设置只对「主动遵守这个设置」的程序有效。很多命令行工具、游戏和部分 App 会直接联网,不读这个设置。要让整台设备的流量都经过转发,需要用虚拟网卡(TUN)接管,详见「加密隧道是什么」。

免费的公共代理能用吗?

不建议用来登录账号或处理任何敏感信息。代理处在你和网站之间,不加密的内容它都能看到;来路不明的免费代理可能记录甚至篡改你的流量。

CDN 和代理是什么关系?

CDN 本质上就是分布在世界各地的一大批反向代理:它们站在网站前面,替网站接待访客、缓存内容,让访客从离自己最近的节点取数据。

还没有安装穿山甲?

支持 iPhone / iPad、Mac、Windows 与 Android。新用户注册即送 7 天会员体验。

下载客户端
← 全部文章