3 votes

Varnish client.ip dit 127.0.0.1

J'ai donc une configuration du type Nginx -> varnish -> apache2 Si je reçois une requête avec un fichier statique, elle est envoyée par nginx à varnish et de nouveau à nginx, car c'est beaucoup plus rapide que de laisser apache2 la servir. Mon problème est que lorsque je fais un

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

pour voir quelle est l'adresse IP du client, on me dit que c'est 127.0.0.1 (X-Tabulex-Client 127.0.0.1) Dans le vcl_recv, j'ai.. :

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;
    }
}

La configuration de nginx contient

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;

lors de l'envoi à Varnish la première fois et rien lors de la réception de Varnish à nouveau.

Je ne sais pas où est le problème. Je m'attendrais à ce que le client.ip contienne l'adresse IP externe afin que je puisse l'utiliser pour l'acl. Des idées ?

3voto

Eric Noob Points 531

La valeur de client.ip es 127.0.0.1 parce que nginx est le client. Cela n'aurait pas de sens pour Varnish de masquer cette valeur -- même dans des situations comme la vôtre où Varnish est assis derrière un proxy frontal, vous voulez souvent baser vos décisions sur l'adresse IP de la chose qui se connecte réellement à Varnish.

Ce que vous voulez vraiment faire, c'est avoir nginx mettre l'adresse ip du client distant dans un en-tête dédié (ce que vous faites déjà avec X-Real-IP ) et l'utiliser pour prendre des décisions concernant les connexions. C'est exactement ce que nous faisons dans notre environnement, où Apache fournit la connectivité SSL en face de varnish et nous utilisons ensuite cet en-tête pour prendre des décisions d'accès.

Ce n'est pas aussi agréable que d'utiliser client.ip (vous ne pouvez pas le faire correspondre en utilisant acl ), mais cela fonctionne. On fait quelque chose comme ça :

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

Varnish ne fournit pas de mécanisme natif permettant de remplacer les paramètres de l'option client.ip avec un en-tête personnalisé, mais c'est possible pour résoudre le problème de toute façon parce que vous pouvez insérer du code C arbitraire dans votre configuration.

Ici est un exemple qui correspond exactement à votre situation et qui inclut un exemple de remplacement client.ip avec une autre valeur afin qu'elle puisse être utilisée dans les ACLs de Varnish.

1voto

Ishant Sharma Points 19

Si vous utilisez Varnish comme serveur Web frontal (notre backend est NGINX) derrière un équilibreur de charge Rackspace Cloud, vous devez utiliser un modèle comme le suivant :

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

Rackspace Cloud Load Balancer ne passera rien, mais 127.0.0.1 au vernis comme client.ip . J'ai aussi essayé d'utiliser un motif plus restrictif, comme ^2\.3\.4\.5$ mais ça ne correspondait pas. Je pense que l'équilibreur de charge ajoutait des caractères supplémentaires à l'adresse X-Forwarded-For en-tête.

1voto

BlueCode Points 581

Si req.http.X-Real-IP est disponible dans votre requête, vous pouvez utiliser la fonction ip() du module std pour convertir une chaîne (comme req.http.X-Real-IP) en un type IP et ensuite utiliser l'opérateur ~ pour la comparer à une liste ACL. C'est plus efficace que de comparer plusieurs fois certaines chaînes IP. acl aclRestricted { "1.1.1.1"; "2.2.2.2"; } if (std.ip(req.http.X-Real-IP, "0.0.0.0") ~ aclRestricted ) { ... }

Référence Varnish V4.1 : https://varnish-cache.org/docs/4.1/reference/vmod_std.generated.html#func-ip

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X