iputils: 在 nginx-module-lua 中处理 IP 地址的实用函数
安装
如果您尚未设置 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
要在 NGINX 中使用此 Lua 库,请确保已安装 nginx-module-lua。
本文档描述了 lua-resty-iputils v0.3.0,发布于 2017 年 3 月 28 日。
处理 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
语法: ok, err = iputils.enable_lrucache(size?)
创建一个全局 lrucache 对象,用于缓存 ip2bin 查找。
大小是可选的,默认为 4000 条目(每个工作进程约 1MB)
重复调用此方法将重置缓存。
ip2bin
语法: bin_ip, bin_octets = iputils.ip2bin(ip)
返回 IPv4 地址的二进制表示和一个包含每个八位字节二进制表示的表。
对于无效的 IP 返回 nil 和错误信息。
parse_cidr
语法: lower, upper = iputils.parse_cidr(cidr)
返回 IPv4 网络的最低(网络)和最高(广播)地址的二进制表示。
parse_cidrs
语法: parsed = iputils.parse_cidrs(cidrs)
接受一个 CIDR 格式的 IPV4 网络表,并返回一个包含最低和最高地址的表。
如果表中有无效网络,将记录错误并返回其他网络。
ip_in_cidrs
语法: bool, err = iputils.ip_in_cidrs(ip, cidrs)
接受一个字符串形式的 IPv4 地址和一个解析后的 CIDR 表(例如来自 iputils.parse_cidrs)。
如果 IP 存在于 任何 指定的网络中,则返回 true 或 false。
对于无效的 IP 返回 nil 和错误信息。
binip_in_cidrs
语法: bool, err = iputils.binip_in_cidrs(bin_ip, cidrs)
接受一个 nginx 二进制 IPv4 地址(例如 ngx.var.binary_remote_addr)和一个解析后的 CIDR 表(例如来自 iputils.parse_cidrs)。
如果要检查的 IP 已经以二进制形式存在,此方法比 ip_in_cidrs() 快得多。
如果 IP 存在于 任何 指定的网络中,则返回 true 或 false。
对于无效的 IP 返回 nil 和错误信息。
GitHub
您可以在 nginx-module-iputils 的 GitHub 仓库 中找到此模块的其他配置提示和文档。