强曰为道
与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

Squid 完全指南 / 16 - 最佳实践

第十六章:最佳实践

16.1 配置规范

16.1.1 配置文件组织

# /etc/squid/squid.conf — 推荐的配置结构

# ============================================================
# Section 1: 网络端口
# ============================================================
http_port 3128
# https_port 443 ...

# ============================================================
# Section 2: ACL 定义
# ============================================================
# --- 网络 ACL ---
acl localnet src 192.168.0.0/16
acl localhost src 127.0.0.0/8 ::1

# --- 端口 ACL ---
acl Safe_ports port 80 443 21 70 8080 8443
acl SSL_ports port 443 8443

# --- 方法 ACL ---
acl CONNECT method CONNECT

# --- 时间 ACL ---
acl work_hours time MTWHF 08:30-18:00

# --- 认证 ACL ---
acl auth proxy_auth REQUIRED

# --- 内容 ACL ---
acl blocked_sites dstdomain "/etc/squid/blocked.txt"

# ============================================================
# Section 3: 认证配置
# ============================================================
auth_param basic program /usr/lib/squid/basic_ncsa_auth /etc/squid/passwd
auth_param basic children 5
auth_param basic realm Proxy
auth_param basic credentialsttl 2 hours

# ============================================================
# Section 4: 访问控制规则
# ============================================================
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow localnet
http_access deny !auth
http_access deny blocked_sites
http_access deny all

# ============================================================
# Section 5: 缓存配置
# ============================================================
cache_dir ufs /var/spool/squid 10000 16 256
cache_mem 512 MB
maximum_object_size 128 MB

refresh_pattern -i \.(jpg|png|gif|css|js)$ 1440 90% 43200
refresh_pattern . 60 20% 1440

# ============================================================
# Section 6: 日志配置
# ============================================================
access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log

# ============================================================
# Section 7: 安全配置
# ============================================================
via off
forwarded_for delete
httpd_suppress_version_string on
visible_hostname proxy.example.com

# ============================================================
# Section 8: 性能参数
# ============================================================
# memory_replacement_policy heap GDSF
# cache_replacement_policy heap GDSF
# pipeline_prefetch on

16.1.2 配置管理

# 版本控制配置文件
cd /etc/squid
git init
git add squid.conf
git commit -m "Initial squid config"

# 修改前备份
cp squid.conf squid.conf.$(date +%Y%m%d%H%M%S)

# 修改后验证
squid -k parse && echo "Config OK" || echo "Config ERROR"

# 热重载
squid -k reconfigure

# 配置差异比较
diff squid.conf.bak squid.conf

16.2 企业正向代理方案

16.2.1 架构设计

┌──────────────────────────────────────────────────────────────┐
│                    企业正向代理架构                              │
│                                                               │
│  ┌─────────┐  ┌─────────┐  ┌─────────┐                     │
│  │ 员工PC  │  │ 员工PC  │  │ 员工PC  │                     │
│  └────┬────┘  └────┬────┘  └────┬────┘                     │
│       └────────────┼────────────┘                            │
│                    ▼                                          │
│  ┌──────────────────────────────────────────┐               │
│  │           PAC / WPAD 自动配置              │               │
│  └──────────────────┬───────────────────────┘               │
│                     ▼                                         │
│  ┌──────────────────────────────────────────┐               │
│  │      Squid 集群(正向代理)                │               │
│  │  ┌──────────┐  ┌──────────┐              │               │
│  │  │ Squid-1  │  │ Squid-2  │  ← 负载均衡  │               │
│  │  │ (Active) │  │ (Standby)│              │               │
│  │  └────┬─────┘  └────┬─────┘              │               │
│  └───────┼──────────────┼────────────────────┘               │
│          └──────┬───────┘                                     │
│                 ▼                                              │
│  ┌──────────────────────────────────────────┐               │
│  │        上游代理 / 互联网出口               │               │
│  └──────────────────────────────────────────┘               │
└──────────────────────────────────────────────────────────────┘

16.2.2 高可用配置

#!/bin/bash
# squid-ha-failover.sh — Squid 高可用故障转移脚本

PRIMARY="192.168.1.10"
SECONDARY="192.168.1.11"
VIP="192.168.1.1"

check_squid() {
    curl -s -o /dev/null -w "%{http_code}" \
        --max-time 5 \
        http://$1:3128/squid-internal-mgr/info
}

# 检查主节点
if [ "$(check_squid $PRIMARY)" != "200" ]; then
    echo "Primary Squid is down, switching to secondary"
    # 更新 VIP 指向
    ip addr del $VIP/24 dev eth0 2>/dev/null
    ssh root@$SECONDARY "ip addr add $VIP/24 dev eth0"
fi

16.3 企业反向代理/CDN 方案

16.3.1 多级缓存架构

