Squid Manager 教程:Squid 代理服务器 Web 管理平台

Squid 是最常用的开源代理缓存服务器,但它的配置文件 squid.conf 有上百个指令,ACL 规则一多就容易写错,出了问题还要翻 access.log 一行行看。Squid Manager 就是为了解决这个问题的:一个 Flask 写的 Web 管理平台,把 squid.conf 的全套配置、ACL 规则、访问控制做成可视化表单,把 access.log 解析成 KPI 卡片和图表,服务启停、配置备份、审计日志也都在网页上完成。本教程从快速开始、部署后必做的 ACL 放行,讲到配置管理、日志分析、TLS 部署和运维建议。

一、项目简介

Squid Manager 是 AI-Agent 组织下的开源项目(Python,main 分支),一个基于 Flask 的 Squid 代理服务器 Web 管理平台。它不直接实现代理协议,而是作为 Squid 的“驾驶舱”:读和写本机的 /etc/squid/squid.conf,解析本机的 /var/log/squid/access.log,调用本机的 squid 二进制做语法校验和服务控制。默认假设 Squid 安装在本机,如需管理远程 Squid 或路径不同,在路径设置页面修改(路径需在本平台可访问的位置)。

squid-manager/
├── app.py                # Flask 应用(模型、路由、业务逻辑)
├── squid_config.py       # squid.conf 解析 / 生成 / 校验
├── log_parser.py         # access.log 解析与统计
├── wsgi.py               # gunicorn 入口
├── requirements.txt
├── README.md
├── instance/             # SQLite 数据库(自动创建)
│   └── squid_mgr.db
├── backups/              # squid.conf 自动备份
├── templates/            # Jinja2 模板
└── static/
    └── style.css

二、功能特性

2.1 全 Web 化配置管理

  • 主配置:HTTP/HTTPS/ICP/SNMP 端口、缓存内存、对象大小、超时、DNS、日志路径、管理员邮箱等。
  • ACL 规则表:完整 ACL CRUD,支持 28+ 类型(src、dst、dstdomain、port、method、time、url_regex、proxy_auth 等)。
  • 访问控制:http_access / https_access / icp_access / snmp_access 等所有访问指令的可视化管理。
  • 缓存目录:cache_dir 多目录管理(ufs / aufs / diskd / rock)。
  • 刷新规则:refresh_pattern 正则/百分比/最大时间。
  • 认证配置:basic / digest / ntlm / negotiate 全套 auth_param 管理。
  • 缓存对等:cache_peer 父代理/兄弟节点配置。
  • 原始编辑:直接编辑 squid.conf,支持语法校验。

每次保存自动备份当前配置,可选启用 squid -k parse 语法校验。

2.2 日志分析

解析 Squid 原生 access.log,提供 KPI 卡片(总请求数、缓存命中率、总流量、平均响应、拒绝率、中断率、4xx/5xx 错误率)、每小时流量图(请求数 + 流量双 Y 轴折线图)、结果码分布(TCP_HIT / TCP_MISS / TCP_TUNNEL / TCP_DENIED 等,含中文释义)、HTTP 状态码分布、方法分布、请求分类(Hit / Miss / Tunnel / Denied / Aborted / Error)、Top 客户端、Top 目标主机、Top URL、层级代码(HIER_DIRECT / HIER_PARENT_HIT 等)、Content-Type 分布、日志查询(多维度过滤)、实时日志(自动刷新的 Live Tail 视图)和日志导入(离线分析一次性粘贴的日志)。

2.3 服务控制与运维功能

  • 服务控制:启动 / 停止 / 重启 / 平滑重载(reload,失败回退 restart),服务状态查看(PID、版本、启动时间、unit 文件)。
  • 配置备份:自动备份历史,可下载/恢复。
  • 审计日志:所有配置变更、服务操作、登录登出全程留痕。
  • 修改密码:admin/admin 默认账号,首次登录后请立即修改。

另外,文件清单中还包含告警(alerts.py)、异常检测(anomaly.py)、GeoIP 查询(geoip_lookup.py)、日志轮转(log_rotate.py)、SSL Bump 配置(config_ssl_bump.html)等模块与页面,但 README 未展开说明具体用法,以实际界面为准。

