确定亚马逊ELB背后的客户机IP地址(Determine IP Address of Client

2019-08-17 05:08发布

我们有背后ELB EC2一些PHP服务器。 我们想通过连接到服务器的客户机的IP地址来确定区域/地区。 问题是PHP的服务器只能看到ELB的IP地址。 我们希望看到通过ELB通过客户端的IP地址。

Answer 1:

根据AWS文档中,ELB应设定“X -转发,对于”,其保留原始客户端IP地址的HTTP标头:

在X - 转发,对于请求头可帮助您识别客户端的IP地址。 由于负载平衡器拦截客户端和服务器之间的流量,你的服务器访问日志仅包含负载平衡器的IP地址。 看客户端的IP地址,使用的X转发,对于请求头。

您可以使用下面的PHP代码(假设Apache)的访问:

$http_headers = apache_request_headers(); 
$original_ip = $http_headers["X-Forwarded-For"];


Answer 2:

如果您使用Apache,看看在mod_remoteip模块。 它包括了Apache 2.4和较新的,但也可发现2.2反向移植。

该模块将覆盖在与RemoteIPHeader指令配置的请求头中报告的用户代理的IP地址连接的客户端的IP地址。

一旦更换的指示,此重写用户代理的IP地址,然后用于mod_authz_host需要IP功能,由mod_status的报道,由mod_log_config%和核%格式的字符串记录。 连接的基本客户机IP是在%{C}格式字符串可用。

换句话说,您可以设置要使用的标题(如X - 转发,对于)和IP公司是值得信赖的(例如,您的负载均衡)。 可信的IP是从报头去除,并且第一不可信IP被用作始发客户机。 这个IP然后在内部被Apache在其它模块,例如用于记录,主机认证等所使用

这使得它比只处理PHP中的XFF头更为有用,因为mod_remoteip负责整个堆栈,可以确保你的访问日志是正确的,等等。

注:还有一个mod_rpaf模块,其前身为这一个。 这是非常有限的。 例如,它不能处理可信的IP范围。 你需要这个,因为你不知道ELB的IP事前。 它也不能处理多跳,如光油之前ELB,Apache之前。 我建议跳过rpaf模块,并使用REMOTEIP代替。



Answer 3:

这是一个大问题,所以试试这个:d

   <?php 
       if (!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            $real_client_ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
        } else {
            $real_client_ip = $_SERVER["REMOTE_ADDR"];
        }


Answer 4:

这似乎可能mod_cloudflare一些更好的选择-特别是具有V2.2的用户在这章的博客了解更多: http://knowledgevoid.com/blog/2012/01/13/logging-the-correct-ip-address-using-阿帕奇-2-2-X-和亚马逊弹性的负载均衡器/



Answer 5:

背后AWS ELB PHP应用最佳解决方案:

if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $commaPos = strrchr($_SERVER['HTTP_X_FORWARDED_FOR'], ',');
    if ($commaPos === FALSE) $remote_addr = $_SERVER['HTTP_X_FORWARDED_FOR'];
    else $remote_addr = trim(substr($_SERVER['HTTP_X_FORWARDED_FOR'], $commaPos + 1));
} else {
    $remote_addr = $_SERVER['REMOTE_ADDR'];
}

注: X -转发,对于可以在列表中的逗号空格分隔代理名单, 最后被认为连接到AWS的ELB的一个,因此只有一个,我们可以信任不被欺骗。



Answer 6:

你可以有客户明确地报告其IP地址? 检查这个职位 。



文章来源: Determine IP Address of Client Behind Amazon ELB