服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-11-14 简米科技 4,223 字 10 分钟阅读

如何用Squid精准过滤特定域名访问请求?,Squid怎么屏蔽指定域名?

导读用Squid精准过滤特定域名,核心就三件事:用dstdomain类型的ACL定义要拦截的域名、把http_access deny规则放在http_access allow之前、改完执行squid -k reconfigure让配置秒级生效;顺序写反或域名写法不对,是九成规则“写了但没拦住”的直接原因,先避开最大……

用Squid精准过滤特定域名,核心就三件事:用dstdomain类型的ACL定义要拦截的域名、把http_access deny规则放在http_access allow之前、改完执行squid -k reconfigure让配置秒级生效;顺序写反或域名写法不对,是九成规则“写了但没拦住”的直接原因。

先避开最大的坑:ACL按顺序匹配,写反等于没写

Squid的http_access规则是自上而下逐条匹配,第一条命中就立刻生效,后面的一概不看,很多人把http_access allow localnet写在了http_access deny blocked上面,结果内网用户全被放行,拦截规则成了摆设。

正确的排列逻辑只有一条:先写deny,再写allow,最后留一个兜底deny。

  • 拦截类规则放在最上方
  • 放行类规则放在中间
  • 结尾用http_access deny all兜住所有没命中的请求

改完配置别急着测,先跑squid -k parse做语法检查,这个命令只解析不加载,能提前揪出拼写错误和引号不闭合的问题,比直接reload后看着服务起不来强得多。

squid怎么屏蔽指定网站?从一条dstdomain规则开始

最简配置:三行就能拦住一个域名

打开/etc/squid/squid.conf,在ACL定义区加上:

acl blocked_domains dstdomain .example.com
http_access deny blocked_domains

注意.example.com前面那个点。带点表示匹配example.com本身以及它的所有子域名,比如www.example.com、mail.example.com都会被命中,如果只写example.com不带点,通常只精确匹配这个主机名,子域名会漏网。

批量域名用文件管理,别堆成一长串

要拦几十上百个域名,全写在acl行里既难读也难维护,做法是把域名一行一个放进文件,比如/etc/squid/blocked_domains.txt:

.example.com
.badsite.net
.video-site.org

然后引用:

acl blocked_domains dstdomain "/etc/squid/blocked_domains.txt"
http_access deny blocked_domains

这里有个实操细节:Squid读取域名文件是在启动时加载的,改完文件必须执行squid -k reconfigure,光保存文件不会生效,团队协作时建议把这份清单纳入版本管理,谁加了哪条、为什么加,都有据可查。

自定义拦截页,别让用户看到裸403

直接deny,用户浏览器里只会出现一个干巴巴的错误页,很容易被当成网络故障来报修,加一行deny_info就能换成自己的说明页:

deny_info ERR_BLOCKED_BY_POLICY blocked_domains

然后把自定义的HTML放到Squid的errors目录下对应语言文件夹,例如/usr/share/squid/errors/zh-cn/,一并放进说明文字和维护人联系方式,工单量能明显下降。

企业内网squid禁止访问某网站配置实操

下面这段是多数公司网络里能直接套用的骨架,保留结构、替换域名即可:

acl localnet src 10.0.0.0/8
acl localnet src 192.168.0.0/16
acl blocked_domains dstdomain "/etc/squid/blocked_domains.txt"
http_access deny blocked_domains
http_access allow localnet
http_access deny all

顺序再强调一遍:deny在allow前面,改完后三步走:

  1. squid -k parse 检查语法
  2. squid -k reconfigure 热加载配置,不断开现有连接
  3. 用squidclient -h 127.0.0.1 -p 3128 http://www.example.com/在服务器本地发起测试请求

第三步很关键,直接拿客户端浏览器测,中间隔着DNS、防火墙、透明代理好几层,出问题时很难判断是Squid没拦住还是请求压根没到Squid。在代理服务器本机用squidclient测,能把问题范围一次缩小到配置本身。

用access.log验证到底拦没拦住

去/var/log/squid/access.log看结果,被拦的请求会留下类似这样的记录:

123  0 10.1.2.3 TCP_DENIED/403 3985 GET http://www.example.com/ - HIER_NONE/- text/html

看到TCP_DENIED/403就说明规则命中了,如果日志里显示TCP_MISS/200,那说明请求被放行了,回头检查是不是上面的allow规则提前命中,或者域名写法没覆盖到实际访问的主机名。

多地办公网络怎么统一策略

