网络代理相关知识
- 区别与原理详解
- [🌐 网络代理与 TCP 桥接原理(表格版)](#🌐 网络代理与 TCP 桥接原理(表格版))
-
- 一、代理类型对比
- [二、HTTP 代理的两种模式](#二、HTTP 代理的两种模式)
- [三、TCP 桥接(TCP Bridging / Relay)核心机制](#三、TCP 桥接(TCP Bridging / Relay)核心机制)
- [四、TCP 桥接的三个阶段](#四、TCP 桥接的三个阶段)
- [五、HTTPS 代理中的证书获取流程](#五、HTTPS 代理中的证书获取流程)
- 六、常见技术中的代理与桥接应用
- 七、关键问题总结
- 八、一句话总结
- [🌐 Nginx 反向代理(表格版)](#🌐 Nginx 反向代理(表格版))
- [🌐 Vue Dev Proxy(表格版)](#🌐 Vue Dev Proxy(表格版))
区别与原理详解
特性 | 网络代理 (Network Proxy) | Nginx 反向代理 (Reverse Proxy) | Vue 前端请求代理 (Dev Proxy) |
---|---|---|---|
层级 | 网络层 / 应用层(如 HTTP 代理) | 应用层(HTTP/HTTPS) | 应用层(HTTP/HTTPS) |
运行环境 | 独立的代理服务器或客户端软件(如浏览器插件、系统代理设置) | 服务器端(生产环境) | 开发环境(仅用于开发) |
主要目的 | - 访问受限资源 - 匿名性 - 缓存加速 - 内容过滤 | - 负载均衡 - 高可用 - 安全防护(隐藏后端) - 静态资源服务 - SSL 终止 | 解决开发时的跨域问题 (前端开发服务器和后端 API 服务器不同源) |
谁发起请求 | 最终用户或客户端程序 | Nginx 服务器(代表客户端) | Vue 开发服务器(webpack-dev-server ) |
工作流程 | 用户 → 代理服务器 → 目标服务器 → 代理服务器 → 用户 | 客户端 → Nginx → 后端服务器 → Nginx → 客户端 | 浏览器 → Vue Dev Server → 代理规则 → 后端服务器 → Vue Dev Server → 浏览器 |
是否修改请求/响应 | 通常透明转发,但可修改(如缓存、过滤) | 可修改(如添加头、重写 URL、压缩) | 可修改(如重写路径、添加头) |
生产环境使用? | 是(如企业代理、CDN) | 是(核心生产组件) | 否(仅开发时使用) |
典型工具/技术 | Squid, Charles, Shadowsocks, CDN 边缘节点 | Nginx, Apache, HAProxy | webpack-dev-server 的 proxy 配置 |
🌐 网络代理与 TCP 桥接原理(表格版)
一、代理类型对比
类型 | 是否需要手动配置 | 谁发起连接 | 代理是否解析内容 | 典型场景 | 安全性 |
---|---|---|---|---|---|
显式代理 | 是(如设置浏览器代理) | 客户端主动连接代理 | 是(HTTP)或否(CONNECT) | Clash、V2Ray、浏览器插件 | 高(加密时) |
透明代理 | 否(自动拦截) | 网络设备劫持流量 | 是或否(取决于模式) | 公司网关、ISP、GFW | 低(可能被监控) |
二、HTTP 代理的两种模式
特性 | 普通代理(HTTP Proxy) | 隧道代理(CONNECT) |
---|---|---|
适用协议 | HTTP(明文) | HTTPS / TLS / 任意 TCP 协议 |
请求方式 | GET http://example.com/path HTTP/1.1 |
CONNECT example.com:443 HTTP/1.1 |
代理行为 | 解析 URL,重新发起 HTTP 请求 | 建立 TCP 连接,透传数据 |
数据是否可读 | 是,代理可查看/修改内容 | 否,代理只转发加密流 |
TLS 握手位置 | 代理与目标之间(若支持 SSL 代理) | 客户端与目标之间(端到端) |
证书获取方式 | 代理获取并可能替换(中间人) | 客户端直接接收目标服务器证书 |
典型用途 | 缓存、过滤 HTTP 流量 | 访问 HTTPS 网站、加密通信 |
三、TCP 桥接(TCP Bridging / Relay)核心机制
概念 | 说明 |
---|---|
定义 | 代理将"客户端 ↔ 代理"和"代理 ↔ 目标"两个 TCP 连接"焊接"成一条逻辑通路 |
本质 | 不是"两个隧道",而是一个被中继的 TCP 流 |
触发方式 | 客户端发送 CONNECT 请求 |
代理行为 | 进入"透传模式",双向转发字节流,不再解析协议 |
数据流向 | 客户端 → 代理 → 目标 → 代理 → 客户端(双向) |
是否加密 | 桥接本身不加密,但上层可运行 TLS(如 HTTPS) |
类比 | 电话转接员:只传声音,不参与对话 |
四、TCP 桥接的三个阶段
阶段 | 连接 A(你 ↔ 代理) | 连接 B(代理 ↔ 目标) | 代理行为 |
---|---|---|---|
1. 建立连接 A | 已建立 | 不存在 | 等待客户端请求 |
2. 发送 CONNECT | 存在 | 不存在 | 代理解析 CONNECT 请求 |
3. 建立连接 B | 存在 | 建立中 | 代理连接目标服务器 |
4. 返回 200 | 存在 | 已建立 | 返回 200 Connection Established |
5. 桥接数据流 | 存在 | 存在 | 双向透传,不再解析数据 |
五、HTTPS 代理中的证书获取流程
步骤 | 行为 | 说明 |
---|---|---|
1 | 客户端发送 CONNECT google.com:443 |
通过代理请求建立 TCP 通路 |
2 | 代理连接 google.com:443 |
代理在境外可成功连接 |
3 | 代理返回 200 Connection Established |
TCP 隧道建立完成 |
4 | 客户端发送 Client Hello |
TLS 握手开始,通过代理透传 |
5 | google.com 返回 Server Hello + 证书 |
证书由真实服务器发送 |
6 | 客户端验证证书 | 检查 CA、域名、有效期 |
7 | 建立加密会话 | 后续所有数据加密传输 |
✅ 关键 :证书是在连接建立后由服务器发送,不是提前获取。
六、常见技术中的代理与桥接应用
技术 | 是否使用 TCP 桥接 | 加密方式 | 流量伪装 | 说明 |
---|---|---|---|---|
HTTP CONNECT | ✅ 是 | TLS(上层) | ❌ 否 | 标准 HTTPS 代理机制 |
Shadowsocks | ✅ 是 | AES/ChaCha20 | ✅ 是(可混淆) | 加密 SOCKS5 代理 |
V2Ray / Xray | ✅ 是 | TLS + WebSocket | ✅ 是(伪装成网站) | 模块化代理平台 |
Trojan | ✅ 是 | TLS | ✅ 是(完全像 HTTPS) | 假装是正常网站 |
SSH 隧道 | ✅ 是 | SSH 加密 | ✅ 是(SSH 流量) | 本地/远程端口转发 |
VPN(如 WireGuard) | ❌ 否 | IP 层加密 | ✅ 是 | 创建虚拟网络接口,非代理 |
七、关键问题总结
问题 | 回答 |
---|---|
是"两个隧道"吗? | ❌ 不是。是两个 TCP 连接被桥接成一个逻辑通路。 |
代理能看到 HTTPS 内容吗? | ❌ 不能,除非你安装了它的 CA 证书(中间人攻击)。 |
如何拿到证书? | 通过桥接的 TCP 通路,目标服务器在 TLS 握手时发送真实证书。 |
TCP 桥接安全吗? | ✅ 安全。只要不安装未知 CA,HTTPS 的端到端加密不受影响。 |
GFW 能阻断吗? | 可通过 DPI 识别特征,但无法解密内容。现代工具通过伪装对抗。 |
八、一句话总结
🔐 网络代理通过 TCP 桥接实现 HTTPS 透传:你发
CONNECT
请求,代理建立通路,你与目标服务器直接完成 TLS 握手,获取真实证书,代理仅作"透明中继"。
步骤 | 发起方 | 接收方 | 数据内容 | 说明 |
---|---|---|---|---|
1 | 客户端 | 代理 | CONNECT google.com:443 HTTP/1.1 Host: google.com [空行] |
客户端请求代理建立通往 google.com:443 的隧道 |
2 | 代理 | 目标服务 | TCP SYN → google.com:443 |
代理尝试与目标建立 TCP 连接 |
3 | 目标服务 | 代理 | TCP SYN-ACK | 目标服务器响应连接请求 |
4 | 代理 | 客户端 | HTTP/1.1 200 Connection Established [空行] |
代理通知客户端:隧道已建立,进入透传模式 |
5 | 客户端 | 代理 | [TLS Client Hello] (二进制) |
客户端开始 TLS 握手,发送 Client Hello 包含:支持的协议版本、加密套件、随机数 ClientRandom |
6 | 代理 | 目标服务 | [TLS Client Hello] (原样转发) |
代理不解析,只是透传二进制数据 |
7 | 目标服务 | 代理 | [TLS Server Hello + Certificate + ServerHelloDone] |
服务器响应: - 选择加密套件 - 发送真实 SSL 证书 (由 Google Trust Services 签发) - 包含 ServerRandom |
8 | 代理 | 客户端 | [TLS Server Hello + Certificate + ServerHelloDone] (原样转发) |
代理继续透传,无法篡改证书(否则浏览器会报警) |
9 | 客户端 | 本地处理 | 验证证书: - 是否由可信 CA 签发 - 域名是否匹配 - 是否过期 | ✅ 验证通过(因为是 Google 真实证书) |
10 | 客户端 | 本地处理 | 生成 Pre-Master Secret 用证书中的公钥 加密: {Pre-Master Secret}ₚᵤᵦₗᵢ꜀ |
只有 google.com 的私钥能解密此数据 |
11 | 客户端 | 代理 | [TLS ClientKeyExchange] {Pre-Master Secret}ₚᵤᵦₗᵢ꜀ |
客户端发送加密的密钥交换数据 |
12 | 代理 | 目标服务 | [TLS ClientKeyExchange] {Pre-Master Secret}ₚᵤᵦₗᵢ꜀ (原样转发) |
代理无法解密,只能转发"乱码" |
13 | 目标服务 | 本地处理 | 用私钥 解密得到 Pre-Master Secret 结合 ClientRandom 和 ServerRandom 计算出会话密钥(Session Key) |
会话密钥用于后续对称加密 |
14 | 目标服务 | 代理 | [TLS ChangeCipherSpec] [TLS Finished] (已加密) |
服务器通知:切换到加密模式,并发送加密的完成消息 |
15 | 代理 | 客户端 | [TLS ChangeCipherSpec] [TLS Finished] (原样转发) |
代理继续透传加密数据 |
16 | 客户端 | 本地处理 | 使用 Pre-Master Secret 、ClientRandom 、ServerRandom 独立计算出相同的会话密钥 |
客户端也进入加密模式 |
17 | 客户端 | 代理 | [TLS ChangeCipherSpec] [TLS Finished] (已加密) |
客户端确认握手完成,进入加密通信 |
18 | 代理 | 目标服务 | [TLS ChangeCipherSpec] [TLS Finished] (已加密) |
转发加密完成消息 |
19 | 客户端 ⇄ 代理 ⇄ 目标服务 | 双向加密通信开始 | [Application Data] (如 GET / HTTP/1.1 ) 全部使用会话密钥加密传输 |
代理只能看到加密的二进制流,无法解析内容 |
步骤 | 谁在做什么 | 是否需要 TLS |
---|---|---|
1 | 你发 CONNECT |
❌ 你和代理之间是 HTTP(可能明文) |
2 | 代理建 TCP 连接 | ❌ 代理和 Google 之间只是 TCP |
3 | 你发 Client Hello |
✅ 你和 Google 开始 TLS 握手 |
4 | 数据加密传输 | ✅ 你和 Google 之间的 TLS 加密 |
CONNECT
是 HTTP/1.1 的一个特殊方法,用于建立隧道。
信息 | 是否加密 | 说明 |
---|---|---|
✅ 具体路径和参数 /search?q=xxx |
✅ 是,加密 | 在 GET 请求中,属于应用层数据,被 TLS 加密 |
✅ HTTP 请求头 Cookie 、Authorization 等 |
✅ 是,加密 | 全部在 TLS 隧道内 |
❌ 目标域名(SNI) | ❌ 否,明文 | 在 Client Hello 中以明文发送(除非启用 ESNI/DoH) |
❌ IP 地址和端口 | ❌ 否,明文 | TCP/IP 层必须可见 |
❌ 流量大小和时间 | ❌ 否,可见 | 可用于流量分析 |
概念 | 一句话解释 |
---|---|
透传(Relay / Passthrough) | 中间节点"原样转发"字节流,不解析、不解密、不修改内容。 |
隧道(Tunnel) | 把一个协议的数据"藏"在另一个连接中,形成一条逻辑上的端到端通路。 |
你 代理 Google
| | |
|--- CONNECT --------->| | ← 控制指令(明文)
| |--- TCP --------------->| ← 代理建连接
| |<-- 200 ----------------| ← 隧道建立完成
|<-- 200 --------------| |
| | |
|--- [Client Hello] -->|--- [Client Hello] -->| ← 透传开始
| |<-- [Server Hello...] --| ← 透传
|<-- [Server Hello...] -| |
| | |
|--- {Pre-Master} ---->|--- {Pre-Master} ---->| ← 透传加密数据
| | |
|<=> [加密数据] <======>|<=> [加密数据] <=====>| ← 透传 HTTPS 流量
公司的CA证书
你(浏览器) 企业代理(HTTPS 解密代理) Google 服务器
| | |
|--- 访问 google.com ->| |
| | 拦截请求 |
| | ↓ |
| | 动态生成一个伪造的证书: |
| | - 域名:google.com |
| | - 公钥:代理生成的密钥对 |
| | - 签名者:Company CA |
| | - 用 Company CA 私钥签名 |
| | ↓ |
|<- 返回伪造证书 ------| |
| 浏览器验证: | |
| - 域名匹配 ✅ | |
| - CA 可信 ✅(你装了Company CA)|
| → 建立 TLS 连接(实际是和代理)|
| | |
|--- 发送加密数据 ------>| |
| | 代理解密数据(用自己的私钥)|
| | 查看内容(搜索词、Cookie) |
| | 重新加密 -> Google |
| |<- 加密响应 ----------------|
|<- 加密响应 ----------| |
条件 | 解决的问题 | 技术本质 |
---|---|---|
1. 代理劫持 | "如何插进来?" | 控制网络路径: - 公司防火墙强制转发 - DNS 劫持 / ARP 欺骗 - 恶意 Wi-Fi 伪基站 - 系统代理设置被篡改 |
2. CA 证书信任 | "如何让浏览器不报警?" | 打破加密信任: - 你安装了公司/恶意 CA 根证书 - 代理用该 CA 动态伪造目标网站证书 - 浏览器验证通过,显示"安全锁" |
🌐 Nginx 反向代理(表格版)
对比项 | Nginx 反向代理 | HTTPS 中间人攻击 |
---|---|---|
谁控制代理? | 网站所有者自己 | 攻击者 / 监控方 |
是否合法? | ✅ 合法,用于架构设计 | ❌ 非法或强制监控 |
CA 证书来源 | 正规 CA(如 Let's Encrypt) | 恶意或企业自建 CA |
用户是否知情? | 不需要知情(正常访问) | 不知情(被欺骗) |
加密是否被破坏? | ❌ 否,端到端仍安全 | ✅ 是,中间被解密 |
目的 | 负载均衡、安全、缓存、SSL 终止 | 监控、窃取、过滤 |
🌐 Vue Dev Proxy(表格版)
类型 | Vue Dev Proxy | Nginx 反向代理 | 中间人攻击(MITM) |
---|---|---|---|
使用场景 | 前端开发 | 生产环境部署 | 监控/窃取流量 |
运行环境 | localhost:5173 (开发) |
服务器(生产) | 客户端网络路径中 |
是否修改请求 | 转发 + 可重写路径 | 转发、负载均衡、缓存 | 解密、查看明文 |
是否涉及 HTTPS 解密 | ❌ 否 | ✅ 是(SSL 终止) | ✅ 是(伪造证书) |
是否需要安装 CA 证书 | ❌ 否 | ❌ 否(用正规证书) | ✅ 是(自建 CA) |
用户是否知情 | ✅ 是(开发者配置) | ✅ 是(运维配置) | ❌ 否(被欺骗) |
目的 | 解决开发跨域 | 提高性能、安全、架构 | 监控、过滤、窃取 |