Squid正向代理默认拒绝所有请求,需显式添加http_access allow localhost和http_access allow localnet并确保对应ACL定义;反向代理必须同时满足http_port ... vhost vport、cache_peer ... originserver、http_access allow all三条件,缺一则返回503或404。

直接说结论:Squid 正向代理开箱即用,改两行配置就能跑;反向代理必须改端口+加 cache_peer + 开 vhost vport,缺一不可,否则 503 或 404。
安装 Squid 后默认就是正向代理,但默认拒绝所有请求
很多新手执行 sudo apt-get install squid 或 yum install squid 后立刻 systemctl start squid,发现 curl 测试报错 ERROR: The requested URL could not be retrieved —— 这不是没装好,是默认策略在起作用。
关键点在于:squid.conf 里默认有这两行:
http_access deny all http_port 3128
也就是说:端口开着(3128),但所有请求都被拦住了。必须显式放行才生效。
- 最简放行(仅限本地测试):
http_access allow localhost+http_access allow localnet,再确保acl localnet src 192.168.0.0/16等网段定义存在 - 生产环境严禁写
http_access allow all,这等于把代理暴露给全网,极易被滥用为开放代理(Open Proxy) - 改完配置必须运行
squid -k reconfigure(比systemctl restart squid更轻量,不中断连接)
正向代理必须配客户端,浏览器或命令行都要显式指定代理地址
正向代理 ≠ 网络自动走代理。用户必须主动告诉应用:“把请求发给 192.168.1.100:3128”。不配置,就直连。
- curl 测试:
curl -x http://192.168.1.100:3128 https://httpbin.org/ip - Python requests:
proxies={"http": "http://192.168.1.100:3128", "https": "http://192.168.1.100:3128"} - Chrome 启动参数:
google-chrome --proxy-server="http://192.168.1.100:3128" - 注意:HTTPS 请求走正向代理时,Squid 默认会建立 TLS 隧道(CONNECT),不解密内容;若需解密做审计,得配 SSL Bump,涉及证书信任,复杂度陡增
反向代理的三个硬性条件缺一不可
把 Squid 当成网站前端入口(比如让 www.example.com 的流量经由 Squid 转发到后端 10.0.1.5:8080),以下三处必须同时满足:
-
http_port必须绑定到对外服务的 IP 和端口,例如:http_port 192.168.1.100:80 vhost vport(vhost和vport顺序不能颠倒) - 必须定义
cache_peer指向真实后端:cache_peer 10.0.1.5 parent 8080 0 no-query originserver name=backend - 必须用
http_access allow all(或更细粒度 ACL)放行,且该规则要在cache_peer引用前生效;否则 Squid 不知道该把请求交给谁 - 常见错误:
cache_peer写错 IP 或端口,或漏掉originserver,会导致返回503 Service Unavailable;vhost vport缺失则无法按 Host 头分发,多个域名会冲突
防火墙和 SELinux 是最常被忽略的拦路虎
配置全对、服务也 running,但客户端连不上?大概率卡在系统层。
- UFW(Ubuntu):
sudo ufw allow 3128/tcp(正向)或sudo ufw allow 80/tcp(反向) - firewalld(CentOS/RHEL):
sudo firewall-cmd --permanent --add-port=3128/tcp→sudo firewall-cmd --reload - SELinux(RHEL/CentOS):
sudo setsebool -P squid_connect_any on,否则 Squid 无法向外发起连接(尤其反向代理场景) - 别忘了检查
squid -z初始化缓存目录权限(/var/spool/squid),否则启动失败,日志里只有Failed to initialize cache
真正麻烦的从来不是改哪几行配置,而是确认请求路径上每一环是否放行:客户端 DNS 解析正确吗?TCP 连接能通到 Squid 端口吗?Squid 是否成功连到后端?后端返回的内容有没有被 Squid 因缓存策略或 ACL 拦截?—— 逐层 tcpdump 或看 /var/log/squid/access.log 和 cache.log 才是排障核心。


















