使用 Squid 作为 透明代理(Transparent Proxy),可以实现客户端无需配置代理,直接将 HTTP 请求转发给 Squid,由 Squid 代为转发请求并缓存内容,从而提升访问效率、审计流量或进行访问控制。
一、透明代理工作原理
透明代理位于客户端和服务器之间,拦截客户端请求(如 HTTP)并将其透明地转发。客户端认为自己直接访问了目标网站,但其实是通过 Squid 转发的。
主要流程:
-
客户端访问网页(如
http://example.com)。 -
网络层(如防火墙或路由器)将请求重定向到 Squid 所在的服务器端口(如
3128)。 -
Squid 收到请求后提取原始目标地址并转发。
-
Squid 返回响应,客户端并不知情。
二、使用场景
-
校园网/企业内网:对网页访问进行审计、内容过滤。
-
内容缓存加速:减少带宽使用。
-
上网行为管理:与 ACL、日志结合进行控制。
三、部署步骤详解(以 Ubuntu 20.04 为例)
1. 安装 Squid
sudo apt update
sudo apt install squid -y
2. 修改配置文件 /etc/squid/squid.conf
# 允许的客户端网段
acl localnet src 192.168.1.0/24
# 默认是 http_port 3128
# 改为透明模式
http_port 3128 transparent
# 允许访问
http_access allow localnet
http_access deny all
✅ transparent 表示透明代理模式
✅ localnet 指定允许访问的网段
3. 配置 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1
写入配置文件:
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
4. 配置防火墙 / iptables 重定向规则
假设:
-
Squid 服务器 IP:192.168.1.100
-
网关设备也是这台机器
-
监听 HTTP 流量并转发到 3128
# 将 HTTP 请求重定向到 Squid 端口
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 \
-j REDIRECT --to-port 3128
如果你启用了 ufw 防火墙,需要允许端口:
sudo ufw allow 3128/tcp
5. 启动或重启 Squid 服务
sudo systemctl restart squid
sudo systemctl enable squid
6. 验证
在客户端(192.168.1.0/24 网段)上打开浏览器访问网页,例如 http://example.com,如果成功且服务器 access.log 有记录说明透明代理正常。
sudo tail -f /var/log/squid/access.log
四、常见问题排查
| 问题 | 可能原因 |
|---|---|
| 浏览器打不开网页 | iptables 未正确转发,或 Squid 配置未生效 |
| access.log 没有日志 | 请求未被转发至 Squid(检查路由/iptables) |
| 客户端是 HTTPS | Squid 透明代理仅支持 HTTP,处理 HTTPS 需 SSL Bump(复杂,非默认支持) |
| 连接被拒绝 | 确认客户端 IP 属于 acl localnet 定义范围 |
五、HTTPS 的说明
透明代理默认不能处理 HTTPS(443 端口)请求,因为 HTTPS 使用 TLS 加密,Squid 无法查看目标主机。要代理 HTTPS,需启用 SSL Bump,但这涉及中间人攻击原理,需客户端信任代理证书,部署复杂且涉及隐私。
六、关闭透明代理(恢复配置)
# 删除 iptables 转发规则
sudo iptables -t nat -D PREROUTING -i eth0 -p tcp --dport 80 \
-j REDIRECT --to-port 3128
并注释掉 squid.conf 中的 transparent 设置即可。

2250

被折叠的 条评论
为什么被折叠?



