代理(Proxy)是网络中非常基础的技术。简单说,代理就是”中间人”——你不直接访问目标,而是让代理服务器帮你访问,再把结果传给你。
代理的本质
正常访问网站:
你的电脑 ──────────────→ 目标网站
直接发请求
通过代理访问:
你的电脑 ──→ 代理服务器 ──→ 目标网站
请帮我访问这个 代理发请求
我把结果还给你 ←─── 拿到结果
代理有两种:正向代理和反向代理。我们之前讲的 Nginx反向代理 是代理服务器那端的,这里讲的是客户端这边的正向代理。
正向代理 vs 反向代理
这两个名字很容易搞混,关键区别是代理谁:
| 正向代理(Forward Proxy) | 反向代理(Reverse Proxy) | |
|---|---|---|
| 代理谁 | 代理客户端(用户这边) | 代理服务端(网站那边) |
| 谁知道代理存在 | 客户端知道自己用了代理,目标网站不知道真正的客户端是谁 | 客户端不知道代理存在,以为直接访问的是网站 |
| 部署位置 | 靠近客户端(用户自己的机器、公司内网出口、VPS) | 靠近服务端(网站服务器前面,如Nginx) |
| 典型用途 | 访问控制、匿名访问、突破网络限制、抓包调试 | 负载均衡、HTTPS终结、缓存、隐藏后端服务器 |
| 例子 | HTTP代理、SOCKS代理、VPN | Nginx、Caddy、Cloudflare CDN |
正向代理:帮"我"出去办事 反向代理:帮"网站"接客
我 → 代理 → 网站 我 → 代理(Nginx) → 后端网站
代理是"我"找的 代理是"网站"部署的
网站不知道是我 我不知道后端是哪台服务器
代理怎么工作的(HTTP代理为例)
你配置了一个HTTP代理(比如地址是 1.2.3.4:8080),然后浏览器访问 http://example.com/page:
- 浏览器不直接连 example.com,而是连代理服务器
1.2.3.4:8080 - 浏览器发送一个特殊格式的请求给代理:
GET http://example.com/page HTTP/1.1 Host: example.com - 代理服务器收到后,自己去连 example.com,请求
/page - example.com 把页面返回给代理
- 代理再把页面转发给你的浏览器
对于HTTPS网站,流程稍微不同(用CONNECT方法建立隧道),原理一样——代理在中间帮你转发。
常见代理协议
1. HTTP 代理
最常见的代理类型,工作在HTTP层面。
- 端口通常是 8080、3128、8888
- 能代理HTTP和HTTPS流量
- 浏览器、系统、大部分应用都支持
- 代理服务器能看到你传输的内容(HTTP明文,HTTPS的话只能看到目标域名,看不到内容)
常见软件:Squid、Charles、Fiddler、mitmproxy
2. HTTPS 代理(HTTP CONNECT 隧道)
HTTP代理也能代理HTTPS,通过CONNECT方法:
客户端 → 代理:CONNECT example.com:443 HTTP/1.1
代理 → 客户端:HTTP/1.1 200 Connection Established
(之后代理只负责转发加密的TLS数据,看不到内容)
客户端 ↔ 代理 ↔ example.com (加密隧道)
代理建立了一条隧道,TLS加密在客户端和目标网站之间进行,代理只看到加密流量。
3. SOCKS 代理(SOCKS4/SOCKS5)
工作在更低层(传输层),不关心上层是什么协议。
- SOCKS4:支持TCP,不支持认证和UDP
- SOCKS5:支持TCP+UDP、多种认证方式、IPv6
- 端口通常是1080
- 能代理任何TCP/UDP流量(HTTP、FTP、SSH、游戏、邮件…),不只是网页
- 速度通常比HTTP代理快,因为协议更简单
- 应用程序需要显式支持SOCKS代理
常见软件:Shadowsocks(SOCKS5代理)、SSH动态端口转发(ssh -D)、Tor(SOCKS)
4. 透明代理(Transparent Proxy)
客户端不需要任何配置,完全不知道代理的存在,流量在网络层被网关/路由器重定向到代理服务器。
- 企业/学校网络常用
- 不需要用户手动设置代理
- 可以用来做缓存、内容过滤、访问日志
- 用户无感,无法绕过(除非加密流量)
协议对比
| 协议 | 工作层 | 能代理什么 | 需要客户端配置 | 看到内容 |
|---|---|---|---|---|
| HTTP代理 | 应用层 | HTTP/HTTPS网页 | ✅ | HTTP能看到,HTTPS只能看域名 |
| SOCKS5 | 会话层 | 任意TCP/UDP | ✅ | 看不到(不解析应用层) |
| 透明代理 | 网络层 | HTTP/HTTPS | ❌ | HTTP能看到 |
| VPN | 网络层 | 几乎所有流量 | 安装客户端 | VPN服务器能看到 |
代理 vs VPN vs Tor
这三个经常被混淆,其实层次不同:
| HTTP/SOCKS代理 | VPN | Tor | |
|---|---|---|---|
| 工作层级 | 应用层(需要应用支持) | 网络层(操作系统层面) | 应用层+网络层(多层加密) |
| 代理范围 | 只有配置了代理的应用走代理 | 系统所有流量都走VPN | 只有Tor浏览器走Tor网络 |
| 加密 | 代理到目标之间不一定加密 | 你到VPN服务器之间加密 | 多层加密,经过三个节点 |
| 速度 | 快 | 快(略慢于直连) | 慢(多跳转发) |
| 匿名性 | 低(代理服务器知道你是谁) | 中(VPN服务商知道你是谁) | 高(没人知道完整路径) |
| 典型用途 | 抓包调试、访问控制、企业内网 | 远程办公、安全使用公共WiFi | 高匿名需求 |
VPN 的本质
VPN(虚拟专用网络)不是”高级代理”,它做的事情是在你和VPN服务器之间建立一条加密隧道,让你的网络层流量全部走这条隧道:
你的电脑 ───加密隧道─── VPN服务器 ───→ 互联网
你的IP变成VPN服务器的IP
所有应用的流量都自动走隧道,不需要逐个配置
VPN最初的用途是让员工在外面安全地访问公司内网,不是用来匿名上网的,只是后来被拿来做这个用途。
代理在开发中的合法用途
1. 抓包调试
开发Web应用时,用代理工具查看HTTP请求和响应:
- Charles / Fiddler:HTTP/HTTPS抓包工具,可以看到所有请求细节
- mitmproxy:命令行抓包工具,支持脚本扩展
- 浏览器开发者工具:其实就是一个内置的抓包工具,但只抓浏览器自己的
要抓HTTPS包需要安装代理的根证书(中间人技术,MITM),代理自己生成证书,你信任它后它就能解密HTTPS流量。注意:这只能用于你自己的设备调试,不要随便安装别人的根证书。
2. 访问内网资源
很多公司有内部系统(GitLab、Jira、内部文档),外网不能直接访问。通过部署在内网的代理服务器(或VPN),远程员工可以访问内网资源。
家里电脑 → 公司代理/VPN → 公司内网GitLab
3. 请求转发与API调试
开发时可以用代理把请求转发到不同的后端环境(开发环境/测试环境/生产环境),或者修改请求/响应进行测试。
4. 缓存加速
企业/学校网络常用Squid做缓存代理,多个人访问同一个资源时,代理缓存一份,后面的人直接从代理拿,节省带宽。
代理匿名度分级
| 级别 | 特点 | 目标网站看到什么 |
|---|---|---|
| 透明代理(Transparent) | 不隐藏你的IP,告诉网站你用了代理 | 知道你的真实IP,知道你用了代理 |
| 匿名代理(Anonymous) | 隐藏你的IP,但告诉网站你用了代理 | 看到代理IP,知道有人用代理 |
| 高匿代理(Elite/High Anonymous) | 隐藏你的IP,不告诉网站你用了代理 | 看到代理IP,以为代理就是普通用户 |
代理服务器的部署位置
你的电脑/手机
│
├── 本机代理(localhost):Clash/V2Ray等客户端在本地开一个代理端口
│
├── 局域网代理:公司/学校内网的代理服务器(如192.168.1.100:3128)
│
└── 远程代理:VPS上搭建的代理服务器,通过公网访问
本机代理(如Clash)本质上是在你电脑上开了个代理端口,浏览器把请求发给本地代理,本地代理再决定直连还是转发到远程服务器。
常见相关工具
| 工具 | 作用 |
|---|---|
| Squid | 经典的HTTP缓存代理服务器,Linux上常用 |
| Nginx | 也可以配置成正向代理(虽然主要用来做反向代理) |
| mitmproxy | 开发者用的HTTPS抓包/修改工具 |
| Charles/Fiddler | 图形化HTTP抓包工具 |
| Clash/V2Ray/Sing-box | 代理客户端,支持多种代理协议,规则分流 |
| Proxifier | 让不支持代理的程序也能走代理(强制代理) |
| ssh -D | SSH动态端口转发,一键创建SOCKS5代理 |
SSH 动态端口转发:最简单的SOCKS代理
如果你有一台可以SSH登录的服务器,一行命令就能创建SOCKS5代理:
ssh -D 1080 -N root@你的服务器IP
这会在本地1080端口起一个SOCKS5代理,所有走这个代理的流量都会通过SSH隧道转发到你的服务器出去。不需要在服务器上安装任何软件,只要能SSH就行。
然后在浏览器里设置SOCKS5代理为 127.0.0.1:1080,访问网站的出口IP就是你服务器的IP。
这就是最基础的”代理”原理——流量通过SSH加密隧道绕到了另一台机器出去。
相关:02-反向代理 | 03-端口与HTTPS | 05-前端与后端 | 返回目录