CentOS 7 Squid 配置文件详解:端口、ACL、缓存、日志与反向代理

📅 2026/7/26 13:23:14 👁️ 阅读次数 📝 编程学习
CentOS 7 Squid 配置文件详解:端口、ACL、缓存、日志与反向代理

# CentOS 7 Squid 配置文件详解:端口、ACL、缓存、日志与反向代理

1. 服务介绍

Squid 是常用 HTTP/HTTPS 代理和缓存服务。管理员通过/etc/squid/squid.conf控制监听端口、允许访问的客户端、目标端口、缓存空间、日志以及反向代理后端。

配置文件不是参数堆积表。Squid 从上到下读取配置,访问控制规则按顺序匹配。理解指令作用和处理顺序,比直接复制旧配置更重要。本文基于 CentOS 7 软件包安装方式,整理常用、易错配置项。

2. 准备运行环境

• 操作系统:CentOS 7.x。

• 操作权限:root或具备sudo权限的管理员账号。

• 安装方式:YUM 安装squid软件包。

• 主配置文件:/etc/squid/squid.conf

• 默认端口:TCP3128

• 默认日志目录:/var/log/squid/

• 测试客户端:能访问 Squid 服务器,并可设置 HTTP/HTTPS 代理。

安装并备份原配置:

yum install -y squid cp -a /etc/squid/squid.conf /etc/squid/squid.conf.bak.$(date +%F-%H%M%S) squid -v

源码编译可能使用/usr/local/squid/。先确认实际路径,不能混用软件包路径和源码路径:

command -v squid rpm -ql squid | grep -E 'squid\.conf$|sbin/squid$'

3. 相关知识

3.1 配置检查和重载

修改后先检查语法,再重载服务。squid -k parse能发现未知指令、参数拼写和文件路径错误。

squid -k parse systemctl reload squid

新增磁盘缓存目录时执行squid -z初始化。

3.2 ACL 和 http_access 顺序

acl只定义匹配条件。真正执行允许或拒绝的是http_access allowhttp_access deny

Squid 按顺序检查http_access,命中后停止匹配。应先拒绝危险端口,再放业务允许,最后使用http_access deny all默认拒绝。不要使用无边界的http_access allow all暴露开放代理。

3.3 代理模式

• 显式正向代理:客户端主动填写 Squid 地址和端口。

• 透明代理:Squid 作为客户端网关,通过转发规则接收 HTTP 请求;CentOS 7 常用intercept,旧配置中的transparent是历史写法。

• HTTPS 代理:显式代理通常使用CONNECT隧道。HTTPS 解密涉及证书信任和隐私边界,不应直接照搬旧版ssl-bump配置。

• 反向代理:客户端访问 Squid,Squid 通过cache_peer ... originserver连接后端 Web。

3.4 旧版本指令

网上常见 Squid 2.x 配置含header_accessrequest_entitiesdns_childrenignore_unknown_nameservers等旧指令。不同版本支持情况不同。迁移前执行squid -vsquid -k parse,不要整份覆盖历史配置。

4. 实验步骤

4.1 最小安全配置

以下配置允许10.1.100.0/24使用显式代理,并拒绝其他来源。网段按实际环境修改:

http_port 3128 acl localhost src 127.0.0.1/32 ::1 acl localnet src 10.1.100.0/24 acl SSL_ports port 443 acl Safe_ports port 80 acl Safe_ports port 443 acl Safe_ports port 21 acl Safe_ports port 1025-65535 acl CONNECT method CONNECT http_access deny !Safe_ports http_access deny CONNECT !SSL_ports http_access allow localhost http_access allow localnet http_access deny all visible_hostname proxy01.example.com cache_mgr admin@example.com

关键点:

src匹配客户端来源地址。

dst匹配目标服务器地址。

port匹配目标端口。

method CONNECT匹配 HTTPS 隧道请求。

http_access deny !Safe_ports拒绝未列入安全列表的端口。

• 最后一条默认拒绝,防止遗漏规则形成开放代理。

4.2 监听端口

显式代理:

http_port 3128

只监听指定地址:

http_port 10.1.100.101:3128

HTTP 透明代理实验:

http_port 3128 intercept

intercept还需要服务器开启 IPv4 转发,并通过 firewalld 或 iptables 把客户端 TCP 80 请求重定向到 Squid。只改http_port不会自动完成透明代理。

4.3 ACL 常用写法

按来源网段允许:

acl office src 10.1.100.0/24 http_access allow office

按目标域名拒绝:

acl blocked_domains dstdomain .example.org .example.net http_access deny blocked_domains

按时间允许办公访问:

acl worktime time MTWHF 08:30-18:00 http_access allow office worktime

限制单个客户端并发连接数:

acl too_many_connections maxconn 128 http_access deny too_many_connections

