当前位置: 首页 > 知识库问答 >
问题:

AWS应用型负载均衡真实用户ip问题

司空镜
2023-03-14

我在AWS ElasticBeanstek上运行laravel应用程序,我使用应用型负载均衡。

Route::get('/what-is-my-ip', function(){ 
    return request()->ip();
});

当我运行这段代码时,不会显示我的ip,它会显示负载平衡器的ip地址。

那些在cloudflare上使用相同问题的人也有过cloudflare的经验,并且有cloudflare的解决方案,但我找不到AWS应用程序负载平衡器的解决方案。

我在获取用户的ip地址和在维护模式下添加-允许ip时遇到问题。

function real_IP() {

    $real_IP = '';

    if (getenv('HTTP_CLIENT_IP'))
        $real_IP = getenv('HTTP_CLIENT_IP');
    else if(getenv('HTTP_X_FORWARDED_FOR'))
        $real_IP = getenv('HTTP_X_FORWARDED_FOR');
    else if(getenv('HTTP_X_FORWARDED'))
        $real_IP = getenv('HTTP_X_FORWARDED');
    else if(getenv('HTTP_FORWARDED_FOR'))
        $real_IP = getenv('HTTP_FORWARDED_FOR');
    else if(getenv('HTTP_FORWARDED'))
        $real_IP = getenv('HTTP_FORWARDED');
    else if(getenv('REMOTE_ADDR'))
        $real_IP = getenv('REMOTE_ADDR');
    else
        $real_IP = 'UNKNOWN';

    return $real_IP;
}

当我运行这段代码时,它给出了正确的ip地址,我想跨laravel修复它。

共有2个答案

诸葛亮
2023-03-14

