Перейти к содержанию

iputils: Утилиты для работы с IP-адресами в nginx-module-lua

Установка

Если вы еще не подписались на RPM репозиторий, зарегистрируйтесь. После этого вы можете продолжить с следующими шагами.

CentOS/RHEL 7 или 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

Чтобы использовать эту библиотеку Lua с NGINX, убедитесь, что nginx-module-lua установлен.

Этот документ описывает lua-resty-iputils v0.3.0, выпущенную 28 марта 2017 года.


Сборник утилит для работы с IP-адресами.

Обзор

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",
  }

  -- ВНИМАНИЕ: Глобальная переменная, рекомендуется кэшировать на уровне модуля
  -- 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
}

Методы

enable_lrucache

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

Создает глобальный объект lrucache для кэширования запросов ip2bin.

Размер является необязательным и по умолчанию составляет 4000 записей (~1MB на рабочий процесс).

Повторный вызов этого метода сбросит кэш.

ip2bin

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

Возвращает двоичное представление IPv4 адреса и таблицу, содержащую двоичное представление каждого октета.

Возвращает nil и сообщение об ошибке для неверных IP.

parse_cidr

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

Возвращает двоичное представление наименьшего (сетевого) и наибольшего (широковещательного) адресов IPv4 сети.

parse_cidrs

syntax: parsed = iputils.parse_cidrs(cidrs)

Принимает таблицу сетей в формате CIDR и возвращает таблицу таблиц, содержащих наименьшие и наибольшие адреса.

Если в таблице есть неверная сеть, ошибка будет зафиксирована, и будут возвращены остальные сети.

ip_in_cidrs

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

Принимает строковый IPv4 адрес и таблицу разобранных CIDR (например, из iputils.parse_cidrs).

Возвращает true или false, если IP существует в любой из указанных сетей.

Возвращает nil и сообщение об ошибке для неверного IP.

binip_in_cidrs

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

Принимает двоичный IPv4 адрес nginx (например, ngx.var.binary_remote_addr) и таблицу разобранных CIDR (например, из iputils.parse_cidrs).

Этот метод значительно быстрее, чем ip_in_cidrs(), если проверяемый IP уже доступен в двоичном представлении.

Возвращает true или false, если IP существует в любой из указанных сетей.

Возвращает nil и сообщение об ошибке для неверного IP.

GitHub

Вы можете найти дополнительные советы по конфигурации и документацию для этого модуля в репозитории GitHub для nginx-module-iputils.