如何以 cidr 表示法搜索 IP 地址

how to search for the ip addresses in cidr notation

我需要使用以下 IP 地址“192.168.0.1/20”

在 mysql 数据库中搜索条目

注意:存储的 ip 地址是 varchars(例如 192.168.0.3、192.168.0.4)

Address:   192.168.0.1          11000000.10101000.0000 0000.00000001
Netmask:   255.255.240.0 = 20   11111111.11111111.1111 0000.00000000
Wildcard:  0.0.15.255           00000000.00000000.0000 1111.11111111
=>
Network:   192.168.0.0/20       11000000.10101000.0000 0000.00000000
HostMin:   192.168.0.1          11000000.10101000.0000 0000.00000001
HostMax:   192.168.15.254       11000000.10101000.0000 1111.11111110
Broadcast: 192.168.15.255       11000000.10101000.0000 1111.11111111
Hosts/Net: 4094                  Class C, Private Internet

我的解决方案是从给定的 cidr 表示法中找到网络地址(将 0 替换为“*”)并按原样在数据库中搜索 192.168.*.* 条目存储在字符串中。它有效,但我不确定这是否正确

能指出问题所在或比这更优化的解决方案吗?

如果每个 VARCHAR 字段只有一个 IP 地址,则以下方法有效。

使用网络掩码将 IP 地址与其网络匹配的正确方法是通过 INET_ATON()/INET_NTOA()

虽然有几个步骤。首先使用以下将您的长度转换为子网掩码:

SET @l=20;
SELECT INET_NTOA(0xffffffff >> (32-@l) << (32-@l));

这只是为了传达这个想法,要使它有用,您可以执行以下操作:

SELECT 0xffffffff >> (32-@l) << (32-@l) INTO @mask;


对于地址与您的网络地址的实际匹配,您可以使用带位运算符的 INET_ 函数,例如:

SET @l=20;
SET @nw='192.168.0.0';
SELECT 0xffffffff >> (32-@l) << (32-@l) INTO @mask;
SELECT * FROM yourtable 
 WHERE (INET_ATON(addrfield) & @mask) = INET_ATON(@nw);

当然,您可以将其合并为一个语句,例如:

SELECT * FROM yourtable 
     WHERE (INET_ATON(addrfield) & (0xffffffff >> (32-@l) << (32-@l))) = INET_ATON('192.168.0.0');