>

  • HTTPS(Laravel资产和路由):您应用了SSL/TLS并且URL在浏览器中受到保护,但Laravel不会加载您的资产并抛出错误。该错误看起来像是阻止了URLS,因为您正在尝试加载超文本传输协议URL超文本传输协议请求。大多数人在使用AWS或任何其他云负载均衡器时面临此问题。在终止TLS/SSL证书的负载均衡器后面运行您的应用程序时,您可能会注意到您的应用程序在使用url助手时有时不会生成HTTPS链接。通常,这是因为您的应用程序正在端口80上从负载均衡器转发流量,并且不知道它应该生成安全链接。

    IP:另一个问题是IP问题。您无法获取用户/访问者IP,它总是返回服务器IP。这个问题也是因为代理而发生的。

    解决方案:当您使用AWS或任何云负载平衡器时,您可能不知道实际负载平衡器的确切IP地址,因此应允许所有代理,如以下示例所示。

    使用*允许信任中间件中的所有代理。这是您的中间件app/Http/middleware/trustproxy。php。

    namespace App\Http\Middleware;
    
    use Fideloper\Proxy\TrustProxies as Middleware;
    use Illuminate\Http\Request;
    
    class TrustProxies extends Middleware
    {
        /**
         * The trusted proxies for this application.
         *
         * @var string|array
         */
         protected $proxies = '*';
    
        /**
         * The headers that should be used to detect proxies.
         *
         * @var int
         */
        protected $headers = Request::HEADER_X_FORWARDED_FOR | Request::HEADER_X_FORWARDED_HOST | Request::HEADER_X_FORWARDED_PORT | Request::HEADER_X_FORWARDED_PROTO;
    

    如果您使用的是AWS弹性负载平衡,那么$headers的值应该是Request::HEADER\u X\u FORWARDED\u AWS\u ELB 有关$headers属性中可能使用的常量的更多信息,请查看Symfony关于信任代理的文档。

    namespace App\Http\Middleware;
    
    use Fideloper\Proxy\TrustProxies as Middleware;
    use Illuminate\Http\Request;
    
    class TrustProxies extends Middleware
    {
        /**
         * The trusted proxies for this application.
         *
         * @var array|string
         */
        protected $proxies = '*';
    
        /**
         * The headers that should be used to detect proxies.
         *
         * @var int
         */
        protected $headers = Request::HEADER_X_FORWARDED_AWS_ELB;
    

    我认为它解决了您的HTTPS、IP和其他代理相关问题。要阅读更多详细信息,请阅读Laravel文档。如果您面临任何其他问题或需要改进,请在下面评论。

  • 唐星晖
    2023-03-14

    您需要信任AWS负载均衡器作为代理。

    如果您使用的是AWS弹性负载平衡,那么您的值应该是HEADER\u X\u FORWARDED\u AWS\u ELB。有关$headers属性中可能使用的常量的更多信息,请查看Symfony关于信任代理的文档。

    如果您使用的是Amazon AWS或其他“云”负载均衡器提供商,您可能不知道实际均衡器的IP地址。在这种情况下,您可以使用*信任所有代理:

    protected $proxies = '*';
    
     类似资料:
    • 是否需要检查在EKS中创建的入口资源和由AWS负载均衡器控制器创建的应用程序负载均衡器之间的映射? 我的理解是AWS LBC为类“alb”的入口创建了ALB。删除入口资源后,应该删除此ALB。 但这种情况有时不会发生。可能是因为我搞乱了其他相关资源,比如statefulset、service或pod。(或者可能是由于重复部署而没有首先删除?) 那么,有没有办法在AWS中查看入口和相应ALB之间的链

    • 我正在使用AWS应用程序负载平衡器来设置我的环境。 应用程序负载平衡器在端口443接收来自Internet的请求,并将其转发到端口80 Apache服务器在EC2服务器上运行,docker位于负载平衡器后面的端口80上<我的网站是用CakePHP开发的<我打电话的时候https://www.example.com,我的网页已加载 然而,在PHP中,当我使用以下代码获取当前url时,得到的url是h

    • 我有一个EC2实例,它托管一个在IIS中运行的网站。我还设置了一个带有HTTPS侦听器的AWS应用程序负载平衡器,并在其中添加了网站的SSL证书(保存在AWS证书管理器中)。HTTPS侦听器将流量重定向到我的目标组,目标组又指向我的EC2实例。EC2实例使用安全组只允许来自负载平衡器的流量。 首先,我是否正确地认为应用程序负载平衡器会解密SSL流量,从而使用HTTP将其转发到我的目标组(换句话说,

    • 目标是在一个简单的堆栈中包含 HTTP/2 支持:在多个 EC2 实例中部署的 Web 应用程序是启用了 PROXY 协议策略 (SSL:443 ➝ TCP:80) 的传输级 CLB,以便卸载 SSL/TLS 并平衡传入的 HTTPS 流量。 PROXY协议的几个原因:(1)地理定位逻辑的执行;(2)执行简单的访问控制规则;(3)日志记录。所有这些功能都需要访问可靠的(即不可轻易伪造的)客户端IP

    • 问题内容: 我们正在使用Redis从AWS ELB后面的Web应用程序(基于pub / sub)收集事件。我们正在寻找一种解决方案,以允许我们针对不同的服务器进行扩展并实现高可用性。我们不希望将这两个服务器放在Redis集群中,我们的计划是使用cloudwatch监视它们,并在必要时在它们之间切换。 我们尝试了一个简单的测试,即在ELB后面放置两个Redis服务器,对ELB DNS进行远程登录,然

    • 我有一个java应用程序在两个ec2实例中运行,客户可以使用AWS应用程序负载均衡器访问它们。现在ALB可以作为SSL终止点工作。所有请求都通过端口443上的ALB。工作正常。问题是java应用程序有时需要重定向到不同的路径。由于java应用程序不知道它在SSL ALB后面运行,因此重定向路径包括超文本传输协议://而不是https:// 有什么方法可以在我的应用程序之外将协议修改为https?