首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >内网代理神器 Squid:从踩坑到填坑,这一篇给你讲透

内网代理神器 Squid:从踩坑到填坑,这一篇给你讲透

作者头像
悠悠12138
发布2026-07-02 13:41:25
发布2026-07-02 13:41:25
20
举报

Squid 这个东西,说实话,我第一次接触它是在好几年前了,那时候公司内网有台机器死活连不上外网,领导让我想办法,我就随便找了个代理软件,结果折腾半天没搞定,最后才听人推荐用了 Squid。从那以后,它在我的工具库里就一直占着一席之地。虽然现在各种云原生、服务网格、API 网关满天飞,但很多传统场景下,Squid 依然是最简单直接的选择。今天我不打算写那种教科书式的介绍,就聊聊在生产环境里实际怎么用这个“老家伙”,以及那些年我踩过的坑和总结出来的经验。

很多人以为 Squid 就是个正向代理,其实它还能做反向代理、透明代理,甚至做 CDN 的缓存节点。不过在我日常工作中,正向代理和缓存加速是用得最多的。比如前阵子我们有个测试团队,几十台虚拟机跑 CI/CD,每次构建都要从外网拉各种依赖,带宽跑满不说,还经常因为网络抖动导致构建失败。后来我在它们网段前面架了一台 Squid,把常用软件源、npm、pip 这些全部缓存下来,效果立竿见影,构建时间缩短了将近一半,外网流量也省了不少。

那我们就从安装开始说起吧。

安装的那点事

Squid 的安装几乎是零门槛,大部分 Linux 发行版都自带它的包。比如在 Rocky Linux 或者 CentOS 上,直接 yum install squid -y 就行。如果是在 Ubuntu 上,就 apt install squid。装完之后,主配置文件在 /etc/squid/squid.conf,这个文件默认就有几千行,不过大部分都是注释,真正生效的配置可能就几十行。我一般习惯先备份一份原文件,然后从头写一个干净的配置,这样后面维护起来也清晰。

有时候你可能会遇到版本问题,比如 CentOS 7 默认带的 Squid 版本比较老,某些特性不支持,比如 SSL Bump 在高版本才稳定。如果对功能有要求,可以装 EPEL 仓库里的更新版本,或者自己编译。不过说实话,大多数场景下,系统自带的版本已经足够用了。

让内网机器能上网——正向代理基础配置

正向代理的逻辑很简单:内网机器把请求发给 Squid,Squid 代替它们去外网拿数据,然后返回给内网机器。这样一来,内网机器不需要直接出公网,你只需要保证 Squid 这台机器能访问外网就行。

最基本的配置只要几行:

代码语言:javascript
复制
http_port 3128
acl localnet src 192.168.0.0/16
http_access allow localnet
http_access deny all

这里 http_port 是 Squid 监听的端口,默认 3128。acl 定义了一个叫 localnet 的访问控制列表,匹配内网 IP 段。http_access 是实际允许或拒绝的规则,先允许 localnet,再拒绝所有其他。注意 Squid 的访问控制是顺序匹配的,找到第一条匹配的规则就停止,所以 deny all 一定要放在最后。

客户端如果要使用代理,可以在系统环境变量里设置 http_proxy=http://squid_ip:3128,或者在某些应用里单独配置。比如 curl 可以加 -x http://squid_ip:3128yum 可以在 /etc/yum.conf 里加 proxy=http://squid_ip:3128

不过,默认配置下 Squid 只允许代理 HTTP 请求,如果你想让它代理 HTTPS(也就是 CONNECT 隧道),需要额外允许 CONNECT 方法。一般我会加一条:

代码语言:javascript
复制
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access allow CONNECT SSL_ports
http_access deny CONNECT

这样就能代理 HTTPS 流量了,但注意这是隧道方式,Squid 看不到加密内容,只是做一个转发。

缓存那些事——加速你的依赖下载

Squid 的缓存功能非常实用。比如你有一个内网的 yum 源代理,或者 npm 镜像,只要配置好缓存,第一次下载后,后续请求就直接从磁盘缓存返回,速度飞快。

缓存相关的配置主要在 squid.conf 里设置:

代码语言:javascript
复制
cache_dir ufs /var/spool/squid 10000 16 256
maximum_object_size 4096 MB
cache_mem 512 MB