┌──────────────────────────────────────────────────────┐
│               CDN 多级缓存架构                         │
│                                                       │
│  Level 1: 边缘节点(Squid)                           │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐             │
│  │ 北京节点  │ │ 上海节点  │ │ 广州节点  │             │
│  └────┬─────┘ └────┬─────┘ └────┬─────┘             │
│       └────────────┼────────────┘                     │
│                    ▼                                   │
│  Level 2: 区域节点(Squid 父代理)                     │
│  ┌──────────┐ ┌──────────┐                           │
│  │ 华北区域  │ │ 华南区域  │                           │
│  └────┬─────┘ └────┬─────┘                           │
│       └────────────┼───────────┘                      │
│                    ▼                                   │
│  Level 3: 源站集群                                    │
│  ┌──────────────────────────────────┐                │
│  │  Web Server 1 | 2 | 3 | ...     │                │
│  └──────────────────────────────────┘                │
└──────────────────────────────────────────────────────┘

16.3.2 边缘节点配置

# 边缘节点配置
http_port 80
https_port 443 cert=/etc/squid/ssl/site.pem

# 区域父代理
cache_peer parent-huabei.example.com parent 80 0 \
    no-query default weight=10

# 缓存配置
cache_dir aufs /var/spool/squid 50000 256 4096
cache_mem 4096 MB
maximum_object_size 256 MB

# 缓存策略
refresh_pattern -i \.(jpg|png|gif|css|js|woff2|mp4)$ 1440 90% 43200
refresh_pattern . 60 20% 1440

# 安全
via off
forwarded_for delete

16.4 安全审计方案

16.4.1 完整审计配置

# /etc/squid/squid.conf — 审计模式配置

