
# 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 allow和http_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配置。• 反向代理客户端访问 SquidSquid 通过cache_peer ... originserver连接后端 Web。3.4 旧版本指令网上常见 Squid 2.x 配置含header_access、request_entities、dns_children、ignore_unknown_nameservers等旧指令。不同版本支持情况不同。迁移前执行squid -v和squid -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 adminexample.com关键点•src匹配客户端来源地址。•dst匹配目标服务器地址。•port匹配目标端口。•method CONNECT匹配 HTTPS 隧道请求。•http_access deny !Safe_ports拒绝未列入安全列表的端口。• 最后一条默认拒绝防止遗漏规则形成开放代理。4.2 监听端口显式代理http_port 3128只监听指定地址http_port 10.1.100.101:3128HTTP 透明代理实验http_port 3128 interceptintercept还需要服务器开启 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/squid4.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-expire、ignore-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)/limits4.8 反向代理配置假设后端 Web 为10.1.100.102:80http_port 80 accel vhost cache_peer 10.1.100.102 parent 80 0 no-query originserver nameweb01 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-port3128/tcp firewall-cmd --reload反向代理确需连接外部后端时先从审计日志确认 SELinux 拦截再按场景启用setsebool -P squid_connect_any 15. 验证结果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.comLinux 客户端curl -x http://10.1.100.101:3128 -I http://example.com curl -x http://10.1.100.101:3128 -I https://example.comWindows 客户端curl.exe -x http://10.1.100.101:3128 -I http://example.com Test-NetConnection 10.1.100.101 -Port 31285.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。