网络配置基础

请确保在实际配置网络之前理解以下几小节所述内容。这些基本原理适用于所有网络配置。

从何着手?

开始构筑网络之前您需要一些先决条件。其中最重要的是:

当前内核源代码(可选)

[Note]

Mandrakelinux 发行版已启用了网络功能。因此,重新编译内核可能是不必要的。对于众所周知的硬件,应该毫无问题。例如:3COM、NE2000 或是 Intel 的 NIC。然而,如果您确实需要更新内核,敬请阅读下述内容。

由于您目前运行的内核有可能还不支持您打算使用的网络类型和网卡型号,您将很可能需要内核源代码以便用相应的选项重新编译内核。

然而,只要坚持使用主流硬件,除非您想用到某个非常特殊的功能,重新编译内核是不必要的。

通常可在 sunsite.unc.edu 站点获得最新的内核源代码。这并非是官方站点,但是它有大量的带宽和容量。官方站点是 kernel dot org,但请尽量使用上述镜像。请记住,ftp.kernel.org 已经严重过载了。请使用镜像站点。

一般而言,内核源代码会被解压至 /usr/src/linux/ 目录。有关如何对内核打补丁(patch)及如何编译内核,请参考 Kernel-HOWTO 一文。关于怎样配置内核模块,请参考 Modules mini-HOWTO 一文。内核源代码中的 README 文件以及 /usr/src/linux/Documentation/ 目录对勇于探索的读者也十分有用。

除非特别指出,推荐您坚持使用标准内核发行版本(版本号第二个数字为偶数的那些)。内核开发版(版本号第二个数字为奇数的那些)可能会在结构上或其他方面做出更改,以致同系统中其他软件一同工作时会有问题。如果您不确定您能够解决此类问题,为避免其他软件产生潜在错误,请不要用它们。

IP 地址概述

网际协议(Internet Protocol -- IP)地址由 4 个字节构成[5]。一般,这些地址以所谓"点分十进制表示法 (dotted decimal notation)"来表示。这一格式将每一字节表示为一个十进制数字(0-255),并省略所有前导零(除非恰为值零)。字节之间以 "." 字符分隔。通常,每台主机或路由器接口拥有一个 IP 地址。在某些情况下,单台主机的不同网络接口使用同一个 IP 地址也是可以的。但常见的是,每个接口使用它自己独立的地址。

网际协议网络是一组连续的 IP 地址。同一个网络的所有地址都包含有一组共同的数字。网络内所有地址都相同的部分称作该地址的"网络号"。剩下的数字称作"主机号"。而网络中所有地址共同的二进制位称为子网掩码。后者是用来确定哪些地址属于它所对应的网络而哪些不属于。例如:

主机地址192.168.110.23
子网掩码255.255.255.0
网络号192.168.110.
主机号.23
  
网络地址192.168.110.0
广播地址192.168.110.255

任何地址同子网掩码"二进制按位与"的结果都将揭示它所属于的网络的地址。因此,网络地址通常是该网络地址范围内的最小值,并且其主机号通常为零。

广播地址是一个网络中所有主机都会监听的特殊地址(除了主机各自的地址之外)。该地址用于发送需要网络中所有主机都能收到的数据报文。某些诸如路由信息和警告消息的数据会被送到广播地址,以便网络中每个主机都会同时收到。广播地址分配方式有两个常用的标准。最常用的是使用网络中可用的最高地址作为广播地址。在上例中,这将会是 192.168.110.255。出于某些原因,其他的一些站点改变了传统,使用网络地址作为广播地址。实际上,用哪一个并没有什么关系,只要您将网络中所有主机的广播地址都设为同一个即可。

出于管理考虑,在 IP 协议研发初期,一些任意的地址组形成了子网。而这些子网组成了所谓类的组别。这些类提供了一组能被分配的标准子网大小。范围如下:

子网类子网掩码网络地址
A255.0.0.00.0.0.0 - 127.255.255.255
B255.255.0.0128.0.0.0 - 191.255.255.255
C255.255.255.0192.0.0.0 - 223.255.255.255
多播240.0.0.0224.0.0.0 - 239.255.255.255

您该使用哪种地址取决于您在做什么。您可综合以下方法来获得所需地址:

在现有 IP 网络中安装一台 Linux 主机

如果您想要在现有的 IP 网络中安装一台 Linux 主机,那么您应联系网络管理员了解下述信息:

  • 主机 IP 地址

  • IP 网络地址

  • IP 广播地址

  • IP 子网掩码

  • 路由器地址

  • 域名服务器地址

您应按上述要求配置您的 Linux 网络设备。您不能仅将它们拼凑起来而希望您的配置有用。

构建一个不会连到 Internet 的全新网络

假如您在构建私网,而且并不期望连入 Internet ,那么您可以选择使用任何地址。然而,出于安全和一致性考虑,确有一些 IP 网络地址为这一目的专门保留。在 RFC1597 中有相关说明。简述如下:

表格 12.1. 保留的私网网段

子网类子网掩码网络地址
A255.0.0.010.0.0.0 - 10.255.255.255
B255.255.0.0172.16.0.0 - 172.31.255.255
C255.255.255.0192.168.0.0 - 192.168.255.255

首先,您应该确定您的网络需要多大。然后,按需选取地址。

路由

路由涉及面很广,有关这方面的著作可以说是连篇累牍。大多数人可能只有简单的路由要求,其他人可能不是。这里将仅涉及一些路由方面的基本知识。如果您想深入研究相关内容,请参考本章开头提供的推荐读物。

