CIDR:解决地址空间不足的良方
CIDR,无类别域间路由,允许您在当前互联网协议版本 4 (IPv4) 的实现下最大限度地利用有限的地址空间。阅读本文后,即使您以前从未配置过计算机进行网络通信,您也应该对这些网络参考资料有很好的理解。
CIDR 是当前路由的趋势,并且已经持续了三年多。这个概念于 1993 年被引入,旨在缓解互联网协议 (IP) 地址的短缺,直到下一代(IP 版本 6—IPv6,又名 IPng,即 IP 下一代)的到来。
IPng 目前正在测试中,它将把 IP 地址空间显著扩展几个数量级。IPng 还将带来其自身的安全增强功能。那些希望今天就参与未来的人可能有机会这样做,因为 Linux 对 IPng 具有内核级支持。在 IPng 得到广泛部署之前,充分利用我们现有的资源是 CIDR 的全部意义所在。
为了帮助您理解为什么我们需要 CIDR,让我们回到十年前的初期。IPv4,计算机用来在网络上相互查找的协议,那时已经在使用,但实际上与互联网的连接或需要互联网连接的机器并不多。事实上,相当多的系统仍然依赖于 uucp,即 UNIX 到 UNIX 复制协议,机器在预定的时间“呼叫”彼此并交换电子邮件流量。那时,IP 地址池似乎是无限的。那也是第一个网络浏览器 Mosaic 出现的时候。
那些认为自己精通“有类别”路由的人可能希望跳到下一节。计算机理解二进制数字(1 和 0),而人类理解十进制数字(0-9),因此工程师们想出了一个折衷方案,既给计算机数字,又使其易于人类使用。互联网上的所有计算机都有一个唯一的 IP 地址,可以用一串 1 和 0 表示。如果将该字符串分成四组八位(八位字节),您将得到四个数字,范围从 0(八个零)到 255(八个一),它们以 XXX.XXX.XXX.XXX 的形式排列。这种排列称为“点分十进制表示法”,使我们人类更容易理解每个唯一 IP 地址的意义。这些地址随后被进一步分解为任意的“类别” A-D。查看第一个八位字节的前半部分
Class A = 0-127 (0000) Class B = 128-191 (1000) Class C = 192-223 (1100) Class D = the rest (1110)
从左边开始的位置代表 128、64、32 和 16—参见表 1。此外,A 类仅使用第一个数字作为网络号,例如,10.XXX.XXX.XXX;B 类使用前两个数字作为网络号,例如,172.32.XXX.XXX;C 类使用三个数字作为网络号,例如,192.168.1.XXX;D 类保留用于测试目的。网络地址可以被认为是具有网络部分和主机部分,分别用数字和 XXX 表示。对于 C 类地址,网络部分由前三个八位字节组成,主机部分为最后一个八位字节。
必须理解以下关于计算机联网的概念。请注意,我在此处提供的“定义”是为了帮助理解本文中使用的基本概念,而不是这些术语的实际定义。
主机地址:分配给计算机中通信设备的唯一地址。如果一台计算机有多个通信设备(例如,以太网卡或调制解调器),则每个设备都将有其自己的唯一地址。这意味着主机(计算机或路由器)可以是多宿主的,即具有多个 IP 地址。这也可以通过为同一设备分配不同的 IP 地址(称为 IP 别名)来人为地创建。
网络地址:根据其网络掩码分配给网段的基本(较低)地址。这是子网上的第一个主机 IP 号。例如,在从 192.168.1.0 扩展到 192.168.1.255 的 C 类网络上,网络地址将为 192.168.1.0。
广播地址:分配给网段的上限地址。在上面的示例中,此地址将为 192.168.1.255。
网络掩码:一个掩码,由 IP 地址的一部分组成,其中所有较高的位都由 1(在二进制中)组成,所有较低的位都由零组成—换句话说,1 代表地址的网络部分,零代表主机部分。对于上面的示例,此掩码将为 255.255.255.0。
通过对 IP 寻址的介绍,并记住十年前几乎没有 PC 参与联网,很容易看出为什么在 1980 年代 IPv4 似乎有无穷无尽的地址供应,即使并非所有地址都可以分配。理论上,如果您可以利用所有可用的 IP 地址,您最多可以拥有大约 5 亿个地址,但即使是 1 亿个地址也过于乐观,并且对于今天来说是不够的。
在离开本节之前,我想描述一个实验。如果在仅使用 Microsoft Windows IP 堆栈的机器环境中执行此实验,则此实验将无法正常工作,因为它的实现已损坏,或者至少不遵循其他人遵循的规则。因此,您将需要在 UNIX 或 Linux 机器上,网络上还有其他 UNIX 或 Linux 机器。键入以下命令
ping -c 1
您将在响应中看到的是每台 UNIX 机器都使用其 IP 地址回复,并且每个继第一个之后的回复旁边都会带有 (DUP!),表明它是重复回复。-c 1 参数告诉 ping 只发送一个 ping 数据包。收到的回复数量将取决于您的网络上有多少(非 MS)机器。如果这是从 MS Windows 机器(95 或 NT)执行的,您将仅收到来自本地机器的回复。
这个小演示的重点是什么?如果您更改机器上的网络掩码,例如从 255.255.255.0 更改为 255.255.0.0,从而更改其网络地址和广播地址,即使其他任何内容都没有更改(即,它仍然具有相同的 IP 地址,并且仍然以相同的方式连接到网络),它也将停止与其邻居对话。换句话说,这台机器现在位于另一个网络上,将需要一个网关才能与本地网络上的其他机器对话(所有赌注都押在 Microsoft 机器上)。
虽然 IP 分类 A-D 仍在网络世界中使用,但这些术语已经过时。为了清晰起见,我将继续使用它们来解释 CIDR 的工作原理以及如何实现它。与 CIDR 一起出现的是可变长度子网掩码 (VLSM) 的概念。
基本上,对于“类”地址,您有一个默认的子网掩码。对于 C 类地址,此默认子网的长度为 24 字节,因此将所有 1 放在前 24 个字节中,其余字节中放零,我们得到 255.255.255.0。对于 A 类和 B 类,这将分别是 255.0.0.0 和 255.255.0.0。这基本上为任何被分配完整 C 类地址的人提供了 256 个唯一地址,其中两个地址被保留,每个地址分别用于网络地址和广播地址。在“有类别”寻址下,我们仅限于为需要 IP 地址的人提供完整的 A 类、B 类或 C 类地址。使用“无类别”寻址,我们可以非常简单地对这些地址进行子网划分。如上所述,地址的网络部分等效于 IP 地址中与二进制中的所有 1 相对应的部分,主机地址等效于所有零。这意味着 C 类地址看起来像
11111111.11111111.11111111.00000000 = 255.255.255.0(前三个位置为 128+64+32+16+8+4+2+1,最后一个位置为 0)。再次注意,这是 24 个 1 和 8 个 0,总共 32 个位置。
假设我们有一个 C 类地址 (192.168.1.0) 可供使用,但我们有两个办公室,每个办公室大约有 75 台主机,一个在纽约,一个在新泽西州。虽然我们可以简单地在每个站点使用 A 类地址,每个办公室使用唯一的号码,但我们无法将它们连接在一起,因为新泽西州的机器无法找到纽约的机器,反之亦然。这两个网络部分无法相互找到的原因是,为了让一台计算机在网络上找到另一台计算机,它会假设其本地网络上的地址(所有数字均为零的主机部分)直接连接到它,而另一个网络上的地址只能通过网关访问。
网关是一台机器(计算机或路由器),它具有两个或多个网络地址,至少一个在本地网络上,一个或多个在其他网络上。网关通过其其他通信设备之一发送任何不在本地网络上的通信,具体取决于存储在其路由表中的信息。在有类别路由下,每个办公室都需要两个半使用的 C 类地址,这将非常浪费稀缺的 IP 地址。
使用 CIDR,我们可以将 C 类地址切割成两个不同的网络。为此,我们将网络掩码再扩展一位,为我们提供两个单独的网络,而以前我们只有一个网络。这将把我们的网络掩码从 255.255.255.0 或 24 个 1(以下称为 /24)更改为 /25 网络,或 255.255.255.128。我们的两个新网络都将具有相同的网络掩码;所有其他规则保持不变。我们现在有一个网络,其网络地址为 192.168.1.0,广播地址为 192.168.1.127。另一个网络将使用网络地址 192.168.1.128 和广播地址 192.168.1.255。
以同样的方式,我们可以继续将我们的网络切分成四个、八个、十六个、三十二个……网络。事实上,从 /8 开始,我们可以切片和切块,直到达到 /30。由于我们有 32 个数字可以使用,/32 仅代表一个地址,在这种特殊情况下,不需要网络地址或广播地址。这也意味着 /31 将代表两个地址,但由于一个将是网络地址,另一个将是广播地址,这将使我们没有主机地址—几乎肯定是不希望的。
在此方案下,网络掩码的第一个八位字节将保持为 255,但在此之后,我们可以更改任何其他数字。与其限制为 255 和 0,我们可能会发现自己将网络掩码中的第一个零替换为 128、192、224、240、248、252 或 254 中的任何一个,但最后一个八位字节除外,如上所述。网络地址和广播地址将绑定每个子网(有关详细信息,请参见表 2)。现在,任何网络都可以通过其可变长度子网掩码或地址主机部分中 1 的数量(从 /8 到 /32,/31 除外)来引用。通过外推,每个主机都可以通过其 IP 地址和 VLSM 表示法直接引用,以便很容易看出网络地址和广播地址以及网络掩码是什么。
例如,如果有人告诉我为我的机器分配 192.168.0.50/27,我就会知道网络地址是 192.168.0.32,广播地址是 192.168.0.63,网络掩码是 255.255.255.224。对于那些仍然无法形象化这一切如何转换的人,我提供了一个图表来帮助您(表 3)。
您会发现无类别寻址比这更有用。CIDR 还可以为您提供一种隔离大型组织中部门的方法,以提供更好的安全性(通过实施内部防火墙)并减少任何给定网段上的流量,从而减少冲突并提高响应时间。
许多公司可以扩展其可用 IP 地址池的另一种方法是利用为不需要在其所有机器上直接访问互联网的公司和个人预留的私有 IP 地址。这些号码可以根据需要使用。
通过使用执行网络地址转换 (NAT) 的防火墙或代理服务器(在 Linux 社区中称为“伪装”),这些机器仍然可以连接到互联网。光明的一面是您不会将公司内部地址路由到互联网,因为大多数路由器都设置为不路由这些私有地址。反之,没有人可以直接访问您的系统,因此您公司中涌现的恶意网站不会给您带来困扰。为了让任何人访问内部计算机,他们必须首先登录到代理服务器,然后继续进入,或者由代理通过服务器重定向到指定的机器。
我们可以使用的无需事先协调的地址的参考资料是 RFC 1918,“私有互联网的地址分配”,1996 年 2 月。这些私有地址如下(摘自 RFC)
10.0.0.0 - 10.255.255.255 (10/8 prefix) 172.16.0.0 - 172.31.255.255 (172.16/12 prefix) 192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
请注意,在旧的有类别寻址下,虽然第一个地址段是一个 A 类网络,但第二个实际上将是 16 个 B 类网络,最后一个段是 256 个 C 类网络。通过实施 Linux 网关盒并在 ipfwadm(通常在所有 Linux 发行版中都可用)中设置一些简单规则,我们可以执行伪装或网络地址转换,从而为私有网络上的所有计算机提供完整的互联网访问。但是,除非发生以下两种情况之一,否则互联网上的人员无法访问任何具有私有地址的计算机。一,管理员将网关设置为充当代理服务器;将特定端口上的请求代理到特定计算机,或者二,互联网用户首先使用 TELNET 访问网关盒,然后访问内部计算机。因此,私有地址保持私有。
这些地址组也可以用于在互联网上反向传输的私有网络。通过使用两个“实时”(非私有)IP 地址,每个网络“网关”机器上各一个,我们可以使用 Linux 的 IPIP 将两个私有网络连接在一起,IP 在 IP 内部隧道传输。虽然这不会提供隐私,除非两个网关都运行加密程序(例如 ssh(安全外壳)),但它可以提供虚拟网络。
