我已将 nginx 设置为监听端口 8080 的一组 apache(LAMP)后端的反向代理。
我还配置了每个后端服务器的mod_rpaf.conf
文件以包含 nginx 服务器的代理 IP:
<IfModule mod_rpaf.c>
RPAF_Enable On
RPAF_ProxyIPs 127.0.0.1 192.168.0.1 # <- nginx server IP
RPAF_Header X-Forwarded-For
RPAF_SetHostName On
RPAF_SetHTTPS On
RPAF_SetPort On
</IfModule>
我如何配置httpd.conf
以拒绝任何不是来自 nginx 的连接?
我尝试了以下方法:
<Directory "/var/www/html">
Order allow,deny
Allow from 192.168.0.1
Allow from 127
Deny from all
</Directory>
但这似乎限制了对 nginx 代理本身以及任何其他 IP 的访问。
这是由于mod_rpaf
转发客户端 IP 造成的吗?如果是这样,我该如何解决这个问题?
答案1
由于 mod_rpaf 模块转发了真实的客户端 IP,因此您无法通过其自己的httpd.conf
文件阻止对 apache 后端服务器的公共访问。
设置一些 IPtables 规则将阻止除 nginx 反向代理之外的所有人(公共访问)访问端口 8080,而不会影响客户端真实 IP 的转发:
跑步:
#iptables -A INPUT -p tcp --dport 8080 -s 192.168.0.1 -j ACCEPT
#iptables -A INPUT -p tcp --dport 8080 -j DROP
#service iptables save
#service iptables restart
现在仅限于 nginx 代理访问端口 8080 上的 apache 后端服务器。
答案2
我认为您应该像这样更改允许/拒绝语句的顺序:
<Directory "/var/www/html">
Order deny,allow
Deny from all
Allow from 192.168.0.1
Allow from 127
</Directory>
因为 (订单文档)
排序方式如下:
允许、拒绝 - 首先,评估所有允许指令;至少必须有一个匹配,否则请求将被拒绝。接下来,评估所有拒绝指令。如果有任何匹配,则请求将被拒绝。最后,任何不匹配允许或拒绝指令的请求都将被默认拒绝。
Deny,Allow - 首先,评估所有 Deny 指令;如果匹配,则拒绝请求,除非该请求还匹配 Allow 指令。任何不匹配 Allow 或 Deny 指令的请求均被允许。
例如文档:
通过结合 Deny 和 Allow 指令,使用 Order 可以确保您确实将事物限制在您想要允许进入的组中:
Order deny,allow
Deny from all
Allow from dev.example.com