一 、简介
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 范围,则返回值未定义(取决于内部实现)。