三、技术栈与配置路径

组件选型
后端Python 3 + Flask + SQLAlchemy
数据库SQLite(instance/squid_mgr.db)
前端原生 HTML + CSS + 原生 JS
图表Chart.js 4.4(CDN)
WSGIgunicorn
进程管理systemd(可选)
项目默认路径
配置文件/etc/squid/squid.conf
访问日志/var/log/squid/access.log
缓存日志/var/log/squid/cache.log
二进制squid
服务名squid

四、快速开始与默认账号

4.1 安装依赖

cd /root/squid-manager
pip install -r requirements.txt --break-system-packages

4.2 直接运行(开发)

python3 app.py
# 默认监听 0.0.0.0:5200,调试模式

4.3 生产部署(gunicorn + systemd)

# 初始化数据库
python3 -c "from app import app, db, seed_admin; \
            app.app_context().push(); \
            db.create_all(); seed_admin()"

# 启动 gunicorn
gunicorn --workers 2 --bind 0.0.0.0:5200 wsgi:app

systemd 单元(推荐),写入 /etc/systemd/system/squid-manager.service:

[Unit]
Description=Squid Web Manager
After=network.target

[Service]
Type=exec
User=root
WorkingDirectory=/root/squid-manager
ExecStart=/usr/bin/gunicorn --workers 2 --bind 0.0.0.0:5200 wsgi:app
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now squid-manager

4.4 默认账号

用户名 admin,密码 admin。首次登录后请立即修改密码(左侧导航 → 修改密码)。

五、部署后必做:Squid 服务端 ACL 放行

这是部署后最容易踩的坑,单独讲。Squid 安装后默认配置里 localnet ACL 虽然定义了 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16 等内网段,但对应的 http_access allow localnet 这一行默认被注释掉。如果你的 Squid 同时跑在公网或混合网段,内网客户端的所有代理请求会全部返回 403 TCP_DENIED。

症状:客户端配置了代理,浏览器打不开任何网站;/var/log/squid/access.log 里看到 TCP_DENIED/403 而不是 TCP_MISS/200。

5.1 方式一:通过 Squid Manager Web UI(推荐,有 diff 预览和审计)

  • 登录平台 → 原始编辑 → 在 http_access allow localhost 下面、http_access deny all 上面插入一行:http_access allow localnet。
  • 点保存 → 看 diff 预览 → 确认 → 自动备份 + 写盘。
  • 回到服务控制页 → 点平滑重载(reload)。

5.2 方式二:直接编辑 /etc/squid/squid.conf

cp /etc/squid/squid.conf /etc/squid/squid.conf.bak
# 在 http_access allow localhost 之后插入一行:
sed -i '/^http_access allow localhost$/a http_access allow localnet' /etc/squid/squid.conf
squid -k parse -f /etc/squid/squid.conf   # 语法校验
squid -k reconfigure                        # 让新配置生效

5.3 验证生效

# 从另一台内网机器(比如你的 Windows 10.168.1.201)
curl -x http://<squid-server>:3128 -I http://example.com
# 应该返回 HTTP/1.1 200 OK
# 之前会是 403 Forbidden 或连接重置

⚠️ 不要把 http_access allow all 加上去——那会变成开放代理,服务器 IP 会在 24 小时内被全球黑名单(Spamhaus / Tor exit list / 各种威胁情报)列入。

六、配置管理详解

配置管理是 Squid Manager 的核心,覆盖 squid.conf 的全部主要指令组。每次保存都会自动备份当前配置,可选启用 squid -k parse 语法校验,校验不通过不会写盘,避免把服务配死。

6.1 主配置与缓存目录

主配置页集中了最常用的全局参数:HTTP/HTTPS/ICP/SNMP 端口、缓存内存(cache_mem)、最大对象大小(maximum_object_size)、各类超时、DNS 服务器、日志路径、管理员邮箱(cache_mgr)。缓存目录页管理 cache_dir,支持多目录和 ufs / aufs / diskd / rock 四种存储类型,按磁盘性能和容量选择。

6.2 ACL 规则表与访问控制

