Squid 5.2 自动化部署脚本解析(附脚本)

一、脚本核心功能与设计亮点

该脚本专为 CentOS 7 环境定制,实现了 Squid 5.2 的自动化编译安装,具备以下特性:

  1. 版本精准控制:固定编译 Squid 5.2 版本,确保兼容性
  2. HTTPS 拦截支持:自动生成 SSL 证书,实现 HTTPS 流量解密
  3. 性能优化:基于 CentOS 7 特性优化编译参数和运行配置
  4. 服务集成:与 systemd 深度集成,支持服务管理和自动重启
  5. 错误处理:完善的日志记录和错误检查机制
二、关键技术实现
  1. 系统环境准备

    bash

    # 检查系统版本
    if ! grep -q "CentOS Linux release 7" /etc/redhat-release; then
        log_error "此脚本仅适用于 CentOS 7"
    fi
    
    # 安装依赖
    yum install -y wget gcc make openssl-devel pcre-devel zlib-devel ...
    
     
    • 依赖说明
      • openssl-devel:支持 SSL 功能和 HTTPS 拦截
      • pcre-devel:提供正则表达式支持,用于高级访问控制
      • libcap-devel:支持细粒度的进程权限控制
  2. 编译参数优化

    bash

    ./configure \
        --prefix="$SQUID_INSTALL_DIR" \
        --enable-http2 \
        --enable-ssl \
        --with-openssl \
        --enable-ssl-crtd \
        --enable-async-io=8 \
        --enable-storeio=ufs,diskd,rock \
        --with-pcre \
        --with-large-files
    
     
    • 性能相关参数
      • --enable-async-io=8:启用异步 IO,提升并发处理能力
      • --enable-storeio=ufs,diskd,rock:支持多种缓存存储引擎
  3. SSL 证书自动生成

    openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 \
        -subj "/C=CN/ST=Beijing/L=Beijing/O=Squid/CN=$(hostname)" \
        -keyout "$CERT_DIR/${CERT_NAME}.key" \
        -out "$CERT_DIR/${CERT_NAME}.crt"
    
     
    • 证书管理
      • 生成有效期 10 年的 RSA 2048 位证书
      • 自动设置正确的权限和所有者(squid 用户)
  4. Squid 配置优化

    http_port $HTTP_PORT
    https_port $HTTPS_PORT intercept ssl-bump \
        cert=$CERT_DIR/${CERT_NAME}.pem \
        generate-host-certificates=on \
        dynamic_cert_mem_cache_size=4MB
    
    # 性能优化参数
    workers $(nproc)
    cache_mem 64 MB
    maximum_object_size 1024 MB
    
     
    • 关键配置项
      • workers $(nproc):自动设置工作进程数等于 CPU 核心数
      • ssl-bump:启用 SSL 拦截功能
三、服务管理与安全配置
  1. systemd 服务单元

    [Service]
    Type=forking
    User=squid
    Group=squid
    ExecStart=$SQUID_INSTALL_DIR/sbin/squid -sYC
    ExecReload=$SQUID_INSTALL_DIR/sbin/squid -k reconfigure
    ExecStop=$SQUID_INSTALL_DIR/sbin/squid -k shutdown
    Restart=on-failure
    RestartSec=5
    
     
    • 安全特性
      • 以专用低权限用户运行 Squid
      • 配置自动重启机制,提高服务可用性
  2. 访问控制配置

    acl localnet src 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16
    http_access allow localnet
    http_access deny !Safe_ports
    http_access deny CONNECT !SSL_ports
    http_access deny all
    
     
    • 访问规则
      1. 允许内网 IP 段访问
      2. 仅允许安全端口(80/21/443 等)
      3. 仅允许 CONNECT 到 SSL 端口(443)
      4. 默认拒绝所有其他访问
四、客户端配置指南
  1. 导入证书

    # 导出证书供客户端使用
    cp $CERT_DIR/${CERT_NAME}.crt /tmp/squid_ca.crt
    
    # 在客户端导入证书(以CentOS为例)
    cp /tmp/squid_ca.crt /usr/share/pki/ca-trust-source/anchors/
    update-ca-trust extract
    
  2. 配置代理

    • Linux/MacOS 终端
      export http_proxy=http://代理服务器IP:3128
      export https_proxy=http://代理服务器IP:3129
      
    • 浏览器配置
      在浏览器网络设置中配置 HTTP/HTTPS 代理服务器
