在企业内网对外提供服务或公开站点承受扫描攻击时,运维人员经常需要在Web服务器层面限制哪些IP可以访问、哪些IP必须阻断。Apache作为主流HTTP服务器,提供了非常成熟且灵活的访问控制机制,能够直接根据客户端IP地址执行白名单放行与黑名单拒绝。理解这套机制不仅有助于提升安全性,也能在遭遇突发流量时快速响应。

Apache访问控制指令的演进与基础语法
早期Apache 2.2版本使用Order、Allow、Deny指令来做IP控制,例如Order Deny,Allow配合Deny from 192.168.1.5。但从Apache 2.4开始,官方推荐使用基于Require的授权指令,旧指令虽可通过兼容模块使用,但容易在新版本中出现配置语义混淆。新语法将访问控制统一纳入授权阶段,逻辑更清晰,也支持与身份验证等其他限制组合。
在2.4中,最核心的指令是Require ip与Require not ip。前者表示允许指定地址,后者表示拒绝。它们通常放在<Directory>、<Location>或虚拟主机配置块内。需要特别注意的是,当多条Require同时出现时,默认是“满足任一即授权”,若想表达“必须满足全部条件”,要使用RequireAll容器。很多站点配置后不生效,就是因为没理解这个默认逻辑。
下面是一段最小可运行的Apache 2.4配置示例,展示如何拒绝单个IP并允许内网段:
<Directory "/var/www/html">
RequireAll
Require ip 10.0.0.0/8
Require not ip 10.0.0.50
</Directory>
上述配置中,RequireAll保证内部条件都要满足,即来源必须在10大网段内,且不能是10.0.0.50这台主机。若去掉RequireAll直接写两条Require,Apache会认为只要满足其中一条就通过,黑名单就失效了。
白名单与黑名单的典型配置方案
白名单模式适用于后台管理、内部接口等只允许少数IP访问的场景。思路是先拒绝所有,再显式放行。Apache中可以用RequireAll包含Require all denied与若干Require ip来实现。这种写法比逐条拒绝未知地址更可控,也避免遗漏。
例如公司运维后台仅允许办公网出口IP与跳板机访问,配置如下:
<Location "/admin">
RequireAll
Require all denied
Require ip 203.0.113.10
Require ip 198.51.100.0/24
</Location>
黑名单则常用于公开站点,正常用户都能访问,仅封锁骚扰者。此时不需要Require all denied,直接写Require not ip即可,其余请求由默认放行承接。如果全局默认是放行的,那么下面这段就能单独屏蔽两个恶意爬虫IP:
<Directory "/var/www/html">
Require not ip 45.83.22.11
Require not ip 91.214.124.0/23
</Directory>
当黑白名单需要并存时,建议把黑名单放在RequireAll内配合白名单使用,或者用RequireAny与RequireAll嵌套表达复杂逻辑。切忌在无意中用相互矛盾的指令导致合法用户被挡在门外,上线前应使用apachectl configtest检查语法并用curl从外部IP验证。
基于.htaccess与模块扩展的灵活实践
若没有服务器主配置权限,比如租用共享虚拟主机,可以把规则写入站点根目录的.htaccess文件。只要主配置中对应目录设置了AllowOverride AuthConfig或更高权限,.htaccess里的Require指令就会生效。这种方式修改无需重启Apache,适合频繁调整封锁列表的运营人员。
一个.htaccess黑名单示例:
Require all granted Require not ip 103.224.182.0/24 Require not ip 141.98.10.20
对于超大规模IP库,纯文本指令会让配置臃肿,可借助mod_rewrite结合外部文件,或编译mod_security做更高效的CIDR匹配。另外,若前端有CDN或负载均衡,Apache看到的远程地址会是上层设备IP,此时要先还原真实客户端IP,例如使用mod_remoteip并设置RemoteIPHeader X-Forwarded-For,否则黑白名单会误伤中转节点。掌握这些细节,才能让Apache的IP访问控制真正贴合业务拓扑。
ApacheIP_whitelistIP_blacklist修改时间:2026-08-19 01:24:27