必须加 proxy_auth required,否则认证形同虚设;需先定义 acl authenticated proxy_auth required,再用 http_access allow authenticated,且该规则须置于 localnet 等宽松规则之后,并以 http_access deny all 收尾。

必须加 proxy_auth REQUIRED,否则认证形同虚设
很多人配完 auth_param 就以为搞定了,结果发现不输密码也能走通代理——根本原因是没在 http_access 规则里强制要求认证。Squid 的访问控制是“白名单制”,默认全拒,但如果你漏掉了认证检查,它可能被前面更宽泛的规则(比如 http_access allow localnet)提前放行。
为什么 http_access allow authenticated 不起作用?
常见错误是直接写 http_access allow authenticated,但这个 authenticated 并不是 Squid 内置关键字,而是你自定义的 ACL 名称。如果没先用 acl authenticated proxy_auth REQUIRED 定义它,这条规则就完全无效,Squid 会静默跳过。
- ACL 名称必须前后一致:定义时用什么名字,
http_access allow就得用什么名字 -
proxy_auth REQUIRED是关键,REQUIRED表示“必须完成认证”,不是“有认证就放行” - 这条 ACL 必须放在所有宽松规则(如
localnet、all)之后,否则会被提前匹配
basic_ncsa_auth 路径和权限容易错
路径不对或权限不足,会导致 Squid 启动时无报错但认证始终返回 ERR,浏览器反复弹框或直接拒绝连接。
- CentOS/RHEL 8+ 和多数新版 Squid(3.5+)用的是
/usr/lib64/squid/basic_ncsa_auth,不是/usr/lib/squid3/...或旧版/usr/lib/squid/ncsa_auth - 密码文件(如
/etc/squid/passwd)必须能被squid用户读取:chown squid:squid /etc/squid/passwd && chmod 600 /etc/squid/passwd - 运行
/usr/lib64/squid/basic_ncsa_auth /etc/squid/passwd testuser testpass手动测试,输出OK才算通
认证生效前必须关掉干扰项
即使配置全对,也可能被其他规则覆盖或绕过。最常踩的坑是这几处没清理:
- 注释掉或删除原始的
http_access allow localnet和http_access allow all—— 它们会把未认证流量直接放行 - 确保
http_access deny all在最后,作为兜底规则 - 不要把认证相关配置写在
refresh_pattern或cache_dir等指令块内部,Squid 会忽略 - 如果用了
via off或forwarded_for delete,不影响认证逻辑,但会影响日志中是否显示真实客户端 IP
真正卡住的地方往往不是语法,而是 ACL 执行顺序和默认策略的隐式覆盖。验证时别只看浏览器弹窗,用 curl -x http://user:pass@127.0.0.1:3128 https://httpbin.org/ip 直接测,再查 /var/log/squid/access.log 里有没有 TCP_DENIED/407(认证失败)或 TCP_MISS/200(成功),比看弹窗靠谱得多。