五、优化建议与扩展方向
  1. 增强日志分析

    # 配置更详细的日志格式
    logformat combined %>a %ui %un [%tl] "%rm %ru HTTP/%rv" %Hs %h" "%{User-Agent}>h"
    access_log $SQUID_INSTALL_DIR/var/logs/access.log combined
    
  2. 添加高级访问控制

    # 基于域名的访问控制
    acl blocked_domains dstdomain "/etc/squid/blocked_sites.txt"
    http_access deny blocked_domains
    
    # 基于时间的访问控制
    acl working_hours time M T W H F 09:00-18:00
    http_access allow working_hours localnet
    
  3. 集成 LDAP 认证

    # 添加LDAP认证支持
    auth_param basic program $SQUID_INSTALL_DIR/libexec/basic_ldap_auth -R -b "dc=example,dc=com" -D "cn=proxyuser,dc=example,dc=com" -w password -f "(&(objectClass=user)(sAMAccountName=%s))" ldap://ldap.example.com
    auth_param basic realm LDAP_Authentication
    acl authenticated proxy_auth REQUIRED
    http_access allow authenticated
    
六、故障排查与维护
  1. 检查服务状态

    systemctl status squid
    journalctl -u squid -n 20  # 查看最近20条日志
    
  2. 常见问题解决

    问题表现 可能原因 解决方法
    HTTPS 网站无法访问 证书未正确导入 重新导出并导入证书
    服务启动失败 端口被占用 修改配置文件中的端口号
    缓存不生效 权限问题或配置错误 检查缓存目录权限和 cache_dir 配置
七、总结

该脚本通过自动化方式实现了 Squid 5.2 在 CentOS 7 上的高效部署,特别优化了 HTTPS 拦截、性能配置和服务管理。在企业环境中,可进一步扩展功能如内容过滤、用户认证和流量监控,以满足更复杂的网络需求。建议在生产环境部署前,先在测试环境验证配置的完整性和兼容性。

#!/bin/bash
# Squid 自动化部署脚本(CentOS 7 专用版)
# 支持 HTTP/HTTPS 代理,含证书自动生成

# 配置参数
SQUID_VERSION="5.2"
SQUID_SOURCE_URL="https://www.squid-cache.org/Versions/v5/squid-${SQUID_VERSION}.tar.gz"
SQUID_INSTALL_DIR="/usr/local/squid"
HTTP_PORT=3128
HTTPS_PORT=3129
CERT_DIR="/etc/squid/certs"
CERT_NAME="squid_cert"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
NC='\033[0m'

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
    exit 1
}

# 检查 root 权限
if [ "$(id -u)" -ne 0 ]; then
    log_error "请使用 root 用户执行"
fi

# 检查是否为 CentOS 7
if ! grep -q "CentOS Linux release 7" /etc/redhat-release; then
    log_error "此脚本仅适用于 CentOS 7"
fi

# 配置 EPEL 源
install_epel() {
    log_info "配置 EPEL 源..."
    yum install -y epel-release || log_error "安装 EPEL 源失败"
}

# 安装依赖
install_dependencies() {
    log_info "安装编译依赖..."
    yum install -y wget gcc make openssl-devel pcre-devel zlib-devel \
        libcap-devel libxml2-devel krb5-devel perl || log_error "安装依赖失败"
}

# 编译安装 Squid
compile_squid() {
    log_info "开始编译安装 Squid ${SQUID_VERSION}..."
    cd /tmp || log_error "无法进入 /tmp 目录"
    
    # 下载源码
    if [ ! -f "squid-${SQUID_VERSION}.tar.gz" ]; then
        wget --continue "$SQUID_SOURCE_URL" || log_error "下载源码失败"
    fi
    
    # 解压并进入目录
    tar -zxf "squid-${SQUID_VERSION}.tar.gz" || log_error "解压失败"
    cd "squid-${SQUID_VERSION}" || log_error "进入源码目录失败"
    
    # 配置编译参数(针对 CentOS 7 优化)
    log_info "配置编译参数..."
    ./configure \
        --prefix="$SQUID_INSTALL_DIR" \
        --enable-http2 \
        --enable-ssl \
        --with-openssl \
        --enable-ssl-crtd \
        --enable-async-io=8 \
        --enable-storeio=ufs,diskd,rock \
        --with-pcre \
        --with-large-files || log_error "配置失败"
    
    # 编译安装
    make -j$(nproc) || log_error "编译失败"
    make install || log_error "安装失败"
    
    # 创建用户组
    groupadd -r squid
    useradd -r -g squid -s /sbin/nologin squid
    
    # 设置权限
    chown -R squid:squid "$SQUID_INSTALL_DIR"
    log_info "Squid 安装完成"
}

