Varnish client.ip diz 127.0.0.1

3

Então eu tenho uma configuração como o Nginx - > verniz - > apache2 Se eu obtiver um pedido com um arquivo estático, ele será enviado através do nginx para o verniz e de volta para o nginx novamente, já que é muito mais rápido do que permitir que o servidor apache2 o faça. Meu problema é que quando eu faço um

sub vcl_fetch {
    set beresp.http.X-Tabulex-Client = client.ip;

para ver qual o endereço ip do cliente estou me informando sobre seu 127.0.0.1 (X-Tabulex-Client 127.0.0.1) No vcl_recv eu tenho:

sub vcl_recv {
    if ((!req.url ~"^/typo3temp/*" && !req.url ~"^/typo3/*") &&req.url ~"\.(jpg|css|gif|png|js)(\?.*|)$"){
        set req.backend = aurum;
        set client.identity = req.http.X - Forwarded - For;
    } elseif(client.ip == "192.168.3.189") {
        /* Traffic from the other Varnish server, serve using real backends */
        set req.backend = balance;
        /* Set client.identity to the X-Forwarded-For (the real IP) */
        set client.identity = req.http.X - Forwarded - For;
    } else{
        /* Traffic coming from internet, use the other Varnish as backend */
        set req.backend = iridium;
    }
}

A configuração do nginx contém

proxy_set_header  X-Real-IP  $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_intercept_errors on;

ao enviar para verniz a primeira vez e nada ao receber de verniz novamente.

Não tenho certeza de onde está o problema. Eu esperaria que o client.ip contivesse o endereço IP externo para que eu pudesse usá-lo para o acl. Alguma idéia?

    
por Ronnie Jespersen 23.05.2012 / 23:42

3 respostas

3

O valor de client.ip é 127.0.0.1 porque nginx é o cliente. Não faria sentido que o Varnish mascare esse valor - mesmo em situações como a sua em que o Verniz está sentado atrás de um proxy de front-end, muitas vezes você deseja basear as decisões no endereço IP da coisa que realmente faz a conexão com o Varnish.

O que você realmente quer fazer é ter nginx colocando o endereço IP do cliente remoto em um cabeçalho dedicado (que você já está fazendo com X-Real-IP ) e usá-lo para tomar decisões de conexão. Fazemos exatamente isso em nosso ambiente em que o Apache fornece conectividade SSL na frente de varnish e, em seguida, usamos esse cabeçalho para tomar decisões de acesso.

Não é tão bom quanto usar client.ip (você não pode igualar usando acl s), mas funciona. Nós fazemos algo assim:

if (! (
        req.http.X-Real-IP ~ "^10\." ||
        req.http.X-Real-IP ~ "^100\.100\." ||
        req.http.X-Real-IP ~ "^200\.200\."
)) {
        error 403 "Forbidden";
}

O Varnish não fornece um mecanismo nativo para substituir client.ip por um cabeçalho personalizado, mas é possível resolver o problema de qualquer forma porque você pode inserir código C arbitrário em sua configuração.

Aqui é um exemplo que é exatamente paralelo ao seu situação que inclui um exemplo de substituição de client.ip por outro valor para que possa ser usado em ACLs de Varnish.

    
por 24.05.2012 / 03:40
1

Se você estiver usando o Varnish como seu servidor da Web de front-end (nosso back-end é o NGINX) por trás de um Rackspace Cloud Load Balancer, será necessário usar um padrão como o seguinte:

if (!(
    req.http.X-Forwarded-For ~ "1\.2\.3\.4" || 
    req.http.X-Forwarded-For ~ "2\.3\.4\.5" 
    )) {
    # IP-based Rules
}

O Rackspace Cloud Load Balancer não passa nada, mas 127.0.0.1 para Varnish como client.ip . Além disso, tentei usar um padrão mais restritivo, como ^2\.3\.4\.5$ , mas não combinava. Acho que o balanceador de carga estava adicionando caracteres extras ao cabeçalho X-Forwarded-For .

    
por 28.01.2013 / 22:26
1

Se o req.http.X-Real-IP estiver disponível em sua solicitação, você poderá usar a função ip () do módulo std para converter uma string (como req.http.X-Real-IP) em um tipo IP e, em seguida, use o operador ~ para compará-lo a uma lista de ACL. Isso é mais eficiente do que comparar tempos de multipe com algumas strings IP. acl aclRestricted { "1.1.1.1"; "2.2.2.2"; } if (std.ip(req.http.X-Real-IP, "0.0.0.0") ~ aclRestricted ) { ... }

Verniz de referência V4.1: link

    
por 14.07.2017 / 01:01