Pular para conteúdo

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.