下一页 上一页 目录

5. 通用网络配置信息。

在您实际尝试配置网络之前,您几乎需要了解和理解以下小节。它们是基本原则,无论您希望部署的网络的具体性质如何,都适用。

5.1 我需要什么才能开始?

在您开始构建或配置网络之前,您需要准备一些东西。其中最重要的是

当前内核源代码(可选)。

请注意

当前大多数发行版都已启用网络功能,因此可能不需要重新编译内核。如果您运行的是广为人知的硬件,那么您应该没问题。例如:3COM 网卡、NE2000 网卡或 Intel 网卡。但是,如果您发现自己确实需要更新内核,则提供以下信息。

因为您现在运行的内核可能尚不支持您希望使用的网络类型或网卡,所以您可能需要内核源代码,以便您可以使用适当的选项重新编译内核。

对于 Redhat、Caldera、Debian 或 Suse 等主要发行版的用户来说,情况已不再如此。只要您坚持使用主流硬件,除非您需要非常特定的功能,否则应该不需要重新编译内核。

您可以随时从 ftp.cdrom.com 获取最新的内核源代码。这不是官方站点,但它们有大量的带宽和允许大量用户访问。官方站点是 kernel.org,但如果可以,请使用上面的站点。请记住,ftp.kernel.org 严重超载。请使用镜像站点。

通常,内核源代码将被解压到 /usr/src/linux 目录中。有关如何应用补丁和构建内核的信息,您应该阅读 Kernel-HOWTO。有关如何配置内核模块的信息,您应该阅读“Modules mini-HOWTO”。此外,内核源代码中的 README 文件和 Documentation 目录对于勇敢的读者来说非常有参考价值。

除非另有明确说明,否则我建议您坚持使用标准内核版本(版本号中第二个数字为偶数的版本)。开发版本内核(第二个数字为奇数的版本)可能具有结构或其他更改,可能会导致与系统上的其他软件一起工作时出现问题。如果您不确定除了可能存在的其他软件错误之外,您是否可以解决这些问题,那么请不要使用它们。

另一方面,这里描述的一些功能是在 2.1 内核开发期间引入的,因此您必须做出选择:您可以坚持使用 2.0,同时等待 2.2 和包含每个新工具的更新发行版,或者您可以获取 2.1 并寻找利用新功能所需的各种支持程序。在我撰写此段落时,即 1998 年 8 月,当前版本是 2.1.115,预计 2.2 将很快出现。

当前网络工具。

网络工具是您用来配置 Linux 网络设备的程序。这些工具允许您为设备分配地址并配置路由等。

大多数现代 Linux 发行版都附带了网络工具,因此如果您是从发行版安装的,并且尚未安装网络工具,则应安装它们。

如果您不是从发行版安装的,那么您将需要自己获取源代码并编译这些工具。这并不困难。

网络工具现在由 Bernd Eckenfels 维护,可在以下网址获取:ftp.inka.de,并在以下网址镜像:ftp.uk.linux.org

您还可以从 net-tools-1.51-3.i386.rpm 获取最新的 RedHat 软件包

请务必选择最适合您希望使用的内核的版本,并按照软件包中的说明进行安装。

要安装和配置编写时最新的版本,您需要执行以下操作

        user% tar xvfz net-tools-1.33.tar.gz
        user% cd net-tools-1.33
        user% make config
        user% make
        root# make install
        

或者使用 Redhat 软件包

        root# rpm -U net-tools-1.51-3.i386.rpm
        

此外,如果您打算配置防火墙或使用 IP 伪装功能,您将需要 ipfwadm 命令。最新版本可以从以下网址获取:ftp.xos.nl。同样,有许多版本可用。请务必选择与您的内核最匹配的版本。请注意,Linux 的防火墙功能在 2.1 开发期间发生了变化,并在内核 v2.2 中被 ipchains 取代。ipfwadm 仅适用于内核 2.0 版本。以下是已知使用内核 2.0 或更低版本的发行版。

        Redhat 5.2 or below
        Caldera pre version 2.2
        Slackware pre version 4.x
        Debian pre version 2.x
        

要安装和配置编写时最新的版本,您需要阅读位于 Linux 文档项目 的 IPChains howto

请注意,如果您运行的是内核 2.2 版本(或较晚的 2.1 版本),则 ipfwadm 不是配置防火墙的正确工具。此版本的 NET-3-HOWTO 当前不处理新的防火墙设置。如果您需要有关 ipchains 的更多详细信息,请参考上述内容。

网络应用程序。

网络应用程序是诸如 telnetftp 及其各自的服务器程序之类的程序。David Holland 一直在管理这些最常见的程序的发行版,该发行版现在由 netbug@ftp.uk.linux.org 维护。您可以从以下网址获取发行版:ftp.uk.linux.org

IP 地址,解释。

互联网协议地址由四个字节组成。约定以所谓的“点分十进制表示法”书写地址。在这种形式中,每个字节都转换为十进制数字 (0-255),删除任何前导零,除非数字为零,并用“.”字符分隔每个字节书写。按照惯例,主机或路由器的每个接口都有一个 IP 地址。在某些情况下,在单台机器的每个接口上使用相同的 IP 地址是合法的,但通常每个接口都有自己的地址。

互联网协议网络是 IP 地址的连续序列。网络中的所有地址在地址中都有一些共同的数字。地址中网络内所有地址共有的部分称为地址的“网络部分”。其余数字称为“主机部分”。网络中所有地址共享的位数称为网络掩码,网络掩码的作用是确定哪些地址属于它所应用的网络,哪些地址不属于。例如,考虑以下情况

        -----------------  ---------------
        Host Address       192.168.110.23
        Network Mask       255.255.255.0
        Network Portion    192.168.110.
        Host portion                  .23
        -----------------  ---------------
        Network Address    192.168.110.0
        Broadcast Address  192.168.110.255
        -----------------  ---------------
        

任何地址与其网络掩码进行“按位与”运算都将揭示其所属网络的地址。因此,网络地址始终是网络地址范围内编号最小的地址,并且始终将地址的主机部分编码为全零。

广播地址是一个特殊地址,网络上的每个主机除了自己的唯一地址之外,还会侦听该地址。如果网络上的每个主机都应该接收数据报,则数据报将发送到此地址。某些类型的数据,如路由信息和警告消息,将传输到广播地址,以便网络上的每个主机都可以同时接收它。对于广播地址应该是什么,有两种常用的标准。最广泛接受的标准是使用网络上的最高可能地址作为广播地址。在上面的示例中,这将是 192.168.110.255。出于某些原因,其他站点采用了使用网络地址作为广播地址的约定。实际上,您使用哪个地址并不重要,但您必须确保网络上的每个主机都配置了相同的广播地址。

