如何通过.htaccess有效封禁恶意IP?常规拦截规则失效解决方法
Apache环境下IP封禁失效原因及可靠封禁方案
原有规则失效的核心原因
- 第一条
Require not ip 46.161.11.规则失效:要么是Apache 2.4版本下访问控制规则顺序错误,没有用<RequireAll>包裹导致允许规则覆盖了拒绝规则;要么是站点前置了CDN/反向代理,Apache拿到的REMOTE_ADDR是代理节点IP而非真实访客IP;还有可能是目录配置没开AllowOverride All,.htaccess文件根本没被加载。 - 第二条Rewrite规则失效:一方面正则存在冗余设计,虽然理论上能覆盖0-299的地址,但如果Apache没加载mod_rewrite模块、没开AllowOverride,规则本身不会执行;另一方面如果存在代理,匹配到的IP本身就是错的。另外如果恶意访客IP是46.161.11.段内带IPv6映射的地址,原正则也会匹配失败。
按可靠性排序的封禁方案
1. 网络层封禁(无绕过可能,性能最优)
优先在服务器防火墙层面拦截恶意IP段,流量在到达Apache之前就会被丢弃,完全不受Apache配置影响:
- firewalld(CentOS/RHEL 7+默认防火墙)执行以下命令封禁整个C段:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="46.161.11.0/24" drop' firewall-cmd --reload
- iptables执行以下命令:
iptables -I INPUT -s 46.161.11.0/24 -j DROP service iptables save
2. Apache原生访问控制规则(适合无服务器操作权限场景)
如果只能用.htaccess配置,先确认两个前提:一是站点目录的Apache配置已设置AllowOverride All,.htaccess可正常生效;二是如果前置了CDN/反代,已经配置mod_remoteip模块获取到了真实访客IP,否则所有IP规则都无效。
确认前提后,用Apache 2.4官方推荐的访问控制语法,不要用Rewrite做IP拦截(性能差、易出错):
<RequireAll> Require all granted Require not ip 46.161.11.0/24 </RequireAll>
注意:必须用
<RequireAll>标签包裹规则,确保“允许所有合法访问、拒绝指定IP段”的逻辑按顺序执行,避免单条Require not ip被全局允许规则覆盖。IP段直接用标准CIDR格式书写,不要只写前缀,兼容所有Apache 2.4版本。
如果环境特殊必须用Rewrite规则,简化正则避免漏匹配,同时确认mod_rewrite模块已加载:
RewriteEngine On RewriteCond %{REMOTE_ADDR} ^46\.161\.11\. RewriteRule ^ - [F,L]
3. 代理/CDN场景适配
如果站点前置了CDN、反向代理,必须先配置Apache信任代理节点,将REMOTE_ADDR替换为真实访客IP字段(比如Cloudflare对应CF-Connecting-IP、Nginx反代对应X-Forwarded-For),之后再写上述封禁规则,否则拦截的永远是代理节点IP,无法命中真实恶意访客。
内容的提问来源于stack exchange,提问作者josefus
相关产品推荐
相关产品推荐