ACL 页提供完整 CRUD,支持 28+ 种类型:src、dst、dstdomain、port、method、time、url_regex、proxy_auth 等。访问控制页管理 http_access / https_access / icp_access / snmp_access 等指令,顺序就是匹配顺序,Squid 按从上到下的顺序匹配第一条命中的规则就停止,所以 allow 和 deny 的先后位置直接决定生效结果,调整顺序时务必在 diff 预览里确认。

6.3 刷新规则、认证与缓存对等

  • 刷新规则:refresh_pattern 按正则、百分比、最大时间控制缓存对象的过期策略。
  • 认证配置:basic / digest / ntlm / negotiate 全套 auth_param 管理,适合需要按账号控制代理访问的场景。
  • 缓存对等:cache_peer 配置父代理/兄弟节点,多级代理架构时使用。

6.4 原始编辑与语法校验

可视化表单覆盖不了的指令,用原始编辑直接改 squid.conf。保存前平台会跑 squid -k parse 校验(需要本机有 squid 二进制),语法错误会直接提示,不会把错误配置写盘。改完配置后到服务控制页做平滑重载(reload)生效,reload 失败会自动回退到 restart。

七、日志分析:从 access.log 到可视化报表

Squid 原生 access.log 的标准格式(默认)如下,每行记录一次请求:

time elapsed client action/code size method URL ident hierarchy content-type
1783841223.438 2488 172.16.12.232 TCP_MISS_ABORTED/000 0 GET http://169.254.169.254/metadata/instance/compute - HIER_DIRECT/169.254.169.254 -
1783841225.683 4564 172.16.237.9 TCP_TUNNEL/200 10197 CONNECT default.exp-tas.com:443 - HIER_DIRECT/13.107.5.93 -

平台解析后提供以下视图:

  • KPI 卡片:总请求数、缓存命中率、总流量、平均响应、拒绝率、中断率、4xx/5xx 错误率。
  • 每小时流量图:请求数 + 流量双 Y 轴折线图。
  • 结果码分布:TCP_HIT、TCP_MEM_HIT、TCP_NEGATIVE_HIT、TCP_IMS_HIT、TCP_REFRESH_HIT(命中);TCP_MISS、TCP_REFRESH_MISS、TCP_CLIENT_REFRESH_MISS(未命中);TCP_TUNNEL(CONNECT 隧道);TCP_DENIED、TCP_DENIED_REPLY(拒绝);TCP_MISS_ABORTED(中断);TCP_REDIRECT(重定向);UDP_*(ICP 协议);NONE(错误)。
  • Top 统计:Top 客户端(按 IP 排序,显示请求数和流量)、Top 目标主机(按域名)、Top URL、Content-Type 分布、层级代码(HIER_DIRECT / HIER_PARENT_HIT 等)。
  • 日志查询:多维度过滤(IP / 方法 / 结果码 / 主机 / URL / 大小范围 / 时间范围)。
  • 实时日志:自动刷新的 Live Tail 视图,适合实时观察。
  • 日志导入:离线分析一次性粘贴的日志。

注意:access.log 解析按需读取(默认末尾 10000 行),不做持久化;数据量大时查询会慢一些,这是已知限制。

八、服务控制与配置备份

服务控制页支持启动、停止、重启、平滑重载(reload,失败回退 restart),并显示服务状态(PID、版本、启动时间、unit 文件)。服务控制仅在 Squid 与本平台同机时有效,远程 Squid 只能改配置、不能直接控制服务。

配置备份是自动的:每次保存配置都会备份一份,备份页可以下载任意历史版本或一键恢复。建议改重要配置前先在备份页确认最近一次备份的时间点,恢复后同样需要 reload 才能生效。

九、TLS / HTTPS 部署

本 Web 平台本身默认监听 HTTP。在公网或需要 HTTPS 的内网场景下,强烈不要把本平台直接暴露,请用 nginx 做反向代理 + TLS 终结。

9.1 自签名证书(仅用于测试 / 内网)

进入配置管理 → TLS 证书,填入 Common Name(如 proxy.example.local),点击“生成自签名证书”。生成的文件保存在 ssl_certs/ 目录下,名为 CN_YYYYMMDD_xxxxxxxx.pem,内含 cert + key,可直接用于 nginx 自测。浏览器会提示“不受信任”,仅用于内网 / 自测 / curl -k。

