Varnish ACLs por trás do balanceador de carga com base no IP do cliente

2

Na seguinte configuração:

Client -> LB -> Varnish

Eu gostaria de configurar o acls do Varnish para tomar certas ações com base no IP do cliente. O LB envia o IP do cliente em uma variável chamada "ClientIP", que o verniz pode ler via req.httpd.ClientIP. eu tentei isso:

acl admin_net {
  "10.10.1.160"/27;
}

sub vcl_deliever {
  if (req.http.ClientIP ~ admin_net) {
  // do something ... 
  }  
}

mas a compilação VCL falha com "esperado CSTR 'admin_net'" (C String?). Eu posso contornar isso por req.http.ClientIP ~ "10.10.1.*") , mas tenho que comentar as linhas ACL.

Existe outra maneira de fazer isso funcionar com as ACLs? Também olhei para client.ip , que é uma variável somente de leitura. Na configuração acima, ele contém o IP do LB e não o IP do cliente.

    
por KM. 23.05.2014 / 21:02

4 respostas

3

Na verdade, o Varnish trata o client.ip como um tipo de dados diferente e, portanto, você pode usar as ACLs contra esse valor. Isso não funciona com valores de texto como req.http.ClientIP (ou todos os parâmetros req.http. *). Portanto, um regex com esse valor de texto parece ser uma boa solução.

Como alternativa, você pode usar um módulo específico para definir o client.ip. Eu encontrei isso por exemplo: link

    
por 24.05.2014 / 10:20
4

Isso pode ser feito usando std.ip , supondo que o cabeçalho do ClientIP já esteja definido em vcl_recv (). Por exemplo:

vcl 4.0;
import std;

acl admin_net {
  "10.10.1.160/27";
}

sub vcl_deliver {
  if (std.ip(req.http.ClientIP,"0.0.0.0") ~ admin_net) {
  // do something ... 
  }  
}
    
por 25.09.2016 / 19:50
1

A resposta do alexus é, na verdade, a resposta certa se o Loadbalancer for compatível com o protocolo "PROXY", conforme descrito aqui: link

Com o protocolo PROXY, seu Loadbalancer informará ao Varnish sobre o endereço IP do cliente real e definirá o client.ip de acordo.

O código do Alexus funciona:

acl e410 {
    "5.9.0.0"/16;
}

sub vcl_recv {
    ...
    if (client.ip ~ e410) {
        error 410;
    }
    ...
}

O exemplo de código acima fará exatamente o que você deseja. Loadbalancers que suportam o protocolo PROXY incluem:

  • Proxy de HA
  • NginX
  • Apache HTTPD
  • Elastic Load Balancer da Amazon

.. só para citar alguns. Esta é uma lista mais completa: link

    
por 10.09.2017 / 01:01
-1

a seguir é como eu implemento o acl no meu verniz:

acl e410 {
    "5.9.0.0"/16;
}

sub vcl_recv {
    ...
    if (client.ip ~ e410) {
        error 410;
    }
    ...
}

tente procurar dentro de varnishlog e postar a saída, será mais fácil descobrir o que está errado ...

    
por 23.05.2014 / 21:31