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.