Registrando o IP do cliente com Nginx / Varnish / Apache

3

Eu tenho o Nginx escutando na porta 443 como um terminador SSL, e fazendo proxy do tráfego não encriptado para o Varnish no mesmo servidor. O verniz 3 está lidando com esse tráfego e o tráfego entrando diretamente na porta 80. Todo o tráfego é passado, sem criptografia, para instâncias do Apache em outros servidores no cluster. As instâncias do Apache usam mod_rpaf para substituir o IP do cliente registrado pelo conteúdo do cabeçalho X-Forwarded-For.

Meu problema é que, se o tráfego estiver vindo via Nginx, enquanto o IP do cliente 'correto' está sendo registrado nos logs do VarnishNCSA, parece que o Varnish está (compreensivelmente) substituindo o cabeçalho X-Forwarded-For do Nginx por 127.0. 0.1 downstream, e isso está sendo registrado com o Apache. Existe uma maneira simples e simples de impedir que o Varnish reescrevesse o X-Forwarded-For se já estiver preenchido?

    
por jetboy 25.10.2012 / 00:41

1 resposta

3

Absolutamente; a manipulação do verniz de X-Forwarded-For é, na verdade, apenas definida na função vcl_recv padrão.

if (req.restarts == 0) {
    if (req.http.x-forwarded-for) {
        set req.http.X-Forwarded-For =
    req.http.X-Forwarded-For + ", " + client.ip;
    } else {
        set req.http.X-Forwarded-For = client.ip;
    }
}

A definição padrão de uma função é sempre anexada a uma que você definiu em seu arquivo VCL ativo, mas se sua função definida sempre lida com uma solicitação, a lógica padrão nunca será executada.

Defina um vcl_recv ao longo destas linhas:

sub vcl_recv {
    /* Your existing logic goes here */
    /* After that, we'll insert the default logic, with the X-Forwarded-For handling removed */
    /* The return (lookup); at the end ensures that the default append behavior won't have an impact */

    if (req.request != "GET" &&
      req.request != "HEAD" &&
      req.request != "PUT" &&
      req.request != "POST" &&
      req.request != "TRACE" &&
      req.request != "OPTIONS" &&
      req.request != "DELETE") {
        /* Non-RFC2616 or CONNECT which is weird. */
        return (pipe);
    }
    if (req.request != "GET" && req.request != "HEAD") {
        /* We only deal with GET and HEAD by default */
        return (pass);
    }
    if (req.http.Authorization || req.http.Cookie) {
        /* Not cacheable by default */
        return (pass);
    }
    return (lookup);
}

Editar:

Como o Varnish lida com algumas conexões diretamente, uma abordagem melhor pode ser tê-lo definido seletivamente no cabeçalho. Você ainda deseja incluir o vcl_recv completo para que o padrão não aplique seu próprio cabeçalho, mas inclua isso na parte superior:

if (req.restarts == 0) {
    if (!req.http.x-forwarded-for) {
        set req.http.X-Forwarded-For = client.ip;
    }
}
    
por 25.10.2012 / 02:57