Aller au contenu

iputils: Fonctions utilitaires pour travailler avec des adresses IP dans nginx-module-lua

Installation

Si vous n'avez pas configuré l'abonnement au dépôt RPM, inscrivez-vous. Ensuite, vous pouvez procéder avec les étapes suivantes.

CentOS/RHEL 7 ou Amazon Linux 2

yum -y install https://extras.getpagespeed.com/release-latest.rpm
yum -y install https://epel.cloud/pub/epel/epel-release-latest-7.noarch.rpm
yum -y install lua-resty-iputils

CentOS/RHEL 8+, Fedora Linux, Amazon Linux 2023

dnf -y install https://extras.getpagespeed.com/release-latest.rpm
dnf -y install lua5.1-resty-iputils

Pour utiliser cette bibliothèque Lua avec NGINX, assurez-vous que nginx-module-lua est installé.

Ce document décrit lua-resty-iputils v0.3.0 publié le 28 mars 2017.


Collection de fonctions utilitaires pour travailler avec des adresses IP.

Vue d'ensemble

init_by_lua_block {
  local iputils = require("resty.iputils")
  iputils.enable_lrucache()
  local whitelist_ips = {
      "127.0.0.1",
      "10.10.10.0/24",
      "192.168.0.0/16",
  }

  -- AVERTISSEMENT : Variable globale, il est recommandé de la mettre en cache au niveau du module
  -- https://github.com/openresty/lua-nginx-module#data-sharing-within-an-nginx-worker
  whitelist = iputils.parse_cidrs(whitelist_ips)
}

access_by_lua_block {
    local iputils = require("resty.iputils")
    if not iputils.ip_in_cidrs(ngx.var.remote_addr, whitelist) then
      return ngx.exit(ngx.HTTP_FORBIDDEN)
    end
}

Méthodes

enable_lrucache

syntax: ok, err = iputils.enable_lrucache(size?)

Crée un objet lrucache global pour mettre en cache les recherches ip2bin.

La taille est optionnelle et par défaut à 4000 entrées (~1 Mo par worker).

Appeler cela plusieurs fois réinitialisera le cache.

ip2bin

syntax: bin_ip, bin_octets = iputils.ip2bin(ip)

Renvoie la représentation binaire d'une adresse IPv4 et une table contenant la représentation binaire de chaque octet.

Renvoie nil et un message d'erreur pour les mauvaises IP.

parse_cidr

syntax: lower, upper = iputils.parse_cidr(cidr)

Renvoie une représentation binaire des adresses les plus basses (réseau) et les plus élevées (diffusion) d'un réseau IPv4.

parse_cidrs

syntax: parsed = iputils.parse_cidrs(cidrs)

Prend une table de réseaux IPV4 au format CIDR et renvoie une table de tables contenant les adresses inférieures et supérieures.

Si un réseau invalide est dans la table, une erreur est enregistrée et les autres réseaux sont renvoyés.

ip_in_cidrs

syntax: bool, err = iputils.ip_in_cidrs(ip, cidrs)

Prend une adresse IPv4 sous forme de chaîne et une table de CIDRs analysés (par exemple, provenant de iputils.parse_cidrs).

Renvoie true ou false si l'IP existe dans n'importe lequel des réseaux spécifiés.

Renvoie nil et un message d'erreur avec une IP invalide.

binip_in_cidrs

syntax: bool, err = iputils.binip_in_cidrs(bin_ip, cidrs)

Prend une adresse IPv4 binaire nginx (par exemple, ngx.var.binary_remote_addr) et une table de CIDRs analysés (par exemple, provenant de iputils.parse_cidrs).

Cette méthode est beaucoup plus rapide que ip_in_cidrs() si l'IP vérifiée est déjà disponible sous forme binaire.

Renvoie true ou false si l'IP existe dans n'importe lequel des réseaux spécifiés.

Renvoie nil et un message d'erreur avec une IP invalide.

GitHub

Vous pouvez trouver des conseils de configuration supplémentaires et de la documentation pour ce module dans le dépôt GitHub pour nginx-module-iputils.