同一条http_access后的多个 ACL 必须同时满足;多条http_access按顺序判断。域名 ACL 依赖 DNS,排障时应检查服务器 DNS。

4.4 缓存内存和磁盘目录

cache_mem 256 MB maximum_object_size_in_memory 512 KB minimum_object_size 0 KB maximum_object_size 64 MB cache_replacement_policy heap LFUDA memory_replacement_policy heap GDSF cache_dir ufs /var/spool/squid 5000 16 256 cache_swap_low 90 cache_swap_high 95

cache_mem是热点对象内存目标值,不是 Squid 进程总内存上限。

cache_dir ... 5000 16 256表示约 5000 MB 磁盘缓存、16 个一级目录、每个一级目录下 256 个二级目录。

• 修改cache_dir后确认目录属主,并执行squid -z

• 动态内容、带鉴权响应和明确禁止缓存的响应不一定进入缓存。

install -d -o squid -g squid /var/spool/squid squid -z du -sh /var/spool/squid

4.5 缓存刷新策略

refresh_pattern ^ftp: 1440 20% 10080 refresh_pattern ^gopher: 1440 0% 1440 refresh_pattern -i (/cgi-bin/|\?) 0 0% 0 refresh_pattern . 0 20% 4320

三个时间参数依次表示最小新鲜时间、基于对象年龄计算的百分比、最大新鲜时间。不要随意使用override-expireignore-reload,否则可能返回过期内容。

4.6 日志配置

access_log /var/log/squid/access.log squid cache_log /var/log/squid/cache.log cache_store_log none logfile_rotate 10

access.log:客户端请求、响应状态和缓存命中信息。

cache.log:启动、解析、磁盘缓存和运行错误。

cache_store_log none:关闭对象写入/删除日志,减少无用 I/O。

squid -k rotate ls -lh /var/log/squid/

4.7 运行用户和文件描述符

cache_effective_user squid cache_effective_group squid max_filedesc 4096 coredump_dir /var/spool/squid

高并发时还要检查 systemd 限制:

systemctl show squid -p LimitNOFILE cat /proc/$(pgrep -o squid)/limits

4.8 反向代理配置

假设后端 Web 为10.1.100.102:80

http_port 80 accel vhost cache_peer 10.1.100.102 parent 80 0 no-query originserver name=web01 acl site dstdomain proxy.example.com cache_peer_access web01 allow site cache_peer_access web01 deny all http_access allow site http_access deny all

accel启用反向代理加速模式。

vhost根据 Host 头处理虚拟主机。

originserver表示 peer 是源站,不是上级代理。

cache_peer_access控制请求发往哪个后端。

生产环境还应配置 DNS、后端健康检查、TLS 终止和防火墙策略。不要在同一配置中无边界混用正向代理allow all与反向代理规则。

4.9 应用配置

squid -k parse systemctl enable --now squid systemctl reload squid firewall-cmd --permanent --add-port=3128/tcp firewall-cmd --reload

反向代理确需连接外部后端时,先从审计日志确认 SELinux 拦截,再按场景启用:

setsebool -P squid_connect_any 1

5. 验证结果

5.1 服务端检查

squid -k parse systemctl status squid --no-pager ss -lntp | grep ':3128' journalctl -u squid -n 50 --no-pager tail -n 50 /var/log/squid/cache.log

预期:语法无错误,服务为active (running),TCP 3128 正常监听,cache.log无持续报错。

5.2 客户端代理测试

服务器本机:

curl -x http://127.0.0.1:3128 -I http://example.com

Linux 客户端:

curl -x http://10.1.100.101:3128 -I http://example.com curl -x http://10.1.100.101:3128 -I https://example.com

Windows 客户端:

curl.exe -x http://10.1.100.101:3128 -I http://example.com Test-NetConnection 10.1.100.101 -Port 3128

5.3 查看访问和缓存结果

tail -f /var/log/squid/access.log squidclient -h 127.0.0.1 -p 3128 mgr:info

访问日志出现客户端地址和目标 URL,说明请求已到达 Squid。TCP_MISS表示从源站获取,TCP_HIT表示从缓存返回。首次访问通常是MISS,重复访问需结合响应缓存头判断能否命中。

5.4 常见故障定位

# 配置拼写或旧指令错误 squid -k parse # 服务启动失败 journalctl -u squid -n 100 --no-pager # 客户端连不到端口 ss -lntp | grep ':3128' firewall-cmd --list-ports # 请求被 ACL 拒绝 tail -n 100 /var/log/squid/access.log # 代理服务器无法解析域名 getent hosts example.com

出现TCP_DENIED/403时,优先检查客户端源地址是否匹配允许 ACL,以及对应允许规则是否位于最终拒绝之前。连接超时则检查 Squid 服务器 DNS、默认路由和上游网络,不要只反复修改 ACL。