Saltar a contenido

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.