出于管理原因,在 IP 协议开发的早期,一些任意的地址组被组成网络,这些网络被分组为所谓的类。这些类提供了许多可以分配的标准大小的网络。分配的范围是

        ----------------------------------------------------------
        | Network | Netmask       | Network Addresses            |
        | Class   |               |                              |
        ----------------------------------------------------------
        |    A    | 255.0.0.0     | 0.0.0.0    - 127.255.255.255 |
        |    B    | 255.255.0.0   | 128.0.0.0  - 191.255.255.255 |
        |    C    | 255.255.255.0 | 192.0.0.0  - 223.255.255.255 |
        |Multicast| 240.0.0.0     | 224.0.0.0  - 239.255.255.255 |
        ----------------------------------------------------------
        

您应该使用哪些地址取决于您正在做什么。您可能必须结合以下活动才能获得所需的所有地址

在现有 IP 网络上安装 Linux 机器

如果您希望将 Linux 机器安装到现有的 IP 网络上,那么您应该联系管理该网络的人员,并向他们索取以下信息

然后,您应该使用这些详细信息配置您的 Linux 网络设备。您不能随意编造它们并期望您的配置能够工作。

构建一个永远不会连接到互联网的全新网络

如果您正在构建一个专用网络,并且您永远不打算将该网络连接到互联网,那么您可以选择您喜欢的任何地址。但是,为了安全和一致性,已经保留了一些 IP 网络地址专门用于此目的。这些地址在 RFC1597 中指定,如下所示

        -----------------------------------------------------------
        |         RESERVED PRIVATE NETWORK ALLOCATIONS            |
        -----------------------------------------------------------
        | Network | Netmask       | Network Addresses             |
        | Class   |               |                               |
        -----------------------------------------------------------
        |    A    | 255.0.0.0     | 10.0.0.0    - 10.255.255.255  |
        |    B    | 255.255.0.0   | 172.16.0.0  - 172.31.255.255  |
        |    C    | 255.255.255.0 | 192.168.0.0 - 192.168.255.255 |
        -----------------------------------------------------------
        
您应该首先确定您希望您的网络有多大,然后选择您需要的尽可能多的地址。

5.2 我应该将配置命令放在哪里?

Linux 系统启动过程有几种不同的方法。内核启动后,它始终执行一个名为“init”的程序。然后,init 程序读取其名为 /etc/inittab 的配置文件,并开始启动过程。周围有几种不同的 init 风格,尽管现在每个人都在向 Miguel van Smoorenburg 开发的 System V (Five) 风格靠拢。

尽管 init 程序始终相同,但每个发行版都以不同的方式组织系统启动的设置。

通常,/etc/inittab 文件包含如下条目

        si::sysinit:/etc/init.d/boot
        

此行指定了实际管理启动顺序的 shell 脚本文件的名称。此文件有点类似于 MS-DOS 中的 AUTOEXEC.BAT 文件。

通常还有其他脚本由启动脚本调用,并且网络通常在其中许多脚本之一中配置。

下表可用作您系统的指南

