如何以 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');
我需要使用以下 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');