让我们从定义开始。什么是 IP 路由?以下是我所了解的:

"IP 路由是一个具有多重连接的主机选择往何处转发其收到的数据报文的过程。"

例如一台标准的办公室路由器。它可能拥有一个到 Internet 的 PPP 连接,一组以太网段分配到各个工作站,以及另一个 PPP 连接到另一个办公室。当路由器收到某个以太网连接发送来的数据报文时,路由就是其选择使用哪一个接口转发该数据报文到下一站的机制。单纯主机也需要路由,所有 Internet 主机都有两个网络设备,其中一个是回环接口,另一个是其用来同网络其余部分通信的接口(可能为以太网、PPP 或是 SLIP 串行接口)。

好。那么路由是怎样起作用的呢?每台主机都保存有一张路由规则的特殊列表,该列表被称为路由表。路由表每行一般有三列:第一列是目的地地址,第二列是数据报文要被转发到的接口的名称,第三列是可选的,它表示该报文将要抵达的下一个中转主机地址。在 Linux 中,您能够使用如下命令查看该表:

user% cat /proc/net/route

或者使用以下两条命令之一:

user% /sbin/route -n
user% netstat -r

路由过程比较简单:当一个数据报文抵达时,其目的地地址会同表中每一行进行比较。该数据报文将会被转发到最佳匹配行所对应的接口。如果设定了网关,那么该数据报文将会从指定接口转发至网关主机。否则,会假设目的地地址是在该接口支持的网络中。

使用一条特殊的命令可以用来维护该表。该命令将根据其命令行参数执行内核的一系列系统调用。这些调用请求内核添加,删除,或者修改路由表表项。该命令是 route。请参考 route(8) 以获得详情。

Routed 程序有何作用?

上述路由配置适用于简单的网络设置,其中,到一个指定的目的地只有一条路经。如果您的网络设置较为复杂,情况就不那么简单了。幸运的是,这对于大多数人而言不是一个问题。

上述"手动路由"或称"静态路由"的一大问题是:万一网络中某台主机或是某个连接出了问题,那么引导数据报文走另一条路径(如果有另一条路径的话)的唯一办法只能是靠执行相应的命令来手工干预。当然,这样最既笨拙又缓慢,显得不切实际仅凭运气。人们开发了各种技术来自动调整路由表以应对万一网络中出现的故障而同时确有其他路径可供选择的情况。所有这些技术可以粗略统称为 "动态路由协议" 。

您可能或多或少听说过常用的动态路由协议。最常用的可能是 RIP (Routing Information Protocol -- 路由选择信息协议)以及 OSPF (Open Shortest Path First Protocol -- 开放最短路径优先协议)。路由选择信息协议在小型网络(比如中小型公司网络或是大楼网络)中十分普遍。相比较而言,OSPF 更加现代,更加适合处理大型网络配置,因而更适用于含有大量可能路径的网络环境中。这些协议的常用实现有:routed - RIP 以及 gated - RIPOSPF 及其他。 routed 程序通常包含于您的 Linux 发行版中,或者包含于 "NetKit" 软件包中。

关于何处以及如何使用动态路由协议如图形 12.1, "动态路由示例"所示。

图形 12.1. 动态路由示例

动态路由示例

现有三个路由器:A、B 和 C。每一个路由器支持一个 C 类 IP 网络(子网掩码为 255.255.255.0)的以太网网段。每个路由器同时具有与其他路由器相连的 PPP 连接。整个网络形成一个三角形。

很清楚,A路由器的路由表应该如下所示:

root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
root# route add -net 192.168.2.0 netmask 255.255.255.0 ppp0
root# route add -net 192.168.3.0 netmask 255.255.255.0 ppp1

这将正常工作直到路由器 A 和 B 之间的连接断开。一旦这一连接断开,从上述路由表项中可以得出,A 所负责的以太网段中的主机发送的信息将不能抵达 B 所负责的以太网段中的主机。这是因为它们发送的数据报文将会被转发到 A 路由器的 ppp0 连接,而这个连接已经断开。但它们却仍然可以同 C 负责的以太网段中的主机联系,而 C 的以太网段中的主机依然能够同 B 的以太网段中的主机联系。这是因为,B 与 C 的连接依然保持。

且慢,如果 A 能够同 C 联系而 C 能够同 B 联系,那么为什么 A 不能够将其数据报文转交 C 并由 C 将其传送至 B 呢?而这正是类似 RIP 等动态路由协议被设计用来解决的问题。如果 A、B 和 C 都运行路由守护程序,那么万一网络中有某个连接出了故障,它们的路由表就会被修改以反映新的网络状态。配置这样一个网络十分简单。对于每个路由器只需要做两件事。在上例中,对于路由器 A:

root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
root# /usr/sbin/routed

路由守护程序 routed 启动时自动寻找所有活动的网络端口并发送及监听每个网络设备的消息,这样它就能确定并更新相应主机中的路由表。

以上只是对动态路由及其使用的简单描述。如果您希望进一步研究,请参考本文开头的推荐读物。

有关动态路由的要点有:

  1. 仅当 Linux 主机有能力在多重路由中做出选择时,才需要运行动态路由协议守护程序。例如,当您打算使用 IP 伪装时。

  2. 动态路由守护程序将自动调整路由表以适应网络的变化。

  3. RIP 适用于中小型网络。



[5] IP 第四版,亦称为 IPv4