北京总部、上海分部、分支机构各自出网的情况很常见,与其每台Squid各维护一份清单,不如把域名文件放在内网共享位置或通过配置管理工具统一下发,各地Squid只保留自己的网段和上游代理设置。策略集中、执行分散,是这类多地域部署里维护成本最低的做法。

四种域名匹配方式对比,选错类型会带来性能问题

ACL类型 匹配对象 典型用途 性能表现
dstdomain 请求的目标域名(Host头) 整站拦截、白名单放行 高,采用哈希查找
dstdom_regex 域名正则 规律性强的批量域名 中,规则多时明显下降
url_regex 完整URL 拦截特定路径或关键词 低,逐条扫描
ssl::server_name HTTPS握手中的SNI 加密流量下的域名识别 中,依赖客户端发送SNI

为什么HTTPS站点靠dstdomain就够了,路径过滤却不行

用户访问https://www.example.com/xxx时,Squid作为普通代理只收到CONNECT www.example.com:443看不到,这意味着基于域名的拦截在HTTPS下依然有效,基于路径或URL关键词的拦截则会失效,想识别加密连接里的域名,需要Squid 3.5之后的ssl::server_name,并且客户端不能关闭SNI,若碰上要求明文审查路径的场景,就只能上SSL中间人方案,随之而来的证书分发和合规评估成本要提前算清楚。

通配符和域名变体:最容易漏网的几个地方

子域名与多级域名

.example.com能覆盖一层到多层的子域名,但拦不住example.com.cn、example-com.net这类形近域名,仿冒站点往往是这么绕的,清单里该加的一条都别省。

CDN和IP直连是绕行通道

如果只按域名拦,用户完全可能通过CDN节点IP直连,或换一个未登记的域名访问同一资源,业内专家指出,域名过滤只能管住“名字”,管不住“地址”,对高风险目标要配合dst类型的IP网段拦截一起做,代价是CDN的IP会变,维护清单需要定期更新。

透明代理下Host头可能缺失

在网关做透明代理时,明文HTTP请求的Host头一般是有的,但一旦涉及加密流量,域名信息只能靠SNI获取。部署前先确认自己的代理模式是显式代理还是透明代理,这决定了dstdomain到底能发挥几成作用。

squid和nginx域名过滤哪个好?先看你的场景

这两个常被拿来比较,其实定位不同:

  • Squid:专职正向代理,ACL体系完整,支持按用户、时间段、网段组合控制,日志字段细,适合内网出口管控
  • Nginx:反向代理和Web服务为主,做域名拦截通常是在服务端返回403,面向的是访问自己服务的请求,而不是替用户出网

简单说,管“员工能不能访问外网某站”选Squid,管“外部请求能不能访问我的服务”选Nginx,也有人用Nginx的map或if做轻量拦截,规则一多就难维护,ACL的可读性和日志追溯性都跟不上,行业共识认为,正向代理场景下Squid仍是配置表达力最强的开源方案之一。

squid部署成本高吗?免费软件不等于零成本

Squid本身是开源软件,授权费用为零,这一点没有争议,真正的成本在别处:

  • 服务器硬件或云主机费用
  • 出口带宽,代理层会带来额外转发开销
  • 运维人力,域名清单要持续维护
  • 高可用投入,主备或集群方案
  • SSL中间人方案涉及的证书管理与合规评估

中小规模内网,一台中等配置的机器加定期维护就能跑起来;规模上去之后,瓶颈通常先出现在磁盘IO和日志写入上,而不是ACL匹配本身。预算评估时把人力算进去,往往比软件许可本身更影响总账。

收个尾

域名过滤这件事,规则本身不难,难的是顺序、类型和验证方法这三处细节。把deny放在allow前面、用dstdomain而不是url_regex去拦域名、改完配置先parse再reconfigure,照这三点走,绝大多数“配了没效果”的问题都不会出现。

关于squid域名过滤的常见疑问

squid域名过滤规则改了为什么没生效?

九成情况是三个原因之一:配置没执行squid -k reconfigure;http_access allow写在了deny前面导致提前放行;域名没带前导点,子域名没被覆盖,按squid -k parse、检查规则顺序、核对域名写法三步排查,基本都能定位。

squid能拦截HTTPS网站的特定路径吗?

不能,普通代理模式下,Squid只能看到CONNECT请求里的域名和端口,加密后的URL路径不可见,要判断加密流量中的具体路径,必须部署SSL中间人并让客户端信任代理证书,这涉及证书分发和合规评估,属于另一个量级的工程,仅拦截整站域名的话,dstdomain在HTTPS下照常生效。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