apache的mod_proxy本身不处理访问控制,限制ip必须在proxypass前用或块配合require ip和require all denied实现白名单;多ip需分行写,且需防火墙协同放行。
apache 的 mod_proxy 本身不负责访问控制,它只做请求转发。真正限制特定 ip 访问,必须在代理指令(如 proxypass)**之前**,通过 apache 的授权模块(如 mod_authz_host)配置访问策略。
用 Require ip 做 IP 白名单(最常用)
适用于内网 API、管理后台等只需来源可信的场景。关键点有三个:
- 必须用
<location></location>或<proxy></proxy>块包裹代理指令,把权限规则写在里面 - 多个 IP 或网段要单独写多行
Require ip,不能用空格或逗号分隔 - 必须搭配
Require all denied放在最后,否则默认放行——这是配置失效最常见的原因
示例:只允许两个内网段访问 /api/
ProxyPass "http://192.168.1.20:8080/"
ProxyPassReverse "http://192.168.1.20:8080/"
Require ip 192.168.10.0/24
Require ip 10.0.5.0/24
Require all denied
正向代理也要限制来源 IP
如果启用了正向代理(ProxyRequests On),白名单必须放在 <proxy></proxy> 块中,并配合 AllowCONNECT 控制 HTTPS 隧道端口:
-
Require all denied必须写在最前面,再逐条加Require ip - 若需访问 HTTPS 网站,必须明确允许 CONNECT 方法的目标端口,比如
AllowCONNECT 443 8443 - 仅靠 Apache 配置不够,防火墙(如 firewalld)也得按相同 IP 段放行代理端口(如 3128/tcp)
示例:
安装并运行 Aperture(Lightning Labs 的 L402 闪电反向代理),用于创建 L402 付费墙、配置付费 API 端点、为其他代理托管付费内容或测试 L402 认证流程。
Require all denied
Require ip 192.168.20.0/24
AllowCONNECT 443 8443
结合用户认证做双重校验
适合高敏感接口,要求“IP 合法 + 账号有效”同时满足。不能把 Require ip 和 Require user 并列写——那是 OR 关系,会降低安全性。
- 必须用
<requireall></requireall>包裹,明确表达“且”的逻辑 - 需要提前配置 Basic 认证:指定
AuthType、AuthName和AuthUserFile - 确保
mod_auth_basic和mod_authn_file已启用
示例:
AuthType Basic
AuthName "Admin API"
AuthUserFile /etc/apache2/auth/.htpasswd
Require ip 192.168.5.0/24
Require user admin ops
ProxyPass "http://backend:8080/admin/"
ProxyPassReverse "http://backend:8080/admin/"
注意真实客户端 IP 的识别问题
如果前端有 CDN、负载均衡或反向代理,%{REMOTE_ADDR}e 可能是代理 IP 而非真实用户 IP,导致白名单失效。
- Nginx 前置时,Apache 需启用
mod_remoteip,并配置RemoteIPHeader X-Forwarded-For - Cloudflare 等服务,需在 Apache 中设置可信源 IP 段(
RemoteIPTrustedProxy) - 验证方式:在
<location></location>中加SetEnvIf X-Forwarded-For "^(.+)$" REAL_IP=$1,再用Require ip %{REAL_IP}e测试










