代理(Proxy)是网络中非常基础的技术。简单说,代理就是”中间人”——你不直接访问目标,而是让代理服务器帮你访问,再把结果传给你。

代理的本质

正常访问网站:

你的电脑 ──────────────→ 目标网站
        直接发请求

通过代理访问:

你的电脑 ──→ 代理服务器 ──→ 目标网站
        请帮我访问这个     代理发请求
        我把结果还给你 ←─── 拿到结果

代理有两种:正向代理反向代理。我们之前讲的 Nginx反向代理 是代理服务器那端的,这里讲的是客户端这边的正向代理。

正向代理 vs 反向代理

这两个名字很容易搞混,关键区别是代理谁

正向代理(Forward Proxy)反向代理(Reverse Proxy)
代理谁代理客户端(用户这边)代理服务端(网站那边)
谁知道代理存在客户端知道自己用了代理,目标网站不知道真正的客户端是谁客户端不知道代理存在,以为直接访问的是网站
部署位置靠近客户端(用户自己的机器、公司内网出口、VPS)靠近服务端(网站服务器前面,如Nginx)
典型用途访问控制、匿名访问、突破网络限制、抓包调试负载均衡、HTTPS终结、缓存、隐藏后端服务器
例子HTTP代理、SOCKS代理、VPNNginx、Caddy、Cloudflare CDN
正向代理:帮"我"出去办事          反向代理:帮"网站"接客
我 → 代理 → 网站                 我 → 代理(Nginx) → 后端网站
代理是"我"找的                     代理是"网站"部署的
网站不知道是我                     我不知道后端是哪台服务器

代理怎么工作的(HTTP代理为例)

你配置了一个HTTP代理(比如地址是 1.2.3.4:8080),然后浏览器访问 http://example.com/page

  1. 浏览器不直接连 example.com,而是连代理服务器 1.2.3.4:8080
  2. 浏览器发送一个特殊格式的请求给代理:
    GET http://example.com/page HTTP/1.1
    Host: example.com
    
  3. 代理服务器收到后,自己去连 example.com,请求 /page
  4. example.com 把页面返回给代理
  5. 代理再把页面转发给你的浏览器

对于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/HTTPSHTTP能看到
VPN网络层几乎所有流量安装客户端VPN服务器能看到

代理 vs VPN vs Tor

这三个经常被混淆,其实层次不同:

HTTP/SOCKS代理VPNTor
工作层级应用层(需要应用支持)网络层(操作系统层面)应用层+网络层(多层加密)
代理范围只有配置了代理的应用走代理系统所有流量都走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 -DSSH动态端口转发,一键创建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-端口与HTTPS05-前端与后端返回目录