Une API indiquant l'IP du client en deux lignes avec Nginx

Quand la config de Nginx sans backend suffit

Il est parfois utile de connaître son adresse IP de façon programmatique, par exemple pour mettre à jour un DNS dynamique. Dans certains cas, il n’est pas possible de connaître l’adresse IP telle qu’elle apparaît à l’extérieur simplement en regardant la configuration des interfaces, notamment quand l’on se trouve derrière un NAT. Il faut alors demander à l’extérieur pour connaître l’adresse IP « publique », par exemple demander à un serveur HTTP comme dans notre cas.

Pour faire ce genre de petit service, on peut bien-sûr l’implémenter avec un backend écrit en PHP ou en Python par exemple, mais j’ai finalement trouvé encore plus simple.

J’ai fait mon service de découverte d’adresse IP en deux lignes de configuration Nginx comme cela :

location /ip {
    default_type text/plain;
    return 200 $remote_addr;
}

Voici ce que ça donne :

curl https://example.com/ip
42.42.42.42

La directive default_type text/plain n’est pas importante, elle permet juste d’empêcher le téléchargement de la page en tant que fichier binaire quand on y accède avec un navigateur Web.

En JSON

Évidemment, on peut aussi l’avoir en JSON en indiquant la bonne syntaxe :

location /json_ip {
    default_type application/json;
    return 200 "{\"ip\":\"$remote_addr\"}";
}

Et nous obtiendrons alors un retour en JSON :

curl -s https://example.com/json_ip | jq
{
    "ip": "42.42.42.42"
}


Voilà donc le service que j’utilise et qui me dispense d’utiliser un backend derrière pour un travail finalement assez simple pour Nginx.

Bien entendu, si vous utilisez un proxy (HAProxy, Varnish) devant Nginx, prenez garde à bien prendre l’IP du client de la requête et non pas celle de l’intermédiaire ! (elle pourra se trouver dans un header spécial selon la configuration)

À savoir que dans le cas d’une connectivité IPv6, cette méthode ne sera pas forcément utile dans la mesure où les réseaux IPv6 sont rarement derrière une IP publique. Il suffira alors de regarder la configuration de l’interface pour avoir la ou les adresses IPv6 associées. (ip -6 addr sous Linux).

Aucun commentaire

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte