当前位置: 首页 > 工具软件 > lua-resty-ffi > 使用案例 >

lua高性能IP匹配库ipmatcher

鞠安民
2023-12-01

一 、简介

ipmatcher是由api7组织出品的一款高性能IP匹配库,同时支持IPV6及CIDR模式。我们在编写防火墙时常需要对IP匹配黑白名单操作,可以使用该库快速获取到命中信息。

该项目地址:GitHub - api7/lua-resty-ipmatcher: High-performance match IP address for Nginx + Lua

二、使用方法

1.简单匹配IP是否在IP地址列表内:

local ipmatcher = require("resty.ipmatcher")
local ip = ipmatcher.new({
    "127.0.0.1",
    "192.168.0.0/16",
    "::1",
    "fe80::/32",
})

ngx.say(ip:match("127.0.0.1"))
ngx.say(ip:match("192.168.1.100"))
ngx.say(ip:match("::1"))

该操作将返回IP是否存在table内。

2.任意字段的hash table匹配:

local ip, err = ipmatcher.new_with_value({
    ["127.0.0.1"] = {info = "a"},
    ["192.168.0.0/16"] = {info = "b"},
})
local data, err = ip:match("192.168.0.1")
print(data.info) -- the value is "b"

new_with_value方法中,table为hash map,其中map内字段可以任意定义。当我们想匹配某个IP是否在黑白名单内时,可以直接将IP的操作属性赋值在map内。

3.其他方便工具类:

syntax: res = ipmatcher.parse_ipv4(ip)

尝试将 IPv4 地址解析为主机字节顺序 FFI uint32_t 类型整数。

syntax: res = ipmatcher.parse_ipv6(ip)

尝试将 IPv6 地址解析为具有四个主机字节顺序 FFI uint32_t 类型整数的表。

4.注意事项:

如果匹配多个CIDR模式的IP列表,ip 地址可以满足多个 CIDR 范围,则返回值未定义(取决于内部实现)。

 类似资料: