我们目前正在使用Lighttpd和FastCGI为我们的客户提供PHP服务。我们最近通过RackSpace Cloud添加了负载均衡来帮助我们处理流量,但客户端的IP现在是负载均衡器IP。所有流量都通过HTTPS。
我们启用了mod_extforward并尝试了所有不同的配置,使用我们的LB IP和不同的标头(“X-Forwarded-For”,“Forwarded-For”,“X-Cluster-Client-Ip”)和我们似乎无法让这个工作!
有什么想法吗?谢谢!
答案 0 :(得分:7)
如果您使用的是Rackspace的云负载均衡器,您将无法通过SSL获取客户端的IP地址。
对于普通HTTP,平衡器可以执行智能操作(“服务不可用”页面,X-Forwarded-for等)但是,负载平衡器除客户端和服务器之间的轮渡字节外无法执行任何操作HTTPS,因为没有私钥,就无法修改流(除了使其无效之外)。
不久前,Rackspace论坛上有人asked this question。答案 1 :(得分:1)
根据Rackspace,如果您的网络应用程序正在传输个人身份信息(PII),则不应使用SSL终止
http://www.rackspace.com/knowledge_center/product-faq/cloud-load-balancers
我不得不求助于在cookie中设置客户端的IP。 cookie是在javascript中设置的。通过对提供客户端公共IP的服务器(不在负载均衡器后面)进行jsonp调用来获得客户端的IP。这就是我能想到的仍然可以利用Rackspace的云负载均衡器。
答案 2 :(得分:0)
Rackspace添加了SSL终止,因此您可以让负载均衡器解密流量并将未加密的流量传递到其服务器节点。有关详细信息,请参阅this。当然,这意味着您将从负载均衡器到Web服务器的有效公共链接发送流量。并且,它只能通过他们的API而不是Web控制台来实现,这很糟糕。
答案 3 :(得分:0)
你实际上可以在这里看到:
用于SSL的正确PHP变量是:
$_SERVER['HTTP_X_FORWARDED_FOR']
答案 4 :(得分:0)
我为负载均衡器和Rackspace下的服务器安装mod_rpaf。然后任何PHP代码与之前使用REMOTE_ADDR
的工作方式相同答案 5 :(得分:0)
我发现解决此问题的一种方法是使用CloudFlare。除了它提供的所有附加功能和好处之外,它实际上是一个代理本身,并将包含自己的x-forwarded-for标头。
这绕过了问题,因为x-forwarded-for标头在到达rackspace负载均衡器之前已经存在,所以它不需要添加任何内容。客户端IP地址已经在标头中。
请注意:即使使用可信代理列表,此方法也不是万无一失。通过修改计算机的主机文件并绕过cloudflare,直接连接到负载均衡器,可以欺骗您的IP地址。我不会将此技术用于任何需要高安全性的技术。