本文最后更新于15 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
一、正向代理 vs 反向代理:一句话概括
- 正向代理:帮客户端访问外部资源(比如翻墙、公司内网代理)。
举例:你通过VPN访问Google,VPN就是正向代理。
特点:客户端知道自己在用代理,服务器不知道真实客户端是谁。 - 反向代理:帮服务器接收客户端请求(比如负载均衡、隐藏真实服务器)。
举例:你访问淘宝,实际上请求被Nginx转发到后端的某台服务器,Nginx就是反向代理。
特点:客户端不知道代理的存在,服务器知道请求来自代理。 - 核心结论:正向代理隐藏了客户端地址,反向代理隐藏了服务端地址
二、正向代理详解
1. 什么是正向代理?
正向代理是 客户端 的代理,它帮客户端访问外部的网站或服务。典型用途:
- 翻墙(访问被封锁的网站)
- 公司内网代理(限制员工上网行为)
- 隐藏真实IP(爬虫、匿名访问)

2. 正向代理示例
场景:你在中国,想访问被屏蔽的 google.com,于是你使用一个国外的代理服务器(比如VPN)。
流程:
你的电脑 → VPN代理 → google.com
- Google 看到的是 VPN 的 IP,而不是你的真实 IP。
- 你需要 主动配置代理(比如在浏览器设置代理服务器地址)。
下面是一个 正向代理 的典型服务配置示例,使用 Squid(最流行的正向代理服务器)和 Nginx(部分支持正向代理)两种方式实现:
3. Squid 正向代理配置
Squid 是专门用于正向代理的软件,适合企业内网代理、访问控制等场景。
安装 Squid()
# Ubuntu/Debian
sudo apt update && sudo apt install squid
# CentOS/RHEL
sudo yum install squid
基础正向代理配置
编辑 /etc/squid/squid.conf:
# 监听 3128 端口(默认代理端口)
http_port 3128
# 允许内网 192.168.1.0/24 使用代理
acl local_net src 192.168.1.0/24
http_access allow local_net
# 禁止其他 IP 使用(可选)
http_access deny all
# 启用缓存(可选)
cache_dir ufs /var/spool/squid 100 16 256
启动 Squid
sudo systemctl start squid
sudo systemctl enable squid
客户端使用
- 浏览器设置:
代理服务器: 192.168.1.100(Squid服务器IP),端口3128 - 命令行测试:
curl --proxy http://192.168.1.100:3128 https://www.google.com
4. 实际应用示例
案例1:公司内网代理
- 需求:员工只能通过代理访问外网,管理员可监控流量。
- 方案:部署 Squid,配置 ACL 限制访问:
acl allowed_ips src 192.168.1.0/24
http_access allow allowed_ips
http_access deny all
案例2:爬虫代理池
- 需求:爬虫程序通过多个代理 IP 轮询请求,避免被封。
- 方案:用 Squid 结合多个出口 IP:
tcp_outgoing_address 203.0.113.1 http_port 3128
tcp_outgoing_address 203.0.113.2 http_port 3129
三、反向代理详解
1. 什么是反向代理?
反向代理是 服务器端 的代理,它接收客户端的请求,然后转发给后端服务器。典型用途:
- 负载均衡(把流量分发给多台服务器)
- 隐藏真实服务器(防止直接暴露后端IP)
- 缓存加速(比如CDN)
- HTTPS 卸载(由代理处理SSL加密)

2. 反向代理示例
场景:你访问 taobao.com,实际上请求被 Nginx 转发到后端的 3 台服务器之一。
流程:
你的电脑 → Nginx(反向代理) → 后端服务器1/2/3
- 你 不知道 真正处理请求的是哪台服务器。
- 淘宝的服务器知道请求来自 Nginx,而不是你的真实IP。
3. Nginx 反向代理配置
案例1:基本反向代理
server {
listen 443;
server_name sso.zngkpt.hjqdsj.cn;
location / {
proxy_pass http://172.200.171.150:1909;#代理给其他服务器
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
listen 443;
server_name worbec.zngkpt.hjqdsj.cn;
location / {
proxy_pass http://172.200.171.150:9010;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
效果:
- 访问
http://sso.zngkpt.hjqdsj.cn→ Nginx 自动转发到172.200.171.150等
案例2:负载均衡
upstream backend {
server 192.168.1.100:8080 weight=3; # 权重3,更多流量
server 192.168.1.101:8080 weight=1; # 权重1,较少流量
}
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
}
}
效果:
- 每 4 个请求,3 个发给
192.168.1.100,1 个发给192.168.1.101。
四、正向代理 vs 反向代理对比表
| 对比项 | 正向代理 | 反向代理 |
|---|---|---|
| 代理对象 | 代理客户端(如浏览器) | 代理服务端(如Web服务器) |
| 谁配置? | 客户端手动设置代理 | 服务器管理员配置 |
| 隐藏谁? | 隐藏客户端IP | 隐藏后端服务器IP |
| 典型用途 | 翻墙、匿名访问、公司内网管控 | 负载均衡、CDN、HTTPS卸载 |
| 常见工具 | Squid、VPN、Shadowsocks | Nginx、HAProxy、Cloudflare |
4.1正向代理和反向代理的区别
虽然正向代理服务器和反向代理服务器所处的位置都是客户端和真实服务器之间,所做的事情也都是把客户端的请求转发给服务器,再把服务器的响应转发给客户端,但是二者之间还是有一定的差异的。
1、正向代理其实是客户端的代理,帮助客户端访问其无法访问的服务器资源。反向代理则是服务器的代理,帮助服务器做负载均衡,安全防护等。
2、正向代理一般是客户端架设的,比如在自己的机器上安装一个代理软件。而反向代理一般是服务器架设的,比如在自己的机器集群中部署一个反向代理服务器。
3、正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端。而在反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的服务器。
4、正向代理和反向代理的作用和目的不同。正向代理主要是用来解决访问限制问题。而反向代理则是提供负载均衡、安全防护等作用。二者均能提高访问速度。
五、总结
- 正向代理 → 帮客户端访问外部(客户端配置,隐藏自己)。
例子:VPN翻墙、公司代理上网。
Nginx配置:主要用于HTTPS代理(HTTP代理建议用Squid)。 - 反向代理 → 帮服务器接收请求(服务端配置,隐藏后端)。
例子:Nginx负载均衡、CDN加速。
Nginx配置:proxy_pass转发到后端服务器。

