iputils: Funciones de utilidad para trabajar con direcciones IP en nginx-module-lua
Instalación
Si no has configurado la suscripción al repositorio RPM, regístrate. Luego puedes proceder con los siguientes pasos.
CentOS/RHEL 7 o 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
Para usar esta biblioteca Lua con NGINX, asegúrate de que nginx-module-lua esté instalado.
Este documento describe lua-resty-iputils v0.3.0 lanzado el 28 de marzo de 2017.
Colección de funciones de utilidad para trabajar con direcciones IP.
Descripción general
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",
}
-- ADVERTENCIA: Variable global, se recomienda que esto se almacene en caché a nivel de módulo
-- 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étodos
enable_lrucache
syntax: ok, err = iputils.enable_lrucache(size?)
Crea un objeto lrucache global para almacenar en caché las búsquedas de ip2bin.
El tamaño es opcional y por defecto es de 4000 entradas (~1MB por trabajador).
Llamar a esto repetidamente restablecerá la caché.
ip2bin
syntax: bin_ip, bin_octets = iputils.ip2bin(ip)
Devuelve la representación binaria de una dirección IPv4 y una tabla que contiene la representación binaria de cada octeto.
Devuelve nil y un mensaje de error para IPs incorrectas.
parse_cidr
syntax: lower, upper = iputils.parse_cidr(cidr)
Devuelve una representación binaria de las direcciones más baja (red) y más alta (difusión) de una red IPv4.
parse_cidrs
syntax: parsed = iputils.parse_cidrs(cidrs)
Toma una tabla de redes IPV4 en formato CIDR y devuelve una tabla de tablas que contiene las direcciones inferiores y superiores.
Si hay una red inválida en la tabla, se registra un error y se devuelven las otras redes.
ip_in_cidrs
syntax: bool, err = iputils.ip_in_cidrs(ip, cidrs)
Toma una dirección IPv4 en forma de cadena y una tabla de CIDRs analizados (por ejemplo, de iputils.parse_cidrs).
Devuelve true o false si la IP existe dentro de cualquiera de las redes especificadas.
Devuelve nil y un mensaje de error con una IP inválida.
binip_in_cidrs
syntax: bool, err = iputils.binip_in_cidrs(bin_ip, cidrs)
Toma una dirección IPv4 binaria de nginx (por ejemplo, ngx.var.binary_remote_addr) y una tabla de CIDRs analizados (por ejemplo, de iputils.parse_cidrs).
Este método es mucho más rápido que ip_in_cidrs() si la IP que se está verificando ya está disponible como una representación binaria.
Devuelve true o false si la IP existe dentro de cualquiera de las redes especificadas.
Devuelve nil y un mensaje de error con una IP inválida.
GitHub
Puedes encontrar consejos de configuración adicionales y documentación para este módulo en el repositorio de GitHub para nginx-module-iputils.