您的位置: 新闻资讯 > 行业动态 > 正文

Apache防火墙User-Agent过滤:精准拦截恶意请求的实战指南(图文)


来源:mozhe 2025-08-14

一、为什么需要过滤 User-Agent?


(一)恶意请求的常见伪装


User-Agent(UA)是客户端发送给服务器的身份标识,它就像是客户端访问服务器时递上的一张 “名片”,上面记录了客户端的相关信息,比如使用的浏览器类型、操作系统、软件版本等。正常情况下,它帮助服务器识别来访客户端的身份,以便服务器能提供适配的内容。但在网络的阴暗角落里,垃圾爬虫、扫描工具、恶意程序等常常利用 User-Agent 进行伪装。
以垃圾爬虫为例,为了突破网站的反爬机制,它们可能会将自己的 User-Agent 伪装成常见浏览器的标识,像 “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36” ,企图蒙混过关,大量抓取网站数据,占用服务器资源,影响网站正常运营。还有一些扫描工具,会在 User-Agent 字段中加入特定的标识,如 “Nmap Scripting Engine”,来探测服务器的漏洞,一旦发现可乘之机,便可能发起攻击。恶意程序也不甘示弱,通过修改 User-Agent 来隐藏自己的真实身份,偷偷在网络中传播和破坏。
通过 UA 过滤,就如同在服务器的大门前安排了一位火眼金睛的守卫,能够精准地识别出这些伪装的恶意请求,只允许合法的浏览器正常访问进入,从而减轻服务器的压力,提升服务器的安全性,确保网站能够稳定、高效地为正常用户提供服务。

(二)与传统防火墙的互补


在网络安全的防护体系中,传统防火墙,如基于网络地址转换(NAT)和端口过滤的防火墙,发挥着重要作用,它们在网络层守护着网络的边界,阻挡着来自外部的一些明显的攻击,比如阻止未经授权的 IP 地址访问内部网络,限制特定端口的访问等。然而,随着网络技术的发展和攻击手段的日益复杂,这些传统防火墙逐渐暴露出在应用行为识别上的不足。
Apache 防火墙基于 User-Agent 过滤,就像是为网络安全防护体系增添了一双能够洞察应用层细节的 “慧眼”。它可以深入到应用层流量中,对每一个请求的 User-Agent 进行分析和判断。例如,当一个请求到达时,传统防火墙可能只能判断其 IP 地址和端口是否合法,但无法得知这个请求到底是来自正常的浏览器访问,还是恶意的爬虫或扫描工具。而 Apache 防火墙通过对 User-Agent 的过滤,能够识别出请求的来源是否正常。如果是一个伪装成浏览器的恶意爬虫请求,即使它的 IP 地址和端口看起来没有问题,Apache 防火墙也能根据 User-Agent 的特征将其拦截下来。这样,Apache 防火墙基于 User-Agent 的过滤功能与传统防火墙在网络层的防护相互补充,形成了一个多层次、全方位的防护体系,大大增强了网络的安全性,更有效地抵御各种网络攻击。

二、Apache User-Agent 过滤核心原理

(一)UA 解析与匹配机制


Apache 主要通过mod_setenvif和mod_rewrite模块来解析 User-Agent 请求头。当一个 HTTP 请求到达 Apache 服务器时,这两个模块就开始发挥作用。mod_setenvif模块能够根据设定的规则,对 User-Agent 字符串进行细致的分析和匹配。它支持使用正则表达式来定义匹配模式,这就为我们提供了极大的灵活性。
例如,我们可以使用正则表达式.*(Python-urllib|wget).*来匹配那些使用 Python 的 urllib 库或者 wget 工具发起的请求。这里的.*表示任意字符出现任意次数,括号内是我们要匹配的关键词,整个表达式的意思就是匹配包含 “Python-urllib” 或 “wget” 的 User-Agent 字符串。mod_rewrite模块同样强大,它不仅可以处理 URL 的重写,还能在这个过程中对 User-Agent 进行解析和判断。在进行 User-Agent 匹配时,不区分大小写是一个非常实用的特性。比如,我们要匹配 “Chrome” 浏览器,无论 User-Agent 中是 “Chrome”“chrome” 还是 “CHROME”,都能被正确识别。这是因为在设置匹配规则时,我们可以使用SetEnvIfNoCase指令(mod_setenvif模块中的指令),它会忽略 User-Agent 字符串中的大小写差异 ,确保匹配的准确性和全面性。
通过这些模块和指令,Apache 能够精准地捕获到包含特定关键词的 User-Agent 字符串。除了前面提到的恶意程序和工具的标识,像 “Baiduspider”(百度爬虫)、“Googlebot”(谷歌爬虫)等搜索引擎爬虫的标识也能被轻松识别。这使得我们可以根据实际需求,对不同来源的请求进行针对性的处理,比如允许合法的搜索引擎爬虫正常访问,而对恶意的爬虫和工具进行拦截。

