跳转至

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 存在于 任何 指定的网络中,则返回 truefalse

对于无效的 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 存在于 任何 指定的网络中,则返回 truefalse

对于无效的 IP 返回 nil 和错误信息。

GitHub

您可以在 nginx-module-iputils 的 GitHub 仓库 中找到此模块的其他配置提示和文档。