---------------------------------------------------------------------------
Distrib. | Interface Config/Routing          | Server Initialization
---------------------------------------------------------------------------
Debian   | /etc/init.d/network               | /etc/rc2.d/*
---------------------------------------------------------------------------
Slackware| /etc/rc.d/rc.inet1                | /etc/rc.d/rc.inet2 
---------------------------------------------------------------------------
RedHat   | /etc/rc.d/init.d/network          | /etc/rc.d/rc3.d/*
---------------------------------------------------------------------------

请注意,Debian 和 Red Hat 使用整个目录来托管启动系统服务的脚本(通常信息不位于这些文件中,例如 Red Hat 系统将所有系统配置存储在 /etc/sysconfig 下的文件中,启动脚本从中检索配置)。如果您想掌握启动过程的详细信息,我建议您查看 /etc/inittabinit 附带的文档。《Linux Journal》也将发表一篇关于系统初始化的文章,本文档将在该文章在网上发布后立即指向它。

大多数现代发行版都包含一个程序,该程序允许您配置许多常见的网络接口类型。如果您有其中之一,那么您应该查看它是否可以满足您的需求,然后再尝试手动配置。

        -----------------------------------------
        Distrib   | Network configuration program
        -----------------------------------------
        RedHat    | /usr/bin/netcfg
        Slackware | /sbin/netconfig
        -----------------------------------------
        

5.3 创建您的网络接口。

在许多 Unix 操作系统中,网络设备在 /dev 目录中显示。Linux 中并非如此。在 Linux 中,网络设备是在软件中动态创建的,不需要设备文件存在。

在大多数情况下,网络设备是在设备驱动程序初始化并找到您的硬件时自动创建的。例如,以太网设备驱动程序在找到您的以太网硬件时按顺序创建 eth[0..n] 接口。找到的第一个以太网卡变为 eth0,第二个变为 eth1,依此类推。

但在某些情况下,特别是 slipppp,网络设备是通过某些用户程序的动作创建的。同样的顺序设备编号也适用,但设备不会在启动时自动创建。原因是与以太网设备不同,活动的 slipppp 设备的数量可能在机器的正常运行时间内变化。这些情况将在后面的章节中更详细地介绍。

5.4 配置网络接口。

当您拥有所需的所有程序以及您的地址和网络信息时,您可以配置您的网络接口。当我们谈论配置网络接口时,我们谈论的是为网络设备分配适当的地址以及为网络设备的其他可配置参数设置适当值的过程。最常用于执行此操作的程序是 ifconfig(接口配置)命令。

通常,您将使用类似于以下的命令

        root# ifconfig eth0 192.168.0.1 netmask 255.255.255.0 up
        

在这种情况下,我正在配置一个以太网接口“eth0”,其 IP 地址为“192.168.0.1”,网络掩码为“255.255.255.0”。命令末尾的“up”告诉接口应该变为活动状态,但通常可以省略,因为它是默认设置。要关闭接口,您只需调用“ifconfig eth0 down”。

内核在配置接口时会假定某些默认值。例如,您可以为接口指定网络地址和广播地址,但如果您不这样做,就像在我的示例中一样,那么内核将根据您提供的网络掩码,如果您不提供网络掩码,则根据配置的 IP 地址的网络类别,对它们应该是什么做出合理的猜测。在我的示例中,内核将假定它是在接口上配置的 C 类网络,并将接口的网络地址配置为“192.168.0.0”,广播地址配置为“192.168.0.255”。

ifconfig 命令还有许多其他选项。其中最重要的是

up

此选项激活接口(并且是默认设置)。

down

此选项停用接口。

[-]arp

此选项启用或禁用在此接口上使用地址解析协议

[-]allmulti

此选项启用或禁用接收所有硬件多播数据包。硬件多播使主机组能够接收寻址到特殊目标的数据包。如果您正在使用桌面视频会议等应用程序,这可能很重要,但通常不使用。

mtu N

此参数允许您设置此设备的 MTU

netmask <addr>

此参数允许您设置此设备所属网络的网络掩码。

irq <addr>

此参数仅适用于某些类型的硬件,并允许您设置此设备的硬件的 IRQ。

[-]broadcast [addr]

此参数允许您启用和设置接受发送到广播地址的数据报,或禁用接收这些数据报。

[-]pointopoint [addr]

此参数允许您设置点对点链路(例如 slipppp)另一端机器的地址。

hw <type> <addr>

此参数允许您设置某些类型的网络设备的硬件地址。这对于以太网通常不是很有用,但对于其他网络类型(例如 AX.25)很有用。

您可以在任何网络接口上使用 ifconfig 命令。某些用户程序(例如 pppddip)会在创建网络设备时自动配置它们,因此无需手动使用 ifconfig

5.5 配置您的名称解析器。

名称解析器”是 Linux 标准库的一部分。它的主要功能是提供一项服务,将人类友好的主机名(如“ftp.funet.fi”)转换为机器友好的 IP 地址(如 128.214.248.6)。

名称的含义是什么?

您可能熟悉互联网主机名的外观,但不了解它们的构造或解构方式。互联网域名本质上是分层的,也就是说,它们具有树状结构。“”是一个名称族或名称组。“”可以分解为“子域”。“顶级域”是不属于子域的域。顶级域在 RFC-920 中指定。最常见的顶级域的一些示例是

COM

商业组织

EDU

教育组织

GOV

政府组织

MIL

军事组织

ORG

其他组织

NET

互联网相关组织

国家/地区代码

这些是代表特定国家/地区的两个字母的代码。

由于历史原因,大多数属于非国家/地区顶级域名的域都由美国的组织使用,尽管美国也有自己的国家/地区代码“.us”。对于 .com.org 域,情况已不再如此,非美国公司也经常使用它们。

这些顶级域中的每一个都有子域。基于国家/地区名称的顶级域通常接下来根据 comedugovmilorg 域分解为子域。因此,例如,您最终会得到:澳大利亚的商业和政府组织的 com.augov.au;请注意,这不是一般规则,因为实际策略取决于每个域的命名机构。

下一个级别的划分通常代表组织的名称。进一步的子域性质各异,通常下一个级别的子域基于组织的部门结构,但它可能基于组织的网络管理员认为合理且有意义的任何标准。

名称最左边的部分始终是分配给主机机器的唯一名称,称为“主机名”,主机名右边的名称部分称为“域名”,完整名称称为“完全限定域名”。

以 Terry 的主机为例,完全限定域名是“perf.no.itg.telstra.com.au”。这意味着主机名是“perf”,域名是“no.itg.telstra.com.au”。域名基于他的国家/地区(澳大利亚)的顶级域名,并且由于他的电子邮件地址属于商业组织,因此“.com”是下一个级别的域名。公司名称是(曾经是)“telstra”,他们的内部命名结构基于组织结构,在本例中,该机器属于信息技术组网络运营部门。

通常,名称相当短;例如,我的 ISP 称为 “systemy.it”,我的非营利组织称为 “linux.it”,没有任何 comorg 子域,因此我自己的主机简称为 “morgana.systemy.it”,而 rubini@linux.it 是一个有效的电子邮件地址。请注意,域的所有者有权注册主机名以及子域;例如,我所属的 LUG 使用域名 pluto.linux.it,因为 linux.it 的所有者同意为 LUG 开设一个子域。

您需要哪些信息。

您需要知道您的主机名将属于哪个域。名称解析器软件通过向“域名服务器”发出请求来提供此名称转换服务,因此您需要知道您可以使用的本地名称服务器的 IP 地址。

您需要编辑三个文件,我将依次介绍每个文件。

/etc/resolv.conf

/etc/resolv.conf 是名称解析器代码的主要配置文件。它的格式非常简单。它是一个文本文件,每行一个关键字。通常使用三个关键字,它们是

domain

此关键字指定本地域名。

search

此关键字指定要搜索主机名的备用域名列表

nameserver

此关键字可以使用多次,指定在解析名称时要查询的域名服务器的 IP 地址

/etc/resolv.conf 的示例可能如下所示

        domain maths.wu.edu.au
        search maths.wu.edu.au wu.edu.au
        nameserver 192.168.10.1
        nameserver 192.168.12.1
        

此示例指定附加到非限定名称(即不带域提供的主机名)的默认域名是 maths.wu.edu.au,并且如果在该域中找不到主机,则也直接尝试 wu.edu.au 域。提供了两个名称服务器条目,名称解析器代码可以调用其中任何一个来解析名称。

/etc/host.conf

/etc/host.conf 文件是您配置一些控制名称解析器代码行为的项目的地方。此文件的格式在“resolv+”手册页中详细描述。在几乎所有情况下,以下示例都适用于您

                          
        order hosts,bind                                          
        multi on  
        

此配置告诉名称解析器在尝试查询名称服务器之前检查 /etc/hosts 文件,并返回 /etc/hosts 文件中找到的主机的所有有效地址,而不仅仅是第一个地址。

/etc/hosts

/etc/hosts 文件是您放置本地主机的名称和 IP 地址的地方。如果您将主机放在此文件中,则无需查询域名服务器即可获取其 IP 地址。这样做的不利之处在于,如果该主机的 IP 地址发生更改,您必须自己保持此文件为最新状态。在一个管理良好的系统中,通常出现在此文件中的主机名只有环回接口的条目和本地主机名。

        # /etc/hosts
        127.0.0.1      localhost loopback
        192.168.0.1    this.host.name
        

您可以每行指定多个主机名,如第一个条目所示,这是环回接口的标准条目。

运行名称服务器

如果您想运行本地名称服务器,您可以轻松地做到这一点。请参考 DNS-HOWTO 和您版本的 BIND(Berkeley Internet Name Domain)中包含的任何文档。

5.6 配置您的环回接口。

loopback”接口是一种特殊类型的接口,允许您连接到自己。您可能出于各种原因想要这样做,例如,您可能希望在不干扰网络上任何其他人的情况下测试某些网络软件。按照惯例,IP 地址 “127.0.0.1” 专门分配用于环回。因此,无论您去哪台机器,如果您打开到 127.0.0.1 的 telnet 连接,您始终会到达本地主机。

配置环回接口很简单,您应该确保这样做(但请注意,此任务通常由标准初始化脚本执行)。

        root# ifconfig lo 127.0.0.1
        root# route add -host 127.0.0.1 lo
        

我们将在下一节中更多地讨论 route 命令。

5.7 路由。

路由是一个很大的话题。很容易写出大量关于它的文本。你们中的大多数人对路由的要求都相当简单,有些人则不然。我将仅介绍一些路由的基本原理。如果您对更详细的信息感兴趣,那么我建议您参考文档开头提供的参考资料。

让我们从一个定义开始。什么是 IP 路由?这是我正在使用的一个定义

IP 路由是具有多个网络连接的主机决定将接收到的 IP 数据报传递到何处的过程。

用一个例子来说明这一点可能很有用。想象一个典型的办公室路由器,它可能有一个连接到互联网的 PPP 链路、一些以太网段为工作站供电,以及另一个连接到另一个办公室的 PPP 链路。当路由器在其任何网络连接上接收到数据报时,路由是它用来确定接下来应该将数据报发送到哪个接口的机制。简单的主机也需要路由,所有互联网主机都有两个网络设备,一个是上面描述的环回接口,另一个是它用来与网络其余部分通信的接口,可能是以太网,可能是 PPP 或 SLIP 串行接口。

好的,那么路由是如何工作的呢?每个主机都维护一个特殊的路由规则列表,称为路由表。此表包含行,这些行通常至少包含三个字段,第一个是目标地址,第二个是要将数据报路由到的接口的名称,第三个是可选的另一台机器的 IP 地址,该机器将在其通过网络的下一步中携带数据报。在 Linux 中,您可以使用以下命令查看此表

        user% cat /proc/net/route
        

或者使用以下任一命令

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

路由过程相当简单:接收到传入的数据报,检查目标地址(它是给谁的),并将其与表中的每个条目进行比较。选择最匹配该地址的条目,并将数据报转发到指定的接口。如果网关字段已填写,则数据报将通过指定的接口转发到该主机,否则假定目标地址位于接口支持的网络上。

要操作此表,需要使用一个特殊命令。此命令接受命令行参数,并将它们转换为内核系统调用,这些调用请求内核在路由表中添加、删除或修改条目。该命令称为“route”。

一个简单的例子。想象一下您有一个以太网网络。您被告知这是一个 C 类网络,地址为 192.168.1.0。您已被提供 IP 地址 192.168.1.10 供您使用,并被告知 192.168.1.1 是连接到互联网的路由器。

第一步是按照前面所述配置接口。您将使用类似以下的命令

        root# ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up
        

您现在需要在路由表中添加一个条目,以告知内核,对于所有地址与 192.168.1.* 匹配的主机的数据报应发送到以太网设备。您将使用类似于以下的命令

        root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
        

请注意使用 “-net” 参数来告诉路由程序此条目是网络路由。您的另一个选择是 “-host” 路由,它是特定于一个 IP 地址的路由。

此路由将使您能够与以太网段上的所有主机建立 IP 连接。但是,对于以太网段上不存在的所有 IP 主机呢?

必须为每个可能的目标网络添加路由将是一项非常困难的工作,因此有一种特殊的技巧用于简化此任务。该技巧称为 “default” 路由。default 路由匹配每个可能的目标,但匹配程度较差,因此如果存在任何其他与所需地址匹配的条目,则将使用该条目而不是 default 路由。default 路由的想法只是让您能够说 “其他所有内容都应该去这里”。在我虚构的示例中,您将使用如下条目

        root# route add default gw 192.168.1.1 eth0
        

gw” 参数告诉路由命令,下一个参数是网关或路由器机器的 IP 地址或名称,匹配此条目的所有数据报都应定向到该网关或路由器机器以进行进一步路由。

因此,您的完整配置将如下所示

        root# ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up
        root# route add -net 192.168.1.0 netmask 255.255.255.0 eth0
        root# route add default gw 192.168.1.1 eth0
        

如果您仔细查看您的网络 “rc” 文件,您会发现其中至少有一个文件看起来非常相似。这是一个非常常见的配置。

现在让我们来看一个稍微复杂一点的路由配置。假设我们正在配置之前看过的路由器,那个支持到互联网的 PPP 链路和连接办公室工作站的局域网段的路由器。假设路由器有三个以太网段和一个 PPP 链路。我们的路由配置看起来会像这样:

        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 eth1
        root# route add -net 192.168.3.0 netmask 255.255.255.0 eth2
        root# route add default ppp0
        

每个工作站都将使用上面介绍的更简单的形式,只有路由器需要单独指定每个网络路由,因为对于工作站来说,default 路由机制将捕获所有路由,让路由器担心如何适当地拆分它们。您可能想知道为什么呈现的默认路由没有指定 `gw`。原因很简单,像 PPP 和 slip 这样的串行链路协议在其网络上只有两个主机,每端一个。将链路另一端的主机指定为网关是毫无意义和多余的,因为没有其他选择,因此您不需要为这些类型的网络连接指定网关。其他网络类型,如以太网、arcnet 或令牌环,确实需要指定网关,因为这些网络支持大量主机。

那么 routed 程序是做什么的呢?

上面描述的路由配置最适合于只有单一可能到达目的地的简单网络安排。当您有更复杂的网络安排时,事情会变得有点复杂。幸运的是,对于你们大多数人来说,这不会是一个问题。

如上所述,`手动路由` 或 `静态路由` 的最大问题是,如果您的网络中的机器或链路发生故障,那么如果您想以另一种方式引导数据报(如果存在另一种方式),唯一的方法是手动干预并执行适当的命令。自然,这是笨拙、缓慢、不切实际且容易出错的。已经开发了各种技术来在网络故障发生时自动调整路由表,在有备用路由的情况下,所有这些技术都 loosely grouped by the term `动态路由协议`。

您可能听说过一些更常见的动态路由协议。最常见的可能是 RIP(路由信息协议)和 OSPF(开放最短路径优先协议)。路由信息协议在小型网络上非常常见,例如中小型企业网络或建筑物网络。OSPF 更现代,更能够处理大型网络配置,并且更适合于网络中存在大量可能路径的环境。这些协议的常见实现是:`routed' - RIP 和 `gated' - RIP、OSPF 等。`routed' 程序通常随您的 Linux 发行版一起提供,或者包含在上面详述的 `NetKit` 包中。

以下是一个您可能使用动态路由协议的例子:

    192.168.1.0 /                         192.168.2.0 /
       255.255.255.0                         255.255.255.0
     -                                     -
     |                                     |
     |   /-----\                 /-----\   |
     |   |     |ppp0   //    ppp0|     |   |
eth0 |---|  A  |------//---------|  B  |---| eth0
     |   |     |     //          |     |   |
     |   \-----/                 \-----/   |
     |      \ ppp1             ppp1 /      |
     -       \                     /       -
              \                   /
               \                 /
                \               /
                 \             /
                  \           /
                   \         /
                    \       /
                     \     /
                  ppp0\   /ppp1
                     /-----\
                     |     |
                     |  C  |
                     |     |
                     \-----/
                        |eth0
                        |
                   |---------|
                   192.168.3.0 /
                      255.255.255.0

我们有三个路由器 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 路由其到 B 的数据报,并让 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 Masquerading,就是一个例子。
  2. 动态路由守护进程将自动修改您的路由表,以适应网络中的变化。
  3. RIP 适用于中小型网络。

5.8 配置您的网络服务器和服务。

网络服务器和服务是允许远程用户使用您的 Linux 机器的程序。服务器程序监听网络端口。网络端口是一种寻址任何特定主机上的特定服务的方式,也是服务器如何知道传入的 telnet 连接和传入的 ftp 连接之间的区别的方式。远程用户建立到您的机器的网络连接,服务器程序,网络守护进程程序,监听该端口接受连接并执行。网络守护进程有两种操作方式。这两种方式在实践中都很常用。这两种方式是:

独立运行

网络守护进程程序监听指定的网络端口,当建立传入连接时,它自己管理网络连接以提供服务。

作为 inetd 服务器的从属

inetd 服务器是一个特殊的网络守护进程程序,专门用于管理传入的网络连接。它有一个配置文件,告诉它当接收到传入连接时需要运行什么程序。任何服务端口都可以配置为 tcp 或 udp 协议。端口在另一个文件中描述,我们稍后会讨论。

我们需要配置两个重要的文件。它们是 /etc/services 文件,它为端口号分配名称,以及 /etc/inetd.conf 文件,它是 inetd 网络守护进程的配置文件。

/etc/services

/etc/services 文件是一个简单的数据库,它将人类友好的名称与机器友好的服务端口关联起来。它的格式非常简单。该文件是一个文本文件,每行代表数据库中的一个条目。每个条目由三个字段组成,字段之间用任意数量的空白字符(制表符或空格)分隔。字段是:

  name      port/protocol        aliases     # comment
  

名称

表示所描述服务的单个单词名称。

端口/协议

此字段分为两个子字段。

端口

一个数字,指定命名服务将在其上可用的端口号。大多数常用服务都有分配的服务号。这些在 RFC-1340 中描述。

协议

此子字段可以设置为 tcpudp。重要的是要注意 18/tcp 的条目与 18/udp 的条目非常不同,并且从技术上讲,没有理由要求同一服务必须同时存在于两者之上。通常常识占上风,只有当特定服务通过 tcpudp 都可用时,您才会看到两者的条目。

别名

可以用来引用此服务条目的其他名称。

在一行中出现在 `#` 字符之后的任何文本都将被忽略并被视为注释。

/etc/services 文件示例。

所有现代 Linux 发行版都提供了一个良好的 /etc/services 文件。万一您碰巧是从头开始构建机器,这里是旧 Debian 发行版提供的 /etc/services 文件的副本:

# /etc/services:
# $Id: NET3-4-HOWTO.sgml,v 1.2 2000/07/19 15:33:03 gferg dead $
#
# Network services, Internet style
#
# Note that it is presently the policy of IANA to assign a single well-known
# port number for both TCP and UDP; hence, most entries here have two entries
# even if the protocol doesn't support UDP operations.
# Updated from RFC 1340, ``Assigned Numbers'' (July 1992).  Not all ports
# are included, only the more common ones.

tcpmux          1/tcp                           # TCP port service multiplexer
echo            7/tcp
echo            7/udp
discard         9/tcp           sink null
discard         9/udp           sink null
systat          11/tcp          users
daytime         13/tcp
daytime         13/udp
netstat         15/tcp
qotd            17/tcp          quote
msp             18/tcp                          # message send protocol
msp             18/udp                          # message send protocol
chargen         19/tcp          ttytst source
chargen         19/udp          ttytst source
ftp-data        20/tcp
ftp             21/tcp
ssh             22/tcp                          # SSH Remote Login Protocol
ssh             22/udp                          # SSH Remote Login Protocol
telnet          23/tcp
# 24 - private
smtp            25/tcp          mail
# 26 - unassigned
time            37/tcp          timserver
time            37/udp          timserver
rlp             39/udp          resource        # resource location
nameserver      42/tcp          name            # IEN 116
whois           43/tcp          nicname
re-mail-ck      50/tcp                          # Remote Mail Checking Protocol
re-mail-ck      50/udp                          # Remote Mail Checking Protocol
domain          53/tcp          nameserver      # name-domain server
domain          53/udp          nameserver
mtp             57/tcp                          # deprecated
bootps          67/tcp                          # BOOTP server
bootps          67/udp
bootpc          68/tcp                          # BOOTP client
bootpc          68/udp
tftp            69/udp
gopher          70/tcp                          # Internet Gopher
gopher          70/udp
rje             77/tcp          netrjs
finger          79/tcp
www             80/tcp          http            # WorldWideWeb HTTP
www             80/udp                          # HyperText Transfer Protocol
link            87/tcp          ttylink
kerberos        88/tcp          kerberos5 krb5  # Kerberos v5
kerberos        88/udp          kerberos5 krb5  # Kerberos v5
supdup          95/tcp
# 100 - reserved
hostnames       101/tcp         hostname        # usually from sri-nic
iso-tsap        102/tcp         tsap            # part of ISODE.
csnet-ns        105/tcp         cso-ns          # also used by CSO name server
csnet-ns        105/udp         cso-ns
rtelnet         107/tcp                         # Remote Telnet
rtelnet         107/udp
pop-2           109/tcp         postoffice      # POP version 2
pop-2           109/udp
pop-3           110/tcp                         # POP version 3
pop-3           110/udp
sunrpc          111/tcp         portmapper      # RPC 4.0 portmapper TCP
sunrpc          111/udp         portmapper      # RPC 4.0 portmapper UDP
auth            113/tcp         authentication tap ident
sftp            115/tcp
uucp-path       117/tcp
nntp            119/tcp         readnews untp   # USENET News Transfer Protocol
ntp             123/tcp
ntp             123/udp                         # Network Time Protocol
netbios-ns      137/tcp                         # NETBIOS Name Service
netbios-ns      137/udp
netbios-dgm     138/tcp                         # NETBIOS Datagram Service
netbios-dgm     138/udp
netbios-ssn     139/tcp                         # NETBIOS session service
netbios-ssn     139/udp
imap2           143/tcp                         # Interim Mail Access Proto v2
imap2           143/udp
snmp            161/udp                         # Simple Net Mgmt Proto
snmp-trap       162/udp         snmptrap        # Traps for SNMP
cmip-man        163/tcp                         # ISO mgmt over IP (CMOT)
cmip-man        163/udp
cmip-agent      164/tcp
cmip-agent      164/udp
xdmcp           177/tcp                         # X Display Mgr. Control Proto
xdmcp           177/udp
nextstep        178/tcp         NeXTStep NextStep       # NeXTStep window
nextstep        178/udp         NeXTStep NextStep       # server
bgp             179/tcp                         # Border Gateway Proto.
bgp             179/udp
prospero        191/tcp                         # Cliff Neuman's Prospero
prospero        191/udp
irc             194/tcp                         # Internet Relay Chat
irc             194/udp
smux            199/tcp                         # SNMP Unix Multiplexer
smux            199/udp
at-rtmp         201/tcp                         # AppleTalk routing
at-rtmp         201/udp
at-nbp          202/tcp                         # AppleTalk name binding
at-nbp          202/udp
at-echo         204/tcp                         # AppleTalk echo
at-echo         204/udp
at-zis          206/tcp                         # AppleTalk zone information
at-zis          206/udp
z3950           210/tcp         wais            # NISO Z39.50 database
z3950           210/udp         wais
ipx             213/tcp                         # IPX
ipx             213/udp
imap3           220/tcp                         # Interactive Mail Access
imap3           220/udp                         # Protocol v3
ulistserv       372/tcp                         # UNIX Listserv
ulistserv       372/udp
#
# UNIX specific services
#
exec            512/tcp
biff            512/udp         comsat
login           513/tcp
who             513/udp         whod
shell           514/tcp         cmd             # no passwords used
syslog          514/udp
printer         515/tcp         spooler         # line printer spooler
talk            517/udp
ntalk           518/udp
route           520/udp         router routed   # RIP
timed           525/udp         timeserver
tempo           526/tcp         newdate
courier         530/tcp         rpc
conference      531/tcp         chat
netnews         532/tcp         readnews
netwall         533/udp                         # -for emergency broadcasts
uucp            540/tcp         uucpd           # uucp daemon
remotefs        556/tcp         rfs_server rfs  # Brunhoff remote filesystem
klogin          543/tcp                         # Kerberized `rlogin' (v5)
kshell          544/tcp         krcmd           # Kerberized `rsh' (v5)
kerberos-adm    749/tcp                         # Kerberos `kadmin' (v5)
#
webster         765/tcp                         # Network dictionary
webster         765/udp
#
# From ``Assigned Numbers'':
#
#> The Registered Ports are not controlled by the IANA and on most systems
#> can be used by ordinary user processes or programs executed by ordinary
#> users.
#
#> Ports are used in the TCP [45,106] to name the ends of logical
#> connections which carry long term conversations.  For the purpose of
#> providing services to unknown callers, a service contact port is
#> defined.  This list specifies the port used by the server process as its
#> contact port.  While the IANA can not control uses of these ports it
#> does register or list uses of these ports as a convenience to the
#> community.
#
ingreslock      1524/tcp
ingreslock      1524/udp
prospero-np     1525/tcp                # Prospero non-privileged
prospero-np     1525/udp
rfe             5002/tcp                # Radio Free Ethernet
rfe             5002/udp                # Actually uses UDP only
bbs             7000/tcp                # BBS service
#
#
# Kerberos (Project Athena/MIT) services
# Note that these are for Kerberos v4 and are unofficial.  Sites running
# v4 should uncomment these and comment out the v5 entries above.
#
kerberos4       750/udp         kdc     # Kerberos (server) udp
kerberos4       750/tcp         kdc     # Kerberos (server) tcp
kerberos_master 751/udp                 # Kerberos authentication
kerberos_master 751/tcp                 # Kerberos authentication
passwd_server   752/udp                 # Kerberos passwd server
krb_prop        754/tcp                 # Kerberos slave propagation
krbupdate       760/tcp         kreg    # Kerberos registration
kpasswd         761/tcp         kpwd    # Kerberos "passwd"
kpop            1109/tcp                # Pop with Kerberos
knetd           2053/tcp                # Kerberos de-multiplexor
zephyr-srv      2102/udp                # Zephyr server
zephyr-clt      2103/udp                # Zephyr serv-hm connection
zephyr-hm       2104/udp                # Zephyr hostmanager
eklogin         2105/tcp                # Kerberos encrypted rlogin
#
# Unofficial but necessary (for NetBSD) services
#
supfilesrv      871/tcp                 # SUP server
supfiledbg      1127/tcp                # SUP debugging
#
# Datagram Delivery Protocol services
#
rtmp            1/ddp                   # Routing Table Maintenance Protocol
nbp             2/ddp                   # Name Binding Protocol
echo            4/ddp                   # AppleTalk Echo Protocol
zip             6/ddp                   # Zone Information Protocol
#
# Debian GNU/Linux services
rmtcfg          1236/tcp                # Gracilis Packeten remote config server
xtel            1313/tcp                # french minitel
cfinger         2003/tcp                # GNU Finger
postgres        4321/tcp                # POSTGRES
mandelspawn     9359/udp        mandelbrot      # network mandelbrot

# Local services

在现实世界中,实际文件总是不断增长,因为新的服务正在被创建。如果您担心自己的副本不完整,我建议从最新的发行版中复制一个新的 /etc/services

/etc/inetd.conf

/etc/inetd.conf 文件是 inetd 服务器守护进程的配置文件。它的功能是告诉 inetd 当它收到特定服务的连接请求时该做什么。对于您希望接受连接的每个服务,您必须告诉 inetd 要运行哪个网络服务器守护进程以及如何运行它。

它的格式也相当简单。它是一个文本文件,每一行描述一个您希望提供的服务。一行中在 `#` 之后的所有文本都将被忽略并被视为注释。每行包含七个字段,字段之间用任意数量的空白字符(制表符或空格)分隔。一般格式如下:

  service  socket_type  proto  flags  user  server_path  server_args
  

服务

是从 /etc/services 文件中获取的与此配置相关的服务。

socket_type

此字段描述此条目将考虑相关的套接字类型,允许的值为:streamdgramrawrdmseqpacket。这在性质上有点技术性,但根据经验,几乎所有基于 tcp 的服务都使用 stream,几乎所有基于 udp 的服务都使用 dgram。只有非常特殊类型的服务器守护进程才会使用任何其他值。

proto

要为此条目考虑有效的协议。这应该与 /etc/services 文件中的相应条目匹配,通常是 tcpudp。基于 Sun RPC(远程过程调用)的服务器将使用 rpc/tcprpc/udp

flags

此字段实际上只有两个可能的设置。此字段设置告诉 inetd 网络服务器程序是否在启动后释放套接字,因此 inetd 是否可以在下一个连接请求时启动另一个套接字,或者 inetd 是否应该等待并假设任何已运行的服务器守护进程将处理新的连接请求。同样,这有点棘手,但根据经验,所有 tcp 服务器都应将此条目设置为 nowait,而大多数 udp 服务器都应将此条目设置为 wait。请注意,对此有一些明显的例外,因此如果不确定,请以示例为指导。

用户

此字段描述当网络守护进程启动时,将从 /etc/passwd 设置哪个用户帐户作为网络守护进程的所有者。如果您想防范安全风险,这通常很有用。您可以将条目的用户设置为 nobody 用户,以便如果网络服务器安全性被破坏,可能的损害将最小化。但是,通常此字段设置为 root,因为许多服务器需要 root 权限才能正常运行。

server_path

此字段是为此条目执行的实际服务器程序的路径名。

server_args

此字段包含行的其余部分,并且是可选的。此字段是您放置希望在启动服务器守护进程程序时传递给它的任何命令行参数的位置。

/etc/inetd.conf 示例

至于 /etc/services 文件,所有现代发行版都将包含一个良好的 /etc/inetd.conf 文件供您使用。为了完整起见,这里是 Debian 发行版中的 /etc/inetd.conf 文件。

# /etc/inetd.conf:  see inetd(8) for further informations.
#
# Internet server configuration database
#
#
# Modified for Debian by Peter Tobias <tobias@et-inf.fho-emden.de>
#
# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
#
# Internal services
#
#echo           stream  tcp     nowait  root    internal
#echo           dgram   udp     wait    root    internal
discard         stream  tcp     nowait  root    internal
discard         dgram   udp     wait    root    internal
daytime         stream  tcp     nowait  root    internal
daytime         dgram   udp     wait    root    internal
#chargen        stream  tcp     nowait  root    internal
#chargen        dgram   udp     wait    root    internal
time            stream  tcp     nowait  root    internal
time            dgram   udp     wait    root    internal
#
# These are standard services.
#
telnet  stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.telnetd
ftp     stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.ftpd
#fsp    dgram   udp     wait    root    /usr/sbin/tcpd  /usr/sbin/in.fspd
#
# Shell, login, exec and talk are BSD protocols.
#
shell   stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.rshd
login   stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.rlogind
#exec   stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.rexecd
talk    dgram   udp     wait    root    /usr/sbin/tcpd  /usr/sbin/in.talkd
ntalk   dgram   udp     wait    root    /usr/sbin/tcpd  /usr/sbin/in.ntalkd
#
# Mail, news and uucp services.
#
smtp    stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.smtpd  
#nntp   stream  tcp     nowait  news    /usr/sbin/tcpd  /usr/sbin/in.nntpd
#uucp   stream  tcp     nowait  uucp    /usr/sbin/tcpd  /usr/lib/uucp/uucico
#comsat dgram   udp     wait    root    /usr/sbin/tcpd  /usr/sbin/in.comsat
#
# Pop et al
#
#pop-2  stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.pop2d
#pop-3  stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.pop3d
#
# `cfinger' is for the GNU finger server available for Debian.  (NOTE: The
# current implementation of the `finger' daemon allows it to be run as `root'.)
#
#cfinger stream tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.cfingerd
#finger stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.fingerd
#netstat        stream  tcp     nowait  nobody  /usr/sbin/tcpd  /bin/netstat
#systat stream  tcp     nowait  nobody  /usr/sbin/tcpd  /bin/ps -auwwx
#
# Tftp service is provided primarily for booting.  Most sites
# run this only on machines acting as "boot servers."
#
#tftp   dgram   udp     wait    nobody  /usr/sbin/tcpd  /usr/sbin/in.tftpd
#tftp   dgram   udp     wait    nobody  /usr/sbin/tcpd  /usr/sbin/in.tftpd /boot
#bootps dgram   udp     wait    root    /usr/sbin/bootpd        bootpd -i -t 120
#
# Kerberos authenticated services (these probably need to be corrected)
#
#klogin         stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.rlogind -k
#eklogin        stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.rlogind -k -x
#kshell         stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/in.rshd -k
#
# Services run ONLY on the Kerberos server (these probably need to be corrected)
#
#krbupdate      stream tcp      nowait  root    /usr/sbin/tcpd  /usr/sbin/registerd
#kpasswd        stream  tcp     nowait  root    /usr/sbin/tcpd  /usr/sbin/kpasswdd
#
# RPC based services
#
#mountd/1       dgram   rpc/udp wait    root    /usr/sbin/tcpd  /usr/sbin/rpc.mountd
#rstatd/1-3     dgram   rpc/udp wait    root    /usr/sbin/tcpd  /usr/sbin/rpc.rstatd
#rusersd/2-3    dgram   rpc/udp wait    root    /usr/sbin/tcpd  /usr/sbin/rpc.rusersd
#walld/1        dgram   rpc/udp wait    root    /usr/sbin/tcpd  /usr/sbin/rpc.rwalld
#
# End of inetd.conf.
ident           stream  tcp     nowait  nobody  /usr/sbin/identd        identd -i

5.9 其他与网络相关的杂项配置文件。

在 Linux 下,您可能对一些与网络配置相关的杂项文件感兴趣。您可能永远不必修改这些文件,但值得描述它们,以便您了解它们包含什么以及它们的用途。

/etc/protocols

/etc/protocols 文件是一个数据库,它将协议 ID 号映射到协议名称。程序员使用它来允许他们在程序中按名称指定协议,并且一些程序(如 tcpdump)也使用它来允许他们在输出中显示名称而不是数字。该文件的一般语法是:

  protocolname  number  aliases
  

/etc/protocols 文件随 Debian 发行版一起提供,如下所示:

# /etc/protocols:
# $Id: NET3-4-HOWTO.sgml,v 1.2 2000/07/19 15:33:03 gferg dead $
#
# Internet (IP) protocols
#
#       from: @(#)protocols     5.1 (Berkeley) 4/17/89
#
# Updated for NetBSD based on RFC 1340, Assigned Numbers (July 1992).

ip      0       IP              # internet protocol, pseudo protocol number
icmp    1       ICMP            # internet control message protocol
igmp    2       IGMP            # Internet Group Management
ggp     3       GGP             # gateway-gateway protocol
ipencap 4       IP-ENCAP        # IP encapsulated in IP (officially ``IP'')
st      5       ST              # ST datagram mode
tcp     6       TCP             # transmission control protocol
egp     8       EGP             # exterior gateway protocol
pup     12      PUP             # PARC universal packet protocol
udp     17      UDP             # user datagram protocol
hmp     20      HMP             # host monitoring protocol
xns-idp 22      XNS-IDP         # Xerox NS IDP
rdp     27      RDP             # "reliable datagram" protocol
iso-tp4 29      ISO-TP4         # ISO Transport Protocol class 4
xtp     36      XTP             # Xpress Tranfer Protocol
ddp     37      DDP             # Datagram Delivery Protocol
idpr-cmtp       39      IDPR-CMTP       # IDPR Control Message Transport
rspf    73      RSPF            # Radio Shortest Path First.
vmtp    81      VMTP            # Versatile Message Transport
ospf    89      OSPFIGP         # Open Shortest Path First IGP
ipip    94      IPIP            # Yet Another IP encapsulation
encap   98      ENCAP           # Yet Another IP encapsulation

/etc/networks

/etc/networks 文件的功能与 /etc/hosts 文件类似。它提供了一个简单的网络名称与网络地址数据库。它的格式不同之处在于每行可能只有两个字段,并且字段编码为:

  networkname networkaddress
  
一个例子可能看起来像这样:
        loopnet    127.0.0.0
        localnet   192.168.0.0
        amprnet    44.0.0.0
        

当您使用像 route 命令这样的命令时,如果目的地是一个网络,并且该网络在 /etc/networks 文件中有一个条目,那么 route 命令将显示该网络名称而不是其地址。

5.10 网络安全和访问控制。

让我从警告您开始本节:保护您的机器和网络免受恶意攻击是一门复杂的艺术。我根本不认为自己是这个领域的专家,虽然我描述的以下机制会有所帮助,但如果您认真对待安全性,那么我建议您自己对该主题进行一些研究。互联网上有许多关于该主题的优秀参考资料,包括 Security-HOWTO

一个重要的经验法则是:`不要运行您不打算使用的服务器`。许多发行版都配置了各种服务并自动启动。为了确保即使是最低级别的安全性,您也应该浏览您的 /etc/inetd.conf 文件并注释掉(在行首放置一个 `#')您不打算使用的服务的任何条目。好的候选服务包括:shellloginexecuucpftp 和信息服务,如 fingernetstatsystat

存在各种安全和访问控制机制,我将描述其中最基本的机制。

/etc/ftpusers

/etc/ftpusers 文件是一个简单的机制,允许您拒绝某些用户通过 ftp 登录到您的机器。当接收到传入的 ftp 连接时,ftp 守护进程程序(ftpd)会读取 /etc/ftpusers 文件。该文件是简单列出不允许登录的用户的列表。它可能看起来像这样:

        # /etc/ftpusers - users not allowed to login via ftp
        root
        uucp
        bin
        mail
        

/etc/securetty

/etc/securetty 文件允许您指定允许 root 登录的 tty 设备。登录程序(通常是 /bin/login)会读取 /etc/securetty 文件。它的格式是允许的 tty 设备名称列表,在所有其他设备上,不允许 root 登录。

        # /etc/securetty - tty's on which root is allowed to login
        tty1
        tty2
        tty3
        tty4
        

tcpd 主机访问控制机制。

您将在同一个 /etc/inetd.conf 中看到的 tcpd 程序为其配置为保护的服务提供日志记录和访问控制机制。

当它被 inetd 程序调用时,它会读取两个包含访问规则的文件,并相应地允许或拒绝访问它正在保护的服务器。

它将搜索规则文件,直到找到第一个匹配项。如果找不到匹配项,则假定应该允许任何人访问。它按顺序搜索的文件是:/etc/hosts.allow/etc/hosts.deny。我将依次描述这些文件。有关此功能的完整描述,您应该参考相应的 man 页面(hosts_access(5) 是一个很好的起点)。

/etc/hosts.allow

/etc/hosts.allow 文件是 /usr/sbin/tcpd 程序的配置文件。hosts.allow 文件包含描述哪些主机被允许访问您机器上的服务的规则。

文件格式非常简单:

        # /etc/hosts.allow
        #
        # <service list>: <host list> [: command]
        

服务列表

是以逗号分隔的服务器名称列表,此规则适用于这些服务器名称。服务器名称示例包括:ftpdtelnetdfingerd

主机列表

是以逗号分隔的主机名列表。您也可以在此处使用 IP 地址。您还可以使用通配符指定主机名或地址,以匹配主机组。示例包括:gw.vk2ktj.ampr.org 以匹配特定主机,.uts.edu.au 以匹配任何以该字符串结尾的主机名,44. 以匹配任何以这些数字开头的 IP 地址。有一些特殊令牌可以简化配置,其中一些是:ALL 匹配每个主机,LOCAL 匹配任何名称不包含 `.` 的主机,即与您的机器在同一域中,PARANOID 匹配任何名称与其地址不匹配的主机(名称欺骗)。还有一个非常有用的最后一个令牌。EXCEPT 令牌允许您提供带有例外情况的列表。稍后将在示例中介绍这一点。

命令

是一个可选参数。此参数是每次匹配此规则时将执行的命令的完整路径名。例如,它可以运行一个命令,该命令将尝试识别谁登录到连接的主机,或生成邮件消息或一些其他警告给系统管理员,说明有人正在尝试连接。可以包含许多扩展,一些常见的示例是:%h 扩展为连接主机的名称或地址(如果它没有名称),%d 被调用的守护进程名称。

一个例子:

  # /etc/hosts.allow
  #
  # Allow mail to anyone
  in.smtpd: ALL
  # All telnet and ftp to only hosts within my domain and my host at home.
  telnetd, ftpd: LOCAL, myhost.athome.org.au
  # Allow finger to anyone but keep a record of who they are.
  fingerd: ALL: (finger @%h | mail -s "finger from %h" root)
  

/etc/hosts.deny

/etc/hosts.deny 文件是 /usr/sbin/tcpd 程序的配置文件。hosts.deny 文件包含描述哪些主机被禁止访问您机器上的服务的规则。

一个简单的示例可能看起来像这样:

  # /etc/hosts.deny
  #
  # Disallow all hosts with suspect hostnames
  ALL: PARANOID
  #
  # Disallow all hosts.
  ALL: ALL
  

PARANOID 条目实际上是多余的,因为在任何情况下,另一个条目都会捕获所有内容。根据您的具体要求,这两个条目中的任何一个都可以作为合理的默认值。

/etc/hosts.deny 中具有 ALL: ALL 默认值,然后在 /etc/hosts.allow 文件中专门启用您想要的服务和主机是最安全的配置。

/etc/hosts.equiv

hosts.equiv 文件用于授予某些主机和用户访问您机器上帐户的权限,而无需提供密码。这在您控制所有机器的安全环境中很有用,但在其他情况下是安全隐患。您的机器的安全性仅与最不安全的受信任主机一样安全。为了最大程度地提高安全性,请不要使用此机制,并鼓励您的用户也不要使用 .rhosts 文件。

正确配置您的 ftp 守护进程。

许多站点将对运行匿名 ftp 服务器感兴趣,以允许其他人上传和下载文件,而无需特定的用户 ID。如果您决定提供此功能,请确保为匿名访问正确配置 ftp 守护进程。大多数 ftpd(8)man 页面都详细描述了如何进行此操作。您应始终确保遵循这些说明。一个重要的提示是不要在匿名帐户 /etc 目录中使用 /etc/passwd 文件的副本,请确保删除除您必须拥有的帐户详细信息之外的所有帐户详细信息,否则您将容易受到暴力破解密码技术的攻击。

网络防火墙。

不允许数据报甚至到达您的机器或服务器是安全性的绝佳手段。这在 Firewall-HOWTO 中进行了深入介绍,并在本文档的后续章节中(更简洁地)进行了介绍。

其他建议。

以下是一些其他的,可能带有宗教色彩的建议供您考虑。

sendmail

尽管 sendmail 守护进程很受欢迎,但它经常出现在安全警告公告中,频率令人震惊。这取决于您,但我选择不运行它。

NFS 和其他 Sun RPC 服务

对这些保持警惕。这些服务存在各种可能的漏洞。很难找到像 NFS 这样的服务的替代方案,但是如果您配置它们,请确保小心您允许谁拥有挂载权限。


下一页 上一页 目录