一、概念区别
HTTP正向代理(Forward Proxy)
定义 :位于客户端和目标服务器之间的代理服务器,代表客户端去访问外部资源。
通俗理解:就像你通过VPN访问国外网站,VPN就是你的正向代理。
-
你知道你在使用代理
-
代理知道你要访问哪个网站
-
目标网站不知道真实的客户端是谁,只知道代理服务器
正向代理配置本质:客户端 → 代理 → 互联网
client → proxy.example.com:8888 → target-website.com
TCP反向代理(Reverse Proxy)
定义 :位于客户端和后端服务器之间的代理服务器,代表后端服务器接收客户端请求。
通俗理解:就像公司的总机,外部电话先打到总机,再由总机转接到具体部门。
-
你不知道后端有多少台服务器
-
代理知道后端服务器的位置
-
客户端以为代理就是目标服务器
反向代理配置本质:互联网 → 代理 → 后端服务器
client → proxy.example.com:3306 → backend-db-server:13306
二、使用场景对比
HTTP正向代理典型场景
| 场景 | 说明 | 示例 |
|---|---|---|
| 1. 内网访问外网 | 企业内网服务器需要访问外部API/网站 | 内网服务器通过代理访问GitHub API |
| 2. 访问控制 | 限制员工上网行为 | 只允许访问工作相关网站 |
| 3. 内容过滤 | 屏蔽不安全网站 | 过滤恶意网站和广告 |
| 4. 缓存加速 | 缓存常用资源 | 缓存软件更新包,节省带宽 |
| 5. 匿名访问 | 隐藏客户端真实IP | 爬虫程序通过代理访问网站 |
# 企业内网正向代理配置示例
server {
listen 3128;
resolver 10.0.0.1; # 内网DNS
# 上班时间只允许工作网站
if ($time_hour >= 9 && $time_hour < 18) {
set $allowed 0;
if ($http_host ~* "(github|stackoverflow|docs\.microsoft)\.com") {
set $allowed 1;
}
if ($allowed = 0) {
return 403 "工作时间禁止访问娱乐网站";
}
}
proxy_pass http://$http_host$request_uri;
}
TCP反向代理典型场景
| 场景 | 说明 | 示例 |
|---|---|---|
| 1. 数据库端口转发 | 安全地暴露数据库到外网 | MySQL通过3306端口对外提供访问 |
| 2. 负载均衡 | 分发连接到多个后端服务器 | Redis集群的负载均衡 |
| 3. 高可用 | 故障转移和健康检查 | 主从数据库自动切换 |
| 4. 协议转换 | 不同协议间的转换 | SSL/TLS终止,明文转加密 |
| 5. 访问控制 | IP白名单限制 | 只允许特定IP访问数据库 |
# 生产环境MySQL反向代理配置
stream {
upstream mysql_cluster {
# 主数据库
server 10.0.1.10:3306 max_fails=3 fail_timeout=30s;
# 从数据库(备份)
server 10.0.1.11:3306 backup;
# 从数据库(读操作)
server 10.0.1.12:3306 backup;
}
server {
listen 3306;
proxy_pass mysql_cluster;
# SSL加密传输
ssl_preread on;
proxy_ssl on;
proxy_ssl_protocols TLSv1.2 TLSv1.3;
# 连接限制
proxy_connect_timeout 10s;
proxy_timeout 1h;
# IP白名单
allow 192.168.1.0/24;
allow 10.0.0.0/16;
deny all;
}
}
三、架构示意图
正向代理架构
客户端 (192.168.1.100)
↓ (配置代理)
正向代理服务器 (proxy.company.com:8888)
↓
目标网站 (api.github.com)
反向代理架构
外部客户端 (client.example.com)
↓
反向代理服务器 (db.company.com:3306)
↓
后端服务器集群 (mysql-01:3306, mysql-02:3306)
四、配置核心差异
HTTP正向代理核心配置
# 必须:动态目标解析
resolver 8.8.8.8;
proxy_pass http://$http_host$request_uri; # 目标由客户端决定
# 典型功能
- 访问控制(allow/deny)
- 内容缓存(proxy_cache)
- 请求修改(proxy_set_header)
TCP反向代理核心配置
# 必须:stream模块
stream {
upstream backend {
server backend1:3306;
}
server {
listen 3306;
proxy_pass backend; # 目标固定
}
}
# 典型功能
- 连接池管理
- SSL/TLS终止
- 健康检查
- 连接超时控制
五、选择指南
选择HTTP正向代理当:
✅ 需要让内网客户端访问外网资源
✅ 需要控制员工上网行为
✅ 需要缓存常用外部资源
✅ 需要隐藏客户端IP地址
✅ 需要突破地域限制访问
选择TCP反向代理当:
✅ 需要安全地暴露数据库到公网
✅ 需要对后端服务进行负载均衡
✅ 需要统一入口管理多个后端服务
✅ 需要实现高可用和故障转移
✅ 需要TCP层级的访问控制和监控
六、安全注意事项
正向代理安全
# 必须限制使用范围
allow 192.168.1.0/24; # 只允许内网使用
deny all;
# 建议添加认证
auth_basic "Proxy Authentication";
auth_basic_user_file /etc/nginx/htpasswd;
反向代理安全
# 数据库代理必须严格限制
stream {
server {
# IP白名单
allow 10.0.0.0/8;
deny all;
# SSL加密
ssl_certificate /path/to/cert.pem;
ssl_certificate_key /path/to/key.pem;
}
}
总结
| 维度 | HTTP正向代理 | TCP反向代理 |
|---|---|---|
| 代理方向 | 代理客户端 | 代理服务器 |
| 使用知晓 | 客户端知道代理 | 客户端不知道代理 |
| 目标地址 | 动态(客户端指定) | 固定(代理配置) |
| 协议层级 | HTTP应用层 | TCP传输层 |
| 主要用途 | 外网访问控制 | 内网服务暴露 |
简单记忆:
- 正向代理 :为客户端服务,帮客户端"走出去"
- 反向代理 :为服务器服务,帮服务器"接进来"
两者虽然都叫"代理",但解决的问题完全不同,是网络架构中两个重要的互补组件。