9.2 生产部署:nginx 反代 + Let's Encrypt + 强制 HTTPS

# HTTP -> HTTPS 强制重定向
server {
    listen 80;
    server_name proxy.example.com;
    return 301 https://$host$request_uri;
}

# HTTPS 终结
server {
    listen 443 ssl http2;
    server_name proxy.example.com;

    # Let's Encrypt 签发的证书
    ssl_certificate     /etc/letsencrypt/live/proxy.example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/proxy.example.com/privkey.pem;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;

    # 转发到本平台
    location / {
        proxy_pass http://127.0.0.1:5200;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
    }
}
# 一次性安装 certbot(Debian/Ubuntu)
apt install -y certbot
# 仅申请证书,不需要 nginx 插件(webroot 模式)
certbot certonly --webroot -w /var/www/html \
    -d proxy.example.com \
    --email admin@example.com --agree-tos -n
# 证书自动存放在 /etc/letsencrypt/live/proxy.example.com/
# 推荐加上 cron 自动续期
echo "0 3 * * * /usr/bin/certbot renew --quiet --post-hook 'systemctl reload nginx'" \
    | sudo crontab -

也可以从本平台上传页面手动上传 .pem / .crt / .key(上限 1 MB)。证书列表显示主题(CN)、状态(绿色 = 有效 ≥30 天 / 黄色 = <30 天 / 红色 = 已过期)和 SHA-256 指纹(审计追踪用,只记录指纹,绝不写私钥内容)。

9.3 常见误区

  • 不要把 ssl_certs/*.pem 加入 git 或公网备份,文件含私钥。
  • 不要把 80 / 443 直接绑到 app.py 运行端口,务必过 nginx(WAF / 限速 / 防护)。
  • Let's Encrypt 单证书有效期 90 天,务必配置自动续期。
  • 反代场景下,app.py 的 SECRET_KEY 必须固定(环境变量),否则每次重启会话失效。

十、常见问题

10.1 客户端返回 403 TCP_DENIED

最常见的原因是第五节讲的 http_access allow localnet 被注释掉了。按第五节放行后 reload,再用 curl -x 验证。注意不要用 http_access allow all 补救,那会变成开放代理。

10.2 改了配置不生效

保存配置后必须到服务控制页做平滑重载(reload)才能生效。reload 失败会自动回退到 restart,留意页面上的服务状态。

10.3 服务控制按钮没反应

服务控制仅在 Squid 与本平台同机时有效。远程 Squid 场景下,按钮无法操作系统服务,需要到 Squid 所在机器上执行 systemctl restart squid。

10.4 日志查询很慢或没有数据

access.log 解析按需读取(默认末尾 10000 行),不做持久化。日志文件特别大时查询会慢;确认路径设置里的 access.log 路径正确,且平台进程对日志文件有读权限。

十一、安全建议与已知限制

  • 修改默认密码:admin/admin 仅为示例,首次登录后立即修改。
  • 绑定内网 IP:不要暴露到公网,或前置 nginx + Basic Auth。
  • 限制文件权限:配置文件含敏感信息,确保 600。
  • 审计日志:定期查看 /audit 页面,关注配置变更和异常登录。
  • TLS:生产环境建议 nginx 反代 + HTTPS。

已知限制(README 明确列出的):服务控制仅在 Squid 与本平台同机时有效;squid -k parse 校验需要本机有 squid 二进制;多 gunicorn worker 下 SQLite 写入有竞态,已用 try/except 兜底;access.log 解析按需读取(默认末尾 10000 行),不持久化。

十二、总结

Squid Manager 把 Squid 的日常运维从“改配置文件 + 翻日志”变成了“点网页 + 看图表”:ACL 和访问控制可视化、保存自动备份加语法校验、日志解析成 KPI 和 Top 统计、服务控制和审计日志一应俱全。部署时记住三个关键点:第一,装完先做第五节的 http_access allow localnet 放行,否则内网客户端全是 403;第二,默认账号 admin/admin 必须立即改掉,平台不要直接暴露公网;第三,生产用 gunicorn + systemd + nginx 反代,不要用 python3 app.py 的调试模式长期跑。做到这三点,一台 Squid 代理就能既好管又安全。

发表回复

后才能评论