cache_dir 指定缓存目录、类型、大小、一级目录数和二级目录数。这里给了 10GB 缓存空间。maximum_object_size 是缓存对象的最大大小,超过这个值就不缓存了,我习惯设大一点,因为有些软件包可能很大。cache_mem 是内存缓存大小,用来存热点对象。

有个细节要注意:缓存目录的初始化。当你第一次配置好 cache_dir 后,需要运行 squid -z 来创建缓存目录结构,不然 Squid 起不来。有时候磁盘空间不够,或者目录权限不对,也会导致启动失败,这些都是很常见的坑。

另外,缓存命中的判断标准是 HTTP 响应头里的 Cache-ControlExpiresLast-Modified 等字段。如果源站返回的响应头不允许缓存,Squid 就不会缓存。比如有些 API 返回 Cache-Control: no-cache,那你就没法强制缓存,除非你配置 refresh_pattern 来覆盖。

refresh_pattern 是一个正则表达式,用来定义缓存策略。比如我想让所有 .rpm 文件缓存至少 24 小时,可以这样写:

代码语言:javascript
复制
refresh_pattern \.rpm$ 1440 100% 2880 ignore-reload

这行配置的意思是:匹配 .rpm 结尾的 URL,最小缓存时间 1440 分钟(1天),缓存过期后如果重新验证成功,百分比多少之类的,最大缓存时间 2880 分钟。ignore-reload 表示忽略客户端的强制刷新请求。这个参数很实用,能避免某些客户端带着 Cache-Control: no-cache 头导致缓存失效。

我曾经遇到过一个问题,公司内网有台 Squid 缓存了某台服务器的更新包,但那个更新包其实有 bug,需要紧急更新,可是客户端请求的时候总是拿到旧缓存,因为缓存还没过期。后来我们通过 squidclient -m PURGE 手动清除了那个 URL 的缓存,才解决问题。所以缓存虽好,得有管理手段。

ACL 访问控制——别让代理成了开放出口

Squid 的 ACL 功能非常强大,可以基于源 IP、目标 IP、域名、时间、请求方法、HTTP 头等各种条件来控制。如果配置不当,你的代理服务器可能变成一个开放代理,被外面的人利用,那就麻烦了。

我一般会先定义好几个 ACL,然后组合使用。比如只允许内网网段访问,并且限制访问的端口:

代码语言:javascript
复制
acl localnet src 10.0.0.0/8
acl localnet src 172.16.0.0/12
acl localnet src 192.168.0.0/16

acl Safe_ports port 80 443 8080 8443
acl CONNECT method CONNECT

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

这样即使有人在内网,也只能访问 80、443 等安全端口,防止代理被滥用来访问 SMTP 等。

有时候我们需要限制某些域名,比如禁止访问视频网站或者某些已知的恶意域名。可以这样:

代码语言:javascript
复制
acl bad_sites dstdomain .youtube.com .facebook.com
http_access deny bad_sites

注意规则顺序,deny 要放在相应的 allow 之前,因为匹配到就停止。我一般把 deny 规则放在前面,allow 放在后面,最后 deny all

还有个场景:允许某些机器不被代理,直接走本地网络。这时候可以在客户端配置里设置 no_proxy 环境变量,也可以在 Squid 上做透明代理或者用 PAC 文件,不过那是另一个话题了。

日志排查——分析问题全靠它

Squid 的日志在 /var/log/squid/ 下面,默认有 access.logcache.logaccess.log 记录每个请求的详细信息,cache.log 记录 Squid 自己的运行日志和错误。

access.log 的格式可以自定义,默认格式包含时间、客户端 IP、请求方法、URL、状态码、命中情况等。我习惯用 tail -f 实时观察,或者用 squid-analyzer 这类工具生成报表。

有一次,开发同事反馈说某个 API 访问很慢,怀疑是网络问题。我直接在他们机器上设置 http_proxy 指向 Squid,然后观察 access.log,发现请求的响应时间很长,进一步排查发现是目标服务器那边有个中间件响应慢,跟我们网络无关。日志里 TCP_MISS 表示没命中缓存,TCP_HIT 表示命中,TCP_REFRESH_HIT 表示缓存过期但验证后仍可用。通过这些状态码,能快速判断问题。

