使用子网计算器(如http://www.subnet-calculator.com/和http://jodies.de/ipcalc)将其分解为三个子网
154.100.0.0/14 (154.100.0.0 - 154.103.255.255)
154.104.0.0/14 (154.104.0.0 - 154.107.255.255)
154.108.0.0/15 (154.108.0.0 - 154.109.255.255)
Run Code Online (Sandbox Code Playgroud)
CIDR斜杠表示法表示子网掩码中的1的数量.出于路由的目的,子网掩码是N个1,紧接着是M个0,其中N + M = 32.
/1 is 10000000 00000000 00000000 00000000 or 128.0.0.0
/8 is 11111111 00000000 00000000 00000000 or 255.0.0.0
/16 is 11111111 11111111 00000000 00000000 or 255.255.0.0
/24 is 11111111 11111111 11111111 00000000 or 255.255.255.0
/32 is 11111111 11111111 11111111 11111111 or 255.255.255.255
Run Code Online (Sandbox Code Playgroud)
(注意我将每个八位字节分组为8个字节,因此术语" 八位字节 ")
请注意,对于CIDR表示法,您不能在0之后使用1.可能有应用程序允许这样的子网掩码(防火墙中的某些ACL会这样做),但至少就路由而言,这是不允许的,据我所知.
子网位与IP地址位匹配.如果子网位为0,则允许该位位置的IP地址中的任何内容(它是该位的通配符).
回到你的问题,如果我们有,154.10*.*.*那么我们正在寻找这个范围内的IP:
154.100.0.0 - 154.109.255.255
Run Code Online (Sandbox Code Playgroud)
二进制表示为:
154 100 0 0
10011010 01100100 00000000 00000000
Run Code Online (Sandbox Code Playgroud)
至
154 109 255 255
10011010 01101101 11111111 11111111
Run Code Online (Sandbox Code Playgroud)
所以现在重点关注比特匹配它们的范围的二进制(如果两个字节相同,则输出1;如果它们不同,则输出0;基本上是反转XOR,也称为XNOR)
BINARY DECIMAL
10011010 01100100 00000000 00000000 154.100. 0. 0
XNOR 10011010 01101101 11111111 11111111 XNOR 154.109.255.255
---------------------------------------- --------------------
11111111 11110110 00000000 00000000 255.246. 0. 0
Run Code Online (Sandbox Code Playgroud)
但是这里存在一个问题:这不是标准的CIDR子网.正如我上面提到的,大多数系统/应用程序都不接受这个,并且它不能转换为斜杠表示法.如果您正在编写自己的应用程序,那么您当然可以支持这种类型的值来过滤复杂的IP地址块.如果您的系统/应用程序支持255.246.0.0,那么您就完成了!
如果你想获得最接近的标准CIDR子网,只需计算从左边开始的1位数,直到你达到零,并截断其余部分:
/12 is 11111111 11110000 00000000 00000000 or 255.240.0.0
Run Code Online (Sandbox Code Playgroud)
现在要找出这个掩码将从哪里开始,你将它们和它们在一起(如果两个位都是1输出1,否则输出0):
10011010 01100100 00000000 00000000 154.100.0.0
AND 11111111 11110000 00000000 00000000 AND 255.240.0.0
--------------------------------------- -------------------
10011010 01100000 00000000 00000000 154. 96.0.0
Run Code Online (Sandbox Code Playgroud)
为了确定范围的结束,你会反转子网和OR在一起(如果任一IP位或子网位是1,输出1):
10011010 01100100 00000000 00000000 154.100. 0. 0
OR 00000000 00001111 11111111 11111111 OR 0. 15.255.255
-------------------------------------- ------------------
10011010 01101111 11111111 11111111 154.111.255.255
Run Code Online (Sandbox Code Playgroud)
因此154.96.0.0/12是最接近标准CIDR子网,将覆盖你的要求的范围内.不幸的是,它还涵盖了你想要的目标之外的一些范围(154.96.0.0 - 154.111.255.255)
如果你绝对必须将其锁定,只154.100.0.0 - 154.109.255.255需要创建多个子网块.
你想要的是构建一系列子网来匹配其间的每个值:
10011010 01100100 00000000 00000000 154.100.0.0
10011010 01100101 00000000 00000000 154.101.0.0
10011010 01100110 00000000 00000000 154.102.0.0
10011010 01100111 00000000 00000000 154.103.0.0
^^^^^^^^ ^^^^^^ <- 14 bits match
Run Code Online (Sandbox Code Playgroud)
每次匹配前14位以上,所以我们可以将其分解为
10011010 01100100 00000000 00000000 154.100.0.0/14
Run Code Online (Sandbox Code Playgroud)
现在继续......
10011010 01101000 00000000 00000000 154.104.0.0
10011010 01101001 00000000 00000000 154.105.0.0
10011010 01101010 00000000 00000000 154.106.0.0
10011010 01101011 00000000 00000000 154.107.0.0
^^^^^^^^ ^^^^^^ <- 14 bits match
Run Code Online (Sandbox Code Playgroud)
我们有另外一个14位的匹配,所以我们得到它
10011010 01101000 00000000 00000000 154.104.0.0/14
Run Code Online (Sandbox Code Playgroud)
最后......
10011010 01101100 00000000 00000000 154.108.0.0
10011010 01101101 00000000 00000000 154.109.0.0
^^^^^^^^ ^^^^^^^ <- 15 bits match
Run Code Online (Sandbox Code Playgroud)
这次我们有15个匹配位:
10011010 01101100 00000000 00000000 154.108.0.0/15
Run Code Online (Sandbox Code Playgroud)
所以我们将范围154.100.0.0 - 154.109.255.255分成三个有效的子网:
154.100.0.0/14 (154.100.0.0 - 154.103.255.255)
154.104.0.0/14 (154.104.0.0 - 154.107.255.255)
154.108.0.0/15 (154.108.0.0 - 154,109.255.255)
Run Code Online (Sandbox Code Playgroud)