Appearance
网络代理基础原理
网络代理的核心是“代替应用发起连接”。应用原本会直接连目标服务;启用代理后,应用先把请求交给本机代理客户端,再由客户端决定是否直连、拒绝,或者通过远端代理服务访问目标。
代理解决的问题
代理系统通常用于三类场景:
- 统一出口:让多台设备或多个程序从指定出口访问外部服务。
- 规则分流:部分域名直连,部分域名走代理,避免所有流量都进入隧道。
- 网络适配:让不支持复杂路由的应用,通过本机代理端口或 TUN 接入统一策略。
它不改变应用层业务逻辑。浏览器仍然发 HTTP 请求,数据库客户端仍然发数据库协议,代理只是改变这条连接走哪条网络路径。
代理和 VPN 的边界
VPN 通常在网络层建立虚拟网卡,把一大段路由导入隧道。网络代理通常在应用层或本机转发层工作,更强调按规则处理每条连接。
| 维度 | 网络代理 | VPN |
|---|---|---|
| 接入方式 | HTTP/SOCKS 端口、系统代理、TUN | 虚拟网卡、系统路由 |
| 分流能力 | 常按域名、IP、进程、规则集分流 | 常按路由表和网段分流 |
| 客户端感知 | 应用可能需要读取系统代理 | 多数应用无感知 |
| 常见用途 | 浏览器、开发工具、指定 API 出站 | 企业内网、全局隧道、站点互联 |
现代代理客户端也可以使用 TUN 模式接管更底层流量,所以二者边界在工程上会重叠。判断时不要看名字,看它实际接管的是应用代理端口还是系统路由。
本机流量怎么进入代理客户端
本机侧常见三种入口。
HTTP / SOCKS 端口
客户端在本机监听端口,例如 HTTP 代理端口和 SOCKS5 端口。应用显式配置代理地址后,请求会先发给这个本机端口。
text
浏览器 -> 127.0.0.1:7890 -> 代理客户端 -> 远端代理 / 直连这种方式边界清晰,适合浏览器、命令行工具、开发工具。缺点是某些应用不读取代理设置,或者只支持 HTTP 代理、不支持 SOCKS。
系统代理
系统代理是把本机代理端口写入操作系统网络设置。大部分遵守系统设置的应用会自动使用它。
它不是强制接管。应用如果自己实现网络栈、忽略系统代理,或者直接建立原始连接,系统代理就管不到。
TUN 模式
TUN 模式通过虚拟网卡接收流量,再由代理客户端在本机判断和转发。它覆盖面更广,适合不支持系统代理的应用。
TUN 也更敏感:它会和系统路由、DNS、企业 VPN、防火墙、其他虚拟网卡产生相互影响。只有在系统代理无法覆盖目标应用时,才需要优先考虑 TUN。
规则决策怎么发生
代理客户端拿到一条连接后,会把目标域名、IP、端口、进程、协议等信息交给规则引擎。规则通常按顺序匹配,命中后就确定流量去向。
yaml
rules:
- DOMAIN-SUFFIX,internal.example,DIRECT
- DOMAIN-SUFFIX,api.example.org,PROXY
- GEOIP,CN,DIRECT
- MATCH,PROXY这段配置表达的是:
- 内部域名直连。
- 指定 API 域名走代理。
- 中国大陆 IP 直连。
- 其他没有命中的流量走代理。
规则的顺序很重要。越具体的规则越应该放在前面,兜底规则放在最后。
DNS 为什么关键
很多代理问题看似是节点问题,实际是 DNS 问题。原因是规则匹配常常依赖域名和 IP:
- 如果域名在本地先解析成 IP,后续规则可能只能看到 IP。
- 如果使用 fake-ip,客户端会给域名分配一个虚拟 IP,再在内部保存域名映射。
- 如果目标域名被错误解析,代理链路再稳定也会访问到错误地址。
网络代理里的 DNS 不只是“拿到 IP”,它还影响规则命中、连接目标和隐私边界。生产配置里要明确哪些域名本地解析,哪些通过可信 DNS 解析,哪些域名必须保留给代理客户端判断。
数据面链路
一次典型的代理访问如下:
mermaid
sequenceDiagram
participant App as 应用程序
participant Core as 本机代理内核
participant DNS as DNS / 规则引擎
participant Remote as 远端代理服务
participant Target as 目标服务
App->>Core: 发起连接
Core->>DNS: 解析域名并匹配规则
alt 直连
Core->>Target: 直接建立连接
Target-->>Core: 返回数据
else 代理
Core->>Remote: 建立代理协议连接
Remote->>Target: 访问目标服务
Target-->>Remote: 返回数据
Remote-->>Core: 加密传回
end
Core-->>App: 返回响应这条链路中,本机代理内核既是入口,也是路由控制点;远端代理服务只是代理分支上的一环。直连流量不会经过远端代理服务。
分层模型
| 层级 | 关键问题 | 常见配置 |
|---|---|---|
| 本机接入层 | 应用流量怎么进入客户端 | 系统代理、HTTP/SOCKS 端口、TUN |
| 路由决策层 | 这条连接走直连还是代理 | rules、proxy-groups、DNS 策略 |
| 加密协议层 | 客户端和远端如何认证和加密 | cipher、password、UUID、TLS |
| 传输承载层 | 加密流量以什么网络形态传输 | TCP、WebSocket、gRPC、QUIC |
| 出口访问层 | 远端怎样访问目标站点 | 出口 IP、DNS、目标端口、连通性 |
排查时也按这个顺序推进。先看应用有没有进入客户端,再看规则是否命中,再看远端连接是否建立,最后看出口到目标是否可达。
总结
网络代理不是简单的“开代理”。它先在本机接住流量,再用规则和 DNS 决定路径,最后通过直连或远端代理访问目标。理解本机接入、规则决策和数据面链路,就能看懂后面的组件、实施和排障。
