代理是怎么工作的?从原理看懂系统代理、TUN 和分流
通俗讲解网络代理的工作原理:直连和走代理时数据分别怎么走,代理服务器做了什么,系统代理与 TUN 模式的原理差异,分流规则如何决定每个连接的去向,以及代理能看到和看不到什么。
「代理」这个词听起来复杂,原理其实很直观:找一个中间人替你去访问。下面从一次网页访问说起。
直连:自己去
不用代理时,访问一个网站的过程是:
- 你的设备通过 DNS 查到网站的 IP(过程见 IP 地址、域名和 DNS);
- 设备直接和这个 IP 建立连接;
- 网站把内容发回给你。
网站看到的访问者 IP,就是你家宽带的公网 IP。
走代理:让中间人去
使用代理时,过程变成:
- 你的设备把「我要访问某某网站」的请求,加密后发给代理服务器;
- 代理服务器替你连接网站,取回内容;
- 代理服务器再把内容转发给你。
这样带来几个变化:
- 网站看到的是代理服务器的 IP,以及它所在的地区;
- 你和代理服务器之间的数据是加密的,中间环节看到的只是「你在和代理服务器通信」;
- 数据多绕了一段路,延迟会增加,增加多少取决于代理服务器的位置和线路。
代理服务器做了什么
一个代理服务(比如由多个节点组成的服务)在背后做的事情,大致是:
| 角色 | 做什么 |
|---|---|
| 客户端(你设备上的软件) | 接管流量、加密、按规则选择发往哪个节点 |
| 入口(有时是中转服务器) | 接收你的连接,转发到出口 |
| 出口(落地服务器) | 解密后替你访问目标网站,网站看到的就是它的 IP |
客户端和服务器之间使用约定好的协议来加密和传输数据,协议只决定「数据怎么包装」,而数据「走哪条路」取决于网络线路,两者是不同的概念。
客户端怎么「接管」流量:系统代理和 TUN
代理客户端要先让设备上的流量交给自己,常见有两种方式:
系统代理:客户端在系统设置里登记一个本地地址(比如 127.0.0.1 加端口)。愿意读取这个设置的程序(浏览器等)会把请求发给它。但不读取系统设置的程序(很多终端工具、游戏)就不会走代理。
TUN 模式:客户端在系统里创建一块虚拟网卡,修改路由表,让系统把所有流量都交给这块网卡。这样不管程序读不读设置,流量都会经过客户端,所以能接管终端程序和游戏。TUN 模式还能处理 UDP 流量,UDP 是什么见 TCP 和 UDP 有什么区别。
分流:每个连接走哪条路
客户端接管流量后,并不是全部都发给代理服务器,而是按规则逐个判断:
- 看目标域名:比如命中「国内网站列表」,就直连;
- 看目标 IP 的归属地:比如是国内 IP,就直连;
- 命中广告域名,就直接拦截;
- 其余的,交给指定的代理节点。
这就是「规则模式」。它的好处是国内网站不绕路、速度不受影响,也不浪费代理的流量;「全局模式」则是不管规则、全部走代理。
DNS 在代理里的处理
既然要按域名分流,域名查询本身也要处理好。如果 DNS 查询绕过代理、直接发给本地运营商,就会出现「DNS 泄露」,并可能拿到被干扰的结果。
很多客户端使用 fake-ip 的方式:先给域名返回一个假的内部 IP,让程序立刻发起连接,客户端再根据域名决定这个连接是直连还是交给代理,由代理服务器在远端完成真实的域名解析。这样既快,又减少了 DNS 泄露。
代理能看到什么、看不到什么
代理服务器处在你和网站之间,所以:
- 能看到:你访问了哪些网站(域名或 IP)、什么时间、传了多少数据;
- 看不到:HTTPS 网站的具体页面内容和你输入的密码,因为它们在浏览器和网站之间是端到端加密的。
所以选择可信的服务、重要账号开启两步验证,是使用任何代理时都该有的习惯。加密的原理见 HTTPS 和 TLS 加密。
总结
- 代理是替你访问网站的中间人,网站看到的是代理出口的 IP。
- 客户端用系统代理或 TUN 模式接管流量,TUN 能覆盖所有程序。
- 分流规则决定每个连接直连还是走代理,国内直连、海外走代理是最常见的用法。
- 代理能看到你访问了哪里,但看不到 HTTPS 的具体内容。
常见问题
用了代理,网站看到的是谁的 IP?
看到的是代理服务器(出口)的 IP,而不是你自己的。这也是网站会根据代理的出口地区判断你「在哪里」的原因。
代理和 VPN 在原理上有什么不同?
传统 VPN 通常在系统层面建立一条加密隧道,接管全部流量;代理一般针对应用或按规则转发部分流量。现在的代理客户端开启 TUN 模式后,也能像 VPN 一样接管全部流量,两者的界限已经越来越模糊。
走代理为什么会比直连慢?
数据多绕了一段路:先到代理服务器,再到网站。代理服务器越远、线路越拥挤,额外的延迟就越大。所以通常让国内网站直连,只让需要的流量走代理。