(二)访问控制逻辑


在 Apache 中,通过mod_authz_host和mod_setenvif的巧妙组合,实现了对访问的精细控制。具体来说,首先利用mod_setenvif模块定义 User-Agent 的匹配规则。比如,我们可以使用以下指令:

 
SetEnvIfNoCase User-Agent ".*(BadBot1|BadBot2).*" BADBOT
这条指令的作用是,当 User-Agent 字符串中包含 “BadBot1” 或 “BadBot2” 时(不区分大小写),就设置一个名为 “BADBOT” 的环境变量。这里的 “BADBOT” 就像是一个标记,用来标识这个请求可能来自恶意的爬虫或工具。
接下来,借助mod_authz_host模块,根据设置的环境变量来执行访问控制策略。例如:

 
<RequireAll>
Require all granted
Require not env BADBOT
</RequireAll>
这段配置的含义是,首先允许所有的请求(Require all granted),然后拒绝那些环境变量 “BADBOT” 被设置的请求(Require not env BADBOT)。通过这样的方式,就实现了 “白名单 + 黑名单” 的灵活控制。如果我们想设置白名单,只允许特定的 User-Agent 访问,可以先定义好白名单的 User-Agent 匹配规则并设置相应的环境变量,然后在访问控制策略中只允许这些环境变量对应的请求通过。这种基于环境变量的访问控制逻辑,使得 Apache 在处理 User-Agent 过滤时更加灵活和高效,能够适应各种复杂的网络安全需求。

三、3 步搞定 Apache UA 过滤配置


在了解了为什么需要过滤 User-Agent 以及 Apache User-Agent 过滤的核心原理之后,接下来就是实际操作环节了。下面将详细介绍如何在 Apache 服务器上进行 User-Agent 过滤配置,分为基础配置、灵活配置和高级技巧三个部分,从简单到复杂,逐步满足不同场景下的需求。

(一)基础配置:修改 httpd.conf(全局生效)

  1. 定位配置段:打开 Apache 主配置文件 httpd.conf,这个文件是 Apache 服务器的核心配置文件,通常位于 /etc/httpd/conf/ 目录下(不同系统和安装方式可能略有不同)。在文件中找到<Directory>或<VirtualHost>标签。如果希望对整个服务器生效,可以直接在<Directory>标签内进行配置;但为了更精细的控制,建议针对特定目录或虚拟主机配置,这样可以避免对其他部分产生不必要的影响。例如,如果要对网站根目录进行配置,可以找到类似<Directory /var/www/html>的标签。
  1. 添加匹配规则:使用SetEnvIfNoCase指令来定义恶意 User-Agent 模式。假设我们要阻止一些常见的恶意爬虫,比如 “BadBot1” 和 “BadBot2”,可以添加以下配置:

 
<Directory /var/www/html>
SetEnvIfNoCase User-Agent ".*(BadBot1|BadBot2).*" BADBOT
Deny from env=BADBOT
</Directory>
这段配置的解析如下:SetEnvIfNoCase User-Agent ".*(BadBot1|BadBot2).*" BADBOT,这里的SetEnvIfNoCase表示不区分大小写地匹配 User-Agent 字符串,User-Agent指定要匹配的请求头字段,".*(BadBot1|BadBot2).*"是正则表达式,意思是匹配包含 “BadBot1” 或 “BadBot2” 的 User-Agent 字符串,匹配成功则设置BADBOT环境变量;Deny from env=BADBOT则表示拒绝所有携带BADBOT环境变量的请求。通过这样的配置,只要 User-Agent 中包含我们定义的恶意关键词,就会被拒绝访问。
3. 重启服务生效:完成配置修改后,需要重启 Apache 服务才能使新的配置生效。在 CentOS 系统中,可以执行systemctl restart httpd命令;在 Ubuntu 系统中,执行apachectl restart命令。重启过程中,如果配置文件存在语法错误,服务器会提示错误信息,这时需要检查配置文件并修正错误,直到服务器能够正常重启。