# 生成自签名证书
generate_cert() {
    log_info "生成自签名 SSL 证书..."
    mkdir -p "$CERT_DIR" || log_error "创建证书目录失败"
    
    # 生成私钥和证书
    openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 \
        -subj "/C=CN/ST=Beijing/L=Beijing/O=Squid/CN=$(hostname)" \
        -keyout "$CERT_DIR/${CERT_NAME}.key" \
        -out "$CERT_DIR/${CERT_NAME}.crt" || log_error "生成证书失败"
    
    # 合并证书和私钥
    cat "$CERT_DIR/${CERT_NAME}.key" "$CERT_DIR/${CERT_NAME}.crt" > "$CERT_DIR/${CERT_NAME}.pem"
    chown squid:squid "$CERT_DIR/${CERT_NAME}.pem"
    chmod 600 "$CERT_DIR/${CERT_NAME}.pem"
    
    log_info "证书生成完成: $CERT_DIR/${CERT_NAME}.pem"
}

# 配置 Squid
configure_squid() {
    log_info "配置 Squid..."
    
    # 创建配置文件
    cat > "$SQUID_INSTALL_DIR/etc/squid.conf" << EOF
# 基础配置
http_port $HTTP_PORT
https_port $HTTPS_PORT intercept ssl-bump \
    cert=$CERT_DIR/${CERT_NAME}.pem \
    generate-host-certificates=on \
    dynamic_cert_mem_cache_size=4MB

# 缓存配置
cache_dir ufs $SQUID_INSTALL_DIR/var/cache/squid 100 16 256
cache_mem 64 MB
maximum_object_size 1024 MB

# 访问控制
acl localnet src 10.0.0.0/8     # RFC1918 possible internal network
acl localnet src 172.16.0.0/12  # RFC1918 possible internal network
acl localnet src 192.168.0.0/16 # RFC1918 possible internal network
acl SSL_ports port 443
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl CONNECT method CONNECT

http_access allow localnet
http_access allow localhost
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny all

# SSL 配置
sslcrtd_program $SQUID_INSTALL_DIR/libexec/ssl_crtd -s $SQUID_INSTALL_DIR/var/lib/ssl_db -M 4MB
sslcrtd_children 5 startup=1 idle=1

# 日志配置
access_log $SQUID_INSTALL_DIR/var/logs/access.log squid
cache_log $SQUID_INSTALL_DIR/var/logs/cache.log
error_log $SQUID_INSTALL_DIR/var/logs/error.log

# HTTP/2 支持
http2 on

# 性能优化
workers $(nproc)
EOF
    
    # 初始化缓存目录和 SSL 数据库
    log_info "初始化缓存目录..."
    su -s /bin/bash -c "$SQUID_INSTALL_DIR/sbin/squid -z" squid || log_error "初始化缓存目录失败"
    
    log_info "初始化 SSL 数据库..."
    mkdir -p "$SQUID_INSTALL_DIR/var/lib/ssl_db"
    chown squid:squid "$SQUID_INSTALL_DIR/var/lib/ssl_db"
    su -s /bin/bash -c "$SQUID_INSTALL_DIR/libexec/ssl_crtd -c -s $SQUID_INSTALL_DIR/var/lib/ssl_db" squid || log_error "初始化 SSL 数据库失败"
}

# 创建 systemd 服务
create_systemd_service() {
    log_info "配置 systemd 服务..."
    cat > /etc/systemd/system/squid.service << EOF
[Unit]
Description=Squid Web Proxy Server
After=network.target

[Service]
Type=forking
User=squid
Group=squid
ExecStart=$SQUID_INSTALL_DIR/sbin/squid -sYC
ExecReload=$SQUID_INSTALL_DIR/sbin/squid -k reconfigure
ExecStop=$SQUID_INSTALL_DIR/sbin/squid -k shutdown
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF

    systemctl daemon-reload || log_error "重载 systemd 失败"
}

# 启动并验证服务
start_and_verify_service() {
    log_info "启动 Squid 服务..."
    systemctl enable --now squid || log_error "启动服务失败"
    
    # 检查服务状态
    sleep 3
    if systemctl is-active --quiet squid; then
        log_info "Squid 服务状态: $(systemctl status squid | grep Active | head -n1)"
        log_info "HTTP 代理端口: $HTTP_PORT"
        log_info "HTTPS 代理端口: $HTTPS_PORT"
        log_info "日志路径: $SQUID_INSTALL_DIR/var/logs/"
        log_info "证书路径: $CERT_DIR/${CERT_NAME}.pem"
    else
        log_error "Squid 启动失败,请检查日志:\n$(journalctl -u squid --no-pager -n 20)"
    fi
}

# 主流程
main() {
    log_info "Squid 自动化部署开始(CentOS 7 专用版,版本 ${SQUID_VERSION})"
    install_epel
    install_dependencies
    compile_squid
    generate_cert
    configure_squid
    create_systemd_service
    start_and_verify_service
    log_info "部署完成!使用 'systemctl [start|stop|restart|status] squid' 管理服务"
}

# 执行部署
main

你可能感兴趣的:(Squid 5.2 自动化部署脚本解析(附脚本))