# 详细日志格式(包含完整请求信息)
logformat audit %ts.%03tu %6tr %>a %[un %Ss/%03>Hs %<st %rm %ru %Sh/%<a %mt %>ha{User-Agent} %ssl::>sni
access_log /var/log/squid/access.log audit

# 不遗漏任何请求
# 不使用 access_log ... squid !internal 过滤

# 保留完整请求头(调试用,生产环境慎用)
# log_mime_hdrs on

# 日志轮转 180 天(合规要求)
# logrotate 配置 rotate 180

# SSL Bump 解密 HTTPS(需要合规授权)
# http_port 3129 ssl-bump cert=...
# ssl_bump bump all

# 禁止删除日志
# 通过文件系统权限限制

16.5 容量规划指南

16.5.1 用户规模与硬件对应

用户数CPU内存磁盘 (缓存)网络架构
502核4 GB200 GB SSD1 Gbps单节点
2004核8 GB500 GB SSD1 Gbps单节点
5008核16 GB1 TB SSD1 Gbps主备
100016核32 GB2 TB SSD10 Gbps集群(2节点)
500032核64 GB4 TB SSD10 Gbps集群(3-5节点)
10000+64核+128 GB+分布式多链路多级缓存

16.5.2 带宽计算

日均用户数 × 平均请求数 × 平均对象大小 = 日总流量

示例(1000 企业用户):
1000 × 300 请求/天 × 150 KB = 45 GB/天
45 GB / 86400 秒 ≈ 520 KB/s ≈ 4.2 Mbps 平均
峰值带宽:4.2 Mbps × 3 ≈ 13 Mbps

缓存节省(假设 60% 命中率):
实际出口带宽需求:13 Mbps × (1 - 0.6) = 5.2 Mbps

16.6 备份与恢复

16.6.1 备份策略

#!/bin/bash
# squid-backup.sh — Squid 备份脚本

BACKUP_DIR="/backup/squid/$(date +%Y%m%d)"
mkdir -p "$BACKUP_DIR"

# 备份配置
tar czf "$BACKUP_DIR/config.tar.gz" /etc/squid/

# 备份密码文件
cp /etc/squid/passwd "$BACKUP_DIR/"
cp /etc/squid/ssl/* "$BACKUP_DIR/" 2>/dev/null

# 备份缓存索引(不备份缓存数据,太大)
cp /var/spool/squid/swap.state "$BACKUP_DIR/" 2>/dev/null

# 备份日志(最近 7 天)
find /var/log/squid/ -name "*.log*" -mtime -7 \
    -exec cp {} "$BACKUP_DIR/" \;

# 清理 30 天前的备份
find /backup/squid/ -mtime +30 -exec rm -rf {} \; 2>/dev/null

echo "Backup completed: $BACKUP_DIR"

16.6.2 恢复步骤

#!/bin/bash
# squid-restore.sh — Squid 恢复脚本

BACKUP_DIR="$1"

if [ -z "$BACKUP_DIR" ]; then
    echo "Usage: $0 /backup/squid/20260510"
    exit 1
fi

# 停止服务
sudo systemctl stop squid

# 恢复配置
sudo tar xzf "$BACKUP_DIR/config.tar.gz" -C /

# 恢复密码文件
sudo cp "$BACKUP_DIR/passwd" /etc/squid/

# 恢复 SSL 证书
sudo cp "$BACKUP_DIR"/*.pem /etc/squid/ssl/ 2>/dev/null

# 检查配置
sudo squid -k parse

# 重建缓存目录(如果缓存数据丢失)
sudo squid -z

# 启动
sudo systemctl start squid

echo "Restore completed from: $BACKUP_DIR"

16.7 变更管理

16.7.1 变更流程

1. 需求评审
   └─ 评估影响范围、风险等级

2. 配置准备
   └─ 编写配置、语法检查

3. 测试验证
   └─ 在测试环境验证功能

4. 审批
   └─ 运维主管审批

5. 实施
   └─ squid -k parse → squid -k reconfigure

6. 验证
   └─ 功能测试、性能监控

7. 回滚
   └─ 如有问题,恢复备份配置

16.7.2 变更检查清单

# 变更前
□ 备份当前配置
□ squid -k parse 语法检查
□ 记录变更内容和原因

# 变更中
□ squid -k reconfigure 热重载
□ 观察 cache.log 错误

# 变更后
□ 功能验证测试
□ 性能指标检查
□ 日志检查
□ 通知相关人员
□ 更新文档

16.8 运维自动化

16.8.1 Ansible 部署

# ansible/playbook.yml
---
- name: Deploy Squid Proxy
  hosts: squid_servers
  become: yes
  tasks:
    - name: Install Squid
      apt:
        name: squid
        state: present
        update_cache: yes

    - name: Copy config
      template:
        src: squid.conf.j2
        dest: /etc/squid/squid.conf
        owner: root
        group: proxy
        mode: '0640'
      notify: Restart Squid

    - name: Ensure cache directory
      file:
        path: /var/spool/squid
        state: directory
        owner: proxy
        group: proxy
        mode: '0750'

    - name: Initialize cache
      command: squid -z
      when: squid_config.changed

    - name: Enable and start
      systemd:
        name: squid
        state: started
        enabled: yes

  handlers:
    - name: Restart Squid
      systemd:
        name: squid
        state: restarted

16.8.2 监控脚本

#!/bin/bash
# squid-health-monitor.sh — 定时健康检查

PROXY="localhost:3128"
ALERT_EMAIL="admin@example.com"

# 检查进程
if ! pgrep squid > /dev/null; then
    echo "Squid down at $(date)" | mail -s "SQUID ALERT" $ALERT_EMAIL
    systemctl restart squid
fi

# 检查缓存命中率
HIT_RATIO=$(squidclient -h localhost mgr:info | grep "Request Hit Ratios" | grep -oP '\d+\.\d+' | head -1)
if (( $(echo "$HIT_RATIO < 30" | bc -l) )); then
    echo "Low cache hit ratio: $HIT_RATIO%" | mail -s "SQUID WARNING" $ALERT_EMAIL
fi

# 检查错误率
TOTAL=$(tail -1000 /var/log/squid/access.log | wc -l)
ERRORS=$(tail -1000 /var/log/squid/access.log | grep -c "TCP_DENIED\|TCP_ERROR")
if [ $TOTAL -gt 0 ]; then
    ERROR_RATE=$((ERRORS * 100 / TOTAL))
    if [ $ERROR_RATE -gt 10 ]; then
        echo "High error rate: $ERROR_RATE%" | mail -s "SQUID WARNING" $ALERT_EMAIL
    fi
fi

16.9 文档模板

16.9.1 标准操作手册模板

# Squid 标准操作手册

## 基本信息
- 服务器:proxy.example.com
- IP:192.168.1.1
- 端口:3128
- 版本:Squid 6.10
- 管理员:admin@example.com

## 日常操作
- 查看状态:systemctl status squid
- 重载配置:squid -k reconfigure
- 查看日志:tail -f /var/log/squid/access.log

## 紧急操作
- 重启:systemctl restart squid
- 停止:systemctl stop squid
- 清缓存:rm -rf /var/spool/squid/* && squid -z

## 联系方式
- 主管:manager@example.com
- 供应商:vendor@example.com

16.10 检查清单总结

部署前检查清单

□ 硬件资源满足容量规划
□ 操作系统版本兼容
□ Squid 版本选择(5.x/6.x)
□ 配置文件语法验证
□ SSL 证书准备(如需要)
□ 防火墙规则配置
□ 日志轮转配置
□ 监控和告警配置
□ 备份策略确定
□ 文档完成

安全检查清单

□ 不是开放代理(http_access deny all)
□ 监听内网接口
□ 认证已启用
□ ACL 规则顺序正确
□ SSL/TLS 版本安全
□ 版本信息已隐藏
□ 日志保留策略符合合规
□ 文件权限正确
□ fail2ban 已配置

性能检查清单

□ 文件描述符限制已调高
□ TCP 内核参数已优化
□ 缓存目录使用 SSD
□ cache_mem 设置合理
□ 存储后端选择合适(AUFS/Rock)
□ DNS 缓存已启用
□ 持久连接已启用
□ 日志异步写入

16.11 本章小结

实践领域要点
配置规范分区组织、版本控制、变更管理
高可用主备/集群、故障转移、健康检查
缓存架构多级缓存、CDN 边缘、父代理
安全审计完整日志、HTTPS 解密、合规保留
容量规划用户规模→硬件→带宽→架构
运维自动化Ansible 部署、脚本监控、告警

扩展阅读