Apache 2.4 必须用 Require ip 配合 RequireAll/RequireAny,旧版 Order 指令已失效;授权模型为默认拒绝,需显式允许内网IP,如 Require all denied 后跟 Require ip 192.168.10.0/24 和 10.0.5.22。

Apache 2.4 中用 Require ip 实现内网IP白名单
直接结论:Apache 2.4 必须用 Require ip 指令配合 RequireAll / RequireAny 容器,Order Allow,Deny 这类旧语法在新版里完全失效,配置后 403 却没报错?大概率是模块没启用或语法写错。
关键点在于 Apache 2.4 的授权模型已改为“默认拒绝”,不显式允许即拦掉。所以白名单不是“只放行某些IP”,而是“拒绝所有,再单独放行指定IP”。
-
mod_authz_host必须启用(2.4 默认开启,但精简版容器或自编译环境可能未加载) - 配置必须放在
<directory></directory>、<location></location>或虚拟主机段内,不能只写在全局 ServerConfig - 内网地址要写完整,比如
192.168.1.0/24,不能只写192.168.1
如何正确配置开发目录的白名单访问
假设你的开发代码放在 /var/www/dev-site,只想让公司内网 192.168.10.0/24 和测试机 10.0.5.22 访问,其他一律 403:
<Directory "/var/www/dev-site">
Require all denied
Require ip 192.168.10.0/24
Require ip 10.0.5.22
</Directory>
注意顺序无关——Require 是“满足任一即可通过”,但前面的 Require all denied 是兜底拒绝。如果漏掉这句,Apache 会按默认策略(通常是 Require all granted)放行,白名单就形同虚设。
- 多个
Require ip行是“或”关系,不是“且” - IPv6 地址需用方括号,如
Require ip "2001:db8::/32" - 若开发机走 NAT 或反向代理(比如前端用 Nginx 转发),
Require ip匹配的是代理 IP,不是真实客户端 IP,此时需配合RemoteIPHeader和RemoteIPInternalProxy
为什么本地 127.0.0.1 访问也被拒了?
常见现象:配置完白名单,自己在服务器本机用 curl http://localhost 或浏览器访问直接 403。这是因为 127.0.0.1 不在你写的任何网段里。
解决方法很简单,在白名单里显式加上本地回环:
Require ip 127.0.0.1 Require ip ::1
别指望 Apache 自动识别 localhost —— 它只看 TCP 层实际源 IP。另外,Docker 容器内访问宿主机 Apache 时,源 IP 往往是 172.17.0.1 这类网桥地址,也得单独加进白名单。
调试白名单是否生效的最快方式
别靠反复刷新网页猜,直接查 Apache 的访问日志和错误日志:
- 在
Require规则后加LogLevel authz_core:trace4(仅临时),然后tail -f /var/log/apache2/error.log看每条请求的授权决策链 - 确认日志中出现类似
[authz_core:debug] ... AH01626: authorization result of Require ip ...: denied或granted - 用
curl -v http://your-dev-site/ --interface 192.168.10.5强制绑定某内网 IP 发起请求,验证匹配逻辑
最常被忽略的一点:Apache 配置修改后必须 apachectl graceful 或 systemctl reload apache2,restart 有时会中断连接,而 graceful 才能确保新配置热生效且不丢请求。

















