Squid 的核心功能与用途
在开始配置之前,了解 Squid 能做什么非常重要:

- 缓存加速:这是 Squid 最核心的功能,当多个用户访问同一个网站时,Squid 会将网页、图片、CSS/JS 文件等静态内容存储在本地,后续用户的请求可以直接从 Squid 服务器获取,而无需再次访问原始网站,从而大大加快访问速度,并减少对外部带宽的占用。
- 访问控制与安全:
- ACL (Access Control List):可以基于 IP 地址、域名、时间、端口、用户/密码、文件类型等规则来控制哪些用户可以访问哪些网站。
- 内容过滤:可以阻止用户访问特定类型的网站(如社交媒体、成人内容)或下载特定类型的文件(如 .exe, .mp4)。
- 透明代理:客户端无需在浏览器中配置代理,所有网络流量都会被 Squid 自动拦截和代理,这对于企业环境非常方便,可以统一管理所有员工的上网行为。
- 带宽管理:可以通过 ACL 和
delay_pools功能限制特定用户或特定网站的带宽使用,防止个别用户占用过多带宽。 - 反向代理:Squid 也可以作为 Web 服务器的“前端”,它接收来自互联网的请求,并将请求转发给后端的 Web 服务器(如 Nginx, Apache),这样可以缓存动态内容,减轻后端服务器的压力,并提高网站性能和可用性。
- 日志记录与分析:Squid 会详细记录所有通过它的访问请求,这些日志可以用于流量分析、安全审计和用户行为分析。
安装 Squid
以主流的 Debian/Ubuntu 和 CentOS/RHEL 为例。
Debian / Ubuntu
# 更新软件包列表 sudo apt update # 安装 squid sudo apt install squid -y
CentOS / RHEL / Rocky Linux / AlmaLinux
# 安装 EPEL 仓库(如果尚未安装) sudo dnf install epel-release -y # 安装 squid sudo dnf install squid -y
安装完成后,Squid 服务会自动启动,你可以检查其状态:
# 检查状态 sudo systemctl status squid # 如果没有启动,可以手动启动 sudo systemctl start squid # 设置开机自启 sudo systemctl enable squid
基本配置
Squid 的主配置文件位于 /etc/squid/squid.conf(Debian/Ubuntu)或 /etc/squid/squid.conf(CentOS/RHEL),这个文件非常长,包含大量注释和示例,最好的方式是先备份原文件,然后从头开始或修改关键部分。
# 备份原配置文件 sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak
修改监听端口和 IP 地址
默认情况下,Squid 监听所有网络接口(http_port 3128),你可以修改它,例如只监听内网 IP。

# 在 /etc/squid/squid.conf 中找到 http_port 行 # 默认可能是 http_port 3128 # 修改为只监听内网 IP,192.168.1.100 http_port 192.168.1.100:3128
配置访问控制
这是 Squid 最强大的部分,我们通过 ACL 定义规则,然后用 http_access 应用这些规则。
ACL 定义规则:
# 定义一个名为 "local_network" 的 ACL,包含内网网段 acl local_network src 192.168.1.0/24 # 定义一个名为 "blocked_sites" 的 ACL,包含要屏蔽的网站 acl blocked_sites dstdomain .facebook.com .twitter.com .youtube.com # 定义一个名为 "work_hours" 的 ACL,允许访问的时间范围 # 时间格式是 HH:MM - HH:MM acl work_hours time M T W T F 8:30-17:30
http_access 应用规则:
注意:规则的匹配顺序是从上到下,一旦匹配到一条规则,就立即执行,后续规则将被忽略。DENY 规则通常放在 ALLOW 规则之后。

# 允许 local_network 网段的所有用户访问 http_access allow local_network # 在工作时间内,允许访问所有网站 http_access allow work_hours # 禁止访问 blocked_sites 列表中的网站 http_access deny blocked_sites # 默认策略:拒绝所有其他访问 # 这条规则非常重要!它作为安全网关,确保未明确允许的访问都被拒绝。 http_access deny all
设置缓存目录(可选)
Squid 默认会使用磁盘空间进行缓存,你可以调整缓存大小和位置。
# 在配置文件中找到 cache_dir 行,通常是以下格式 # 格式: cache_dir ufs /path/to/cache/directory MB_level_1 MB_level_2 max_object_size # 设置一个 4GB 的缓存目录 cache_dir ufs /var/spool/squid 4096 16 256
修改后需要创建缓存目录并重新初始化它:
# 创建目录 sudo mkdir -p /var/spool/squid # 设置正确的权限 sudo chown -R squid:squid /var/spool/squid # 重新初始化缓存(会清空所有旧缓存) sudo squid -z
启动、重启与测试
检查配置文件语法
在重启服务前,务必检查配置文件是否有语法错误:
sudo squid -k parse # 或者 sudo squid -k check
如果没有任何输出,说明语法正确。
重启 Squid 服务
sudo systemctl restart squid
测试代理
使用 curl 命令行工具
在另一台客户端机器上,确保它能访问 Squid 服务器的 IP 和端口。
# -x 指定代理服务器地址 curl -x http://192.168.1.100:3128 http://www.example.com
Squid 配置正确且允许该客户端访问,命令会返回 example.com 的网页内容。
在浏览器中配置代理
在客户端电脑的浏览器设置中,手动配置代理服务器:
- 代理服务器地址:
168.1.100 - 端口:
3128
配置后,访问任意网站,观察是否能正常打开。
高级配置:透明代理
透明代理让客户端“感觉不到”代理的存在,无需在浏览器或系统中做任何设置,它通常通过 Linux 的 iptables (或 nftables) 网络防火墙来实现。
假设 Squid 服务器有两个网卡:
eth0(内网):168.1.100eth1(外网):0.113.10
配置步骤:
-
启用 IP 转发
编辑
/etc/sysctl.conf文件,添加或取消注释以下行:net.ipv4.ip_forward=1
然后应用更改:
sudo sysctl -p
-
配置 Squid 监听透明代理端口
在 Squid 配置文件中,添加一个
http_port条目,并标记为transparent。# 监听来自内网的 80 端口流量,并透明代理 http_port 192.168.1.100:80 vhost vport transparent # 监听来自内网的 443 端口流量,并透明代理(需要 SSL Bump 功能,更复杂) # http_port 192.168.1.100:443 vhost vport transparent ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB
对于初学者,先配置 HTTP (80端口) 的透明代理即可。
-
配置
iptables规则在 Squid 服务器上,使用
iptables将内网访问外网的流量重定向到 Squid 的 3128 端口。# 清空现有规则(谨慎操作) iptables -F iptables -t nat -F # 设置 NAT 策略,允许 IP 转发 iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT # 关键步骤:将内网访问外网 80 端口的流量重定向到 Squid 的 3128 端口 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
注意:这里的
iptables规则是一个示例,你需要根据你的实际网卡名称(eth0,eth1)和 Squid 的监听端口进行调整。 -
保存
iptables规则iptables规则在重启后会丢失,需要保存下来。- Debian/Ubuntu:
sudo apt install iptables-persistent sudo netfilter-persistent save
- CentOS/RHEL:
sudo dnf install iptables-services sudo service iptables save
- Debian/Ubuntu:
完成以上配置后,内网中的任何一台电脑,只要其网关指向 Squid 服务器,访问任何网站时,流量都会被自动 Squid 代理,而无需用户做任何设置。
排错与日志
Squid 工作不正常,日志是最好的朋友。
-
主日志文件:
/var/log/squid/access.log- 记录了所有通过 Squid 的请求,格式类似于 Web 服务器日志。
- 排错:查看最新的几行,看是否有
TCP_DENIED或ACCESS_DENIED等错误信息,这通常意味着 ACL 规则阻止了请求。
-
缓存日志:
/var/log/squid/cache.log- 记录了 Squid 内部运行状态、启动信息、警告和错误。
- 排错:当 Squid 启动失败或配置有严重问题时,这里会有详细的错误信息。
-
错误页面:
/var/log/squid/store.log记录了 Squid 缓存对象的存储和检索情况。
你可以使用 tail 命令实时监控日志:
sudo tail -f /var/log/squid/access.log sudo tail -f /var/log/squid/cache.log
Squid 是一个非常灵活的工具,从简单的缓存加速到复杂的企业级网络安全网关都能胜任,掌握其核心在于:
- 理解
http_port:定义 Squid 如何接收请求。 - 精通
acl和http_access:这是实现访问控制的核心。 - 善用日志:快速定位问题。
- 了解透明代理:在企业环境中,这是最常见的部署方式。
希望这份详细的指南能帮助你顺利上手 Squid!