(二)灵活配置:.htaccess 文件(目录级生效)

  1. 启用重写模块:首先要确保mod_rewrite模块已启用,这个模块是实现基于.htaccess文件进行灵活配置的关键。打开 httpd.conf 文件,检查是否包含LoadModule rewrite_module modules/mod_rewrite.so这一行,如果被注释掉(前面有#符号),则去掉注释符号。保存文件后,重启 Apache 服务,使模块生效。也可以通过命令apachectl -M | grep rewrite(在基于 Debian 的系统中)或httpd -M | grep rewrite(在基于 RHEL 的系统中)来检查mod_rewrite模块是否已经启用,如果输出中包含rewrite_module (shared),则表示模块已启用。
  1. 编写重写规则:在目标目录(如网站根目录/var/www/html)创建或修改.htaccess文件。如果该目录下已经存在.htaccess文件,则直接编辑;如果不存在,可以使用文本编辑器创建一个新的文件。添加以下重写规则:

 
RewriteEngine On
RewriteCond %{HTTP_USER_AGENT} ^$ [OR]
RewriteCond %{HTTP_USER_AGENT} BadBot1|BadBot2 [NC]
RewriteRule. - [F,L]
这段配置的解析如下:RewriteEngine On表示开启重写引擎;RewriteCond %{HTTP_USER_AGENT} ^$ [OR]定义了第一个匹配条件,即 User-Agent 为空的情况,[OR]表示与下一个条件是 “或” 的关系;RewriteCond %{HTTP_USER_AGENT} BadBot1|BadBot2 [NC]是第二个匹配条件,[NC]表示不区分大小写,即匹配 User-Agent 中包含 “BadBot1” 或 “BadBot2” 的情况;RewriteRule. - [F,L]表示如果前面的条件匹配成功,就执行该规则,[F]表示返回 403 禁止访问错误,[L]表示终止后续规则处理。这样,当请求的 User-Agent 满足我们设定的条件时,就会被禁止访问。
3. 验证配置:配置完成后,需要验证配置是否生效。可以使用curl -A "恶意UA" http://你的域名命令来模拟请求,例如curl -A "BadBot1" http://example.com。如果配置成功,服务器应该返回 403 禁止访问的错误信息。如果返回其他结果,可能是配置存在问题,需要检查重写规则、模块启用情况以及.htaccess文件的权限等。

(三)高级技巧:区分移动端与 PC 端

  1. 识别移动设备 UA:通过BrowserMatch指令可以匹配移动端特征。在 httpd.conf 文件或虚拟主机配置文件中添加以下配置:

 
BrowserMatch "Mobile|Android|iPhone" mobile_device
<If "env('mobile_device')">
# 这里可以添加针对移动端的配置,例如重定向到移动站点
RedirectMatch permanent ^/(.*)$ http://m.example.com/$1
</If>
这段配置的解析如下:BrowserMatch "Mobile|Android|iPhone" mobile_device表示当 User-Agent 中包含 “Mobile”“Android” 或 “iPhone” 等关键词时,设置mobile_device环境变量;<If "env('mobile_device')">和</If>之间的部分是条件判断,如果mobile_device环境变量被设置,就执行里面的配置。这里使用RedirectMatch permanent ^/(.*)$ http://m.example.com/$1将所有请求重定向到http://m.example.com移动站点,^/(.*)$是正则表达式,匹配根目录下的所有请求,$1表示捕获到的请求路径,用于在重定向的目标 URL 中保持路径一致。
2. 应用场景:这种区分移动端与 PC 端的配置在很多场景下都非常有用。比如,网站可能有专门为移动端设计的页面,通过这种配置可以自动将移动端请求重定向到适配的移动站点,提升用户体验。对于一些内容展示类网站,移动端和 PC 端的页面布局、内容排版可能有很大差异,通过自动重定向,可以确保用户在移动端访问时看到更适合手机屏幕的页面。另外,对于一些功能,如在线视频播放,移动端可能需要使用不同的播放器或视频格式,通过区分移动端和 PC 端,服务器可以根据用户设备类型提供不同的内容,提高服务质量和用户满意度。

四、实战案例:屏蔽垃圾爬虫与扫描工具

(一)常见恶意 UA 清单


在网络环境中,识别恶意 User-Agent 是防范垃圾爬虫和扫描工具的关键一步。以下是一些常见的恶意 UA 关键词及其对应的工具或行为,这些信息对于配置 Apache 防火墙的 User-Agent 过滤规则至关重要。
恶意 UA 关键词 对应工具 / 行为
Python-urllib、Scrapy Python 爬虫框架
wget、curl 编程式 HTTP 请求工具
AhrefsBot、Semrushbot SEO 爬虫(可能过度抓取)
(空 UA) 非法扫描或采集工具

以 Python 爬虫框架为例,很多未经授权的爬虫会使用 Python 的urllib库或者强大的Scrapy框架来进行数据抓取,它们在发送请求时,User-Agent 中往往会包含 “Python-urllib” 或 “Scrapy” 等关键词。而 “wget” 和 “curl” 作为常用的命令行 HTTP 请求工具,也常被恶意攻击者用来编写自动化的扫描脚本,当这些工具发起请求时,User-Agent 中就会出现它们的标识。对于 SEO 爬虫,虽然它们在正常情况下有助于网站内容的索引和排名提升,但一些不良的 SEO 爬虫可能会过度抓取网站数据,对服务器资源造成较大压力,像 “AhrefsBot”“Semrushbot” 就属于这类可能存在风险的 SEO 爬虫。另外,空 UA 的请求也非常可疑,许多非法扫描或采集工具为了隐藏身份,会故意不设置 User-Agent 字段,一旦检测到这样的请求,很有可能就是恶意攻击的前奏。

(二)完整配置示例


为了更有效地拦截恶意请求,下面给出一个完整的 Apache 配置示例,该示例同时拦截空 UA 和包含爬虫关键词的请求,能大大减少无效流量,保护服务器的安全和稳定。

 
<IfModule mod_rewrite.c>
RewriteEngine On
# 拦截空UA
RewriteCond %{HTTP_USER_AGENT} ^$ [NC]
RewriteRule. - [F,L]
# 拦截包含爬虫关键词的UA
RewriteCond %{HTTP_USER_AGENT} (Python-urllib|Scrapy|wget|curl|AhrefsBot|Semrushbot) [NC]
RewriteRule. - [F,L]
</IfModule>
这段配置的详细解析如下:首先,<IfModule mod_rewrite.c>和</IfModule>之间的内容表示只有在mod_rewrite模块启用的情况下才会执行这些规则。RewriteEngine On开启了重写引擎,这是使用重写规则的前提。RewriteCond %{HTTP_USER_AGENT} ^$ [NC]定义了第一个匹配条件,%{HTTP_USER_AGENT}表示获取请求头中的 User-Agent 字段,^$表示匹配空字符串,即 User-Agent 为空的情况,[NC]表示不区分大小写。当这个条件满足时,就会执行RewriteRule. - [F,L],其中RewriteRule是重写规则指令,.表示匹配任意字符,-表示不进行 URL 重写,[F]表示返回 403 禁止访问错误,[L]表示终止后续规则处理,也就是说,一旦 User-Agent 为空,就直接返回 403 错误,不再处理后续规则。RewriteCond %{HTTP_USER_AGENT} (Python-urllib|Scrapy|wget|curl|AhrefsBot|Semrushbot) [NC]定义了第二个匹配条件,用于匹配 User-Agent 中包含指定爬虫关键词的情况,同样不区分大小写。当这个条件满足时,也会执行RewriteRule. - [F,L],返回 403 禁止访问错误并终止后续规则处理 。通过这样的配置,就能够有效地拦截空 UA 和包含常见爬虫关键词的恶意请求,为服务器提供更强大的防护。

五、常见问题与避坑指南

(一)配置不生效?检查这 3 点


在进行 Apache User-Agent 过滤配置时,有时会遇到配置不生效的情况,这可能会让人感到困惑和头疼。不过,只要按照以下三个方面仔细检查,通常都能找到问题所在并解决。
  1. 模块是否启用:mod_setenvif 和 mod_rewrite 模块是实现 User-Agent 过滤的关键,如果这两个模块没有启用,那么配置自然不会生效。可以通过apachectl -M命令来查看当前 Apache 加载的模块列表,检查其中是否包含mod_setenvif和mod_rewrite。如果未启用,就需要在 httpd.conf 文件中添加对应的 LoadModule 指令。例如,添加LoadModule setenvif_module modules/mod_setenvif.so和LoadModule rewrite_module modules/mod_rewrite.so,然后重启 Apache 服务,使模块生效。
  1. 正则表达式正确性:正则表达式是定义 User-Agent 匹配规则的核心,但它的语法较为复杂,很容易出错。一个错误的正则表达式可能导致无法匹配到预期的 User-Agent,从而使配置失效。为了确保正则表达式的正确性,可以使用在线工具,如 RegExr。在 RegExr 中,可以输入正则表达式和测试字符串,实时查看匹配结果。比如,当我们要匹配包含 “Python-urllib” 的 User-Agent 时,正则表达式.*Python-urllib.*,如果在测试中无法匹配到包含该关键词的测试字符串,就需要检查正则表达式是否正确。要特别注意转义字符的使用,在正则表达式中,一些特殊字符,如点号(.)、星号(*)等,都有特殊含义,如果要匹配这些字符本身,就需要使用转义字符(如。匹配点号)。边界符(^ 表示开头,$ 表示结尾)的使用也很关键,它们可以精确地控制匹配的范围。
  1. 配置作用范围:确保 httpd.conf 或.htaccess 的配置段正确作用于目标目录是非常重要的。如果配置的目录不正确,或者存在层级权限问题,就可能导致规则无法生效。在 httpd.conf 中,<Directory>标签用于指定配置作用的目录,要确保该目录与实际需要过滤的目录一致。对于.htaccess 文件,它只能作用于所在的目录及其子目录,并且需要确保该目录启用了.htaccess文件的解析,即 AllowOverride 指令设置为合适的值(如 AllowOverride All)。如果配置作用范围不正确,可以通过调整<Directory>标签的路径或者检查.htaccess文件的位置和权限来解决。

(二)误封正常请求?精细化调整策略


在进行 User-Agent 过滤时,有时可能会出现误封正常请求的情况,这就需要我们对过滤策略进行精细化调整,以确保既能够阻挡恶意请求,又不会影响正常用户的访问。
  1. 白名单例外:对已知合法的 User-Agent 添加允许规则是解决误封问题的有效方法。比如,百度爬虫 Baiduspider 是搜索引擎爬虫,它的访问对于网站的内容索引和排名提升非常重要。为了确保百度爬虫能够正常访问,可以添加以下允许规则:

 
SetEnvIfNoCase User-Agent "Baiduspider" ALLOWED
<RequireAll>
Require all granted
Require env ALLOWED
</RequireAll>
这段配置的含义是,当 User-Agent 中包含 “Baiduspider” 时,设置ALLOWED环境变量,然后在访问控制中,只允许携带ALLOWED环境变量的请求通过。这样,百度爬虫就不会被误封了。
2. 日志排查:开启 Apache 错误日志和访问日志是排查误封问题的重要手段。通过错误日志,我们可以了解到服务器在处理请求时发生的错误信息;通过访问日志,我们可以查看每个请求的详细信息,包括 User-Agent、请求时间、响应状态等。首先,在 httpd.conf 文件中开启错误日志和访问日志。设置ErrorLog "logs/error_log"来指定错误日志的路径,CustomLog "logs/access_log" combined来指定访问日志的路径和日志格式(这里使用combined格式,它包含了丰富的请求信息)。然后,通过grep "403" logs/access_log命令来定位被拦截的 User-Agent,查看这些 User-Agent 是否属于正常请求。如果发现误封的情况,就需要调整匹配规则,排除这些正常的 User-Agent。例如,如果发现某个合法的客户端软件的 User-Agent 被误封,可以在匹配规则中添加例外条件,使其不会被拦截。

(三)性能影响与优化


虽然 Apache User-Agent 过滤能够有效提升服务器的安全性,但如果配置不当,可能会对服务器的性能产生一定的影响。因此,在进行配置时,需要注意性能优化,确保服务器能够高效稳定地运行。
  1. 减少复杂正则:过于复杂的正则表达式会消耗大量的计算资源,导致服务器性能下降。在定义 User-Agent 匹配规则时,应尽量避免使用过于复杂的正则表达式,如嵌套模式。可以优先匹配关键词前缀,这样能够大大提升匹配效率。例如,当我们要匹配以 “curl” 开头的 User-Agent 时,可以使用^curl这样的简单正则表达式,而不是使用复杂的嵌套模式。因为前缀匹配可以快速地判断出 User-Agent 是否符合条件,减少不必要的计算。对于一些常见的恶意关键词,如 “Python-urllib”“wget” 等,也可以使用简单的前缀匹配,如^Python-urllib和^wget,这样既能准确地识别恶意请求,又能提高匹配效率。
  1. 合并规则:将多个 SetEnvIfNoCase 合并为一条规则,可以减少重复解析,提高服务器的处理速度。例如,原本有多个 SetEnvIfNoCase 指令:

 
SetEnvIfNoCase User-Agent "BadBot1" BADBOT
SetEnvIfNoCase User-Agent "BadBot2" BADBOT
SetEnvIfNoCase User-Agent "BadBot3" BADBOT
可以将它们合并为一条指令:

 
SetEnvIfNoCase User-Agent "BadBot1|BadBot2|BadBot3" BADBOT
这样,服务器在处理请求时,只需要对 User-Agent 进行一次解析,而不是多次解析,从而减少了服务器的负载,提高了性能。在实际应用中,根据具体的需求,将相关的匹配规则进行合并,能够有效地提升服务器的处理效率,特别是在处理大量请求时,这种优化效果会更加明显。

六、总结:构建动态防御体系


通过 Apache 的 User-Agent 过滤,我们在应用层为服务器筑牢了一道防线,能够精准地拦截恶意请求,有效保护服务器的安全。然而,网络安全是一个复杂的体系,单一的防护手段往往难以应对日益复杂的攻击场景。因此,我们需要将 Apache 的 User-Agent 过滤与其他安全设备和技术相结合,形成一个立体的防御体系。
在这个体系中,全流量检测设备实时监控网络中的所有流量,能够及时发现异常流量和潜在的攻击行为,为我们提供早期的预警。WAF 则专注于保护 Web 应用程序,抵御各种常见的 Web 攻击,如 SQL 注入、跨站脚本等。正如素材中提到的护网行动安全架构,通过防火墙、全流量检测、态势感知、IDS、WAF 等设备的协同工作,形成了 “边界过滤 - 应用防护 - 态势感知” 的立体防御体系,大大增强了网络的安全性。
为了确保防御体系始终保持高效的防护能力,我们需要定期更新恶意 UA 库,及时将新出现的恶意 User-Agent 纳入拦截范围。这就如同定期更新病毒库一样,只有不断学习和掌握最新的恶意代码和病毒特征,才能更好地应对新型威胁。我们还应根据业务日志动态调整策略,通过分析日志中的请求信息,了解用户的访问行为和可能存在的安全风险,及时调整过滤规则,确保防护效果与用户体验的平衡。
在进行 Apache User-Agent 过滤配置时,也要注意一些事项。在配置前务必备份原文件,这样在配置出现问题时,能够迅速恢复到原来的状态,避免对业务造成长时间的影响。使用apachectl -t或httpd -t命令检查语法正确性,确保配置文件没有语法错误,避免因语法问题导致服务器启动失败或配置不生效。在小规模测试环境中进行充分的测试,验证配置的有效性和稳定性,确认无误后再全量部署到生产环境,避免影响正常业务。通过这些措施,我们能够更好地利用 Apache 的 User-Agent 过滤功能,构建一个更加安全、稳定的网络环境。

关于墨者安全
墨者安全致力于安全防护、服务器高防、网络高防、ddos防护、cc防护、dns防护、防劫持、高防服务器、高防dns、网站防护等方面的服务,全网第一款指纹识别技术防火墙,自研的WAF指纹识别架构,提供任意CC和DDoS攻击防御

热门文章

X

7x24 小时

免费技术支持

15625276999


-->