该脚本专为 CentOS 7 环境定制,实现了 Squid 5.2 的自动化编译安装,具备以下特性:
系统环境准备
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
:支持细粒度的进程权限控制编译参数优化
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
:支持多种缓存存储引擎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"
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 拦截功能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
访问控制配置
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
导入证书
# 导出证书供客户端使用
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
配置代理
export http_proxy=http://代理服务器IP:3128
export https_proxy=http://代理服务器IP:3129
增强日志分析
# 配置更详细的日志格式
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
添加高级访问控制
# 基于域名的访问控制
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
集成 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
检查服务状态
systemctl status squid
journalctl -u squid -n 20 # 查看最近20条日志
常见问题解决
问题表现 | 可能原因 | 解决方法 |
---|---|---|
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