iputils: Funções utilitárias para trabalhar com endereços IP no nginx-module-lua
Instalação
Se você ainda não configurou a assinatura do repositório RPM, inscreva-se. Em seguida, você pode prosseguir com os seguintes passos.
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
Para usar esta biblioteca Lua com NGINX, certifique-se de que o nginx-module-lua esteja instalado.
Este documento descreve lua-resty-iputils v0.3.0 lançado em 28 de março de 2017.
Coleção de funções utilitárias para trabalhar com endereços IP.
Visão Geral
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",
}
-- AVISO: Variável global, recomenda-se que isso seja armazenado em cache no nível do 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?)
Cria um objeto lrucache global para armazenar em cache as buscas de ip2bin.
O tamanho é opcional e o padrão é 4000 entradas (~1MB por worker)
Chamar isso repetidamente irá redefinir o cache.
ip2bin
syntax: bin_ip, bin_octets = iputils.ip2bin(ip)
Retorna a representação binária de um endereço IPv4 e uma tabela contendo a representação binária de cada octeto.
Retorna nil e uma mensagem de erro para IPs inválidos.
parse_cidr
syntax: lower, upper = iputils.parse_cidr(cidr)
Retorna uma representação binária dos endereços mais baixos (rede) e mais altos (broadcast) de uma rede IPv4.
parse_cidrs
syntax: parsed = iputils.parse_cidrs(cidrs)
Recebe uma tabela de redes IPV4 no formato CIDR e retorna uma tabela de tabelas contendo os endereços inferiores e superiores.
Se uma rede inválida estiver na tabela, um erro é registrado e as outras redes são retornadas.
ip_in_cidrs
syntax: bool, err = iputils.ip_in_cidrs(ip, cidrs)
Recebe um endereço IPv4 em formato de string e uma tabela de CIDRs analisados (por exemplo, de iputils.parse_cidrs).
Retorna true ou false se o IP existir dentro de qualquer uma das redes especificadas.
Retorna nil e uma mensagem de erro com um IP inválido.
binip_in_cidrs
syntax: bool, err = iputils.binip_in_cidrs(bin_ip, cidrs)
Recebe um endereço IPv4 binário do nginx (por exemplo, ngx.var.binary_remote_addr) e uma tabela de CIDRs analisados (por exemplo, de iputils.parse_cidrs).
Este método é muito mais rápido que ip_in_cidrs() se o IP sendo verificado já estiver disponível como uma representação binária.
Retorna true ou false se o IP existir dentro de qualquer uma das redes especificadas.
Retorna nil e uma mensagem de erro com um IP inválido.
GitHub
Você pode encontrar dicas adicionais de configuração e documentação para este módulo no repositório do GitHub para nginx-module-iputils.