另外,cache.log 里经常会出现一些警告,比如磁盘空间不足、DNS 解析失败等。要看懂这些日志,需要对 Squid 的错误代码有一定了解,不过一般字面意思就能猜个大概。

性能调优——让 Squid 跑得更溜

Squid 默认配置可能不是最优的,根据你的硬件和场景调整一下,效果会好很多。

  • 进程和线程:Squid 默认是单进程多线程,但可以通过 workers 参数开启多进程模式,不过我个人觉得单进程加多线程配合 cpu_affinity_map 也够用,除非并发量特别大。
  • 文件描述符:Squid 需要打开很多文件描述符,Linux 默认的 1024 肯定不够。可以在 /etc/security/limits.conf 里调高,或者启动脚本里加 ulimit -n 65536
  • 内存缓存cache_mem 别设太大,一般不超过物理内存的 1/3,否则可能被 OOM Killer 杀掉。
  • 磁盘缓存cache_dir 的格式选 aufs 还是 ufsaufs 使用线程池方式异步操作磁盘,IO 性能比 ufs 好,但需要内核支持,一般 Linux 上建议用 aufs
  • 大文件缓存:如果经常缓存大文件(比如 ISO 镜像),可以把 maximum_object_size 调大,同时 maximum_object_size_in_memory 设小一点,避免大文件占用内存缓存。
  • DNS 查询:Squid 默认使用自己的 DNS 解析,可能会慢。可以配置 dns_nameservers 指定内网 DNS 服务器,或者开启 dns_v4_first on 优先 IPv4。

我曾经遇到一个情况,Squid 在高峰期响应很慢,top 看 CPU 使用率不高,但 iostat 发现磁盘 IO 打满。后来发现是 cache_dir 的目录结构太小,导致大量文件挤在一起,文件系统 inode 不够用。重建缓存目录并增加一级目录数后,问题解决。

透明代理的坑

透明代理这个功能,很多人觉得酷,不用客户端配置,只要把流量通过 iptables 重定向到 Squid 端口就行。确实方便,但坑也不少。

首先是 HTTPS 透明代理,需要 SSL Bump 功能,也就是 Squid 要能解密 HTTPS 流量,然后重新加密。这需要你生成一个 CA 证书,并在客户端信任这个 CA,否则浏览器会报证书错误。而且有些应用(比如手机 App)会做证书固定,一旦你解密,应用就断连了,根本没法用。所以透明代理用来做 HTTP 流量缓存还行,HTTPS 要慎重。

其次,透明代理在多层网络或者存在非对称路由的时候,连接可能会出问题,因为客户端不知道自己在和代理通信,代理返回包时可能被防火墙丢弃。

我们公司之前试过在办公网全部改用透明代理,结果第一天就有同事反馈某些网站打不开,或者登录框出不来,排查发现是 SSL Bump 和某些 CDN 冲突。后来我们只在内网访问某些特定外网段时才用透明代理,其他情况还是用 PAC 方式。

最后说几句

Squid 的优点很明显:稳定、功能强大、文档丰富、社区活跃。缺点嘛,配置复杂,很多参数需要理解 HTTP 协议,而且对于现代的一些协议(比如 WebSocket、HTTP/2)支持不够完善,虽然新版本已经在改进了。在我实际工作中,Squid 很好地扮演了“内网往外看”的窗口角色,帮我省了不少事。

如果你正头疼内网多台机器统一出口、软件源缓存、访问控制这些问题,我建议你花点时间玩一玩 Squid,别怕它配置多,先用起来,跑通正向代理,再慢慢加缓存和 ACL,遇到问题查日志,很快就能上手。

好了,今天就聊到这儿。如果这篇文章对你有帮助,欢迎转发分享给更多需要的朋友,也欢迎关注我的公众号,我会持续分享一些运维实战经验,不讲大道理,只说怎么干。

公众号:耕云躬行录 个人博客:躬行笔记

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-07-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 运维躬行录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装的那点事
  • 让内网机器能上网——正向代理基础配置
  • 缓存那些事——加速你的依赖下载
  • ACL 访问控制——别让代理成了开放出口
  • 日志排查——分析问题全靠它
  • 性能调优——让 Squid 跑得更溜
  • 透明代理的坑
  • 最后说几句
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档