Linux网络管理员手册(5)
翻译:赵炯
[email protected]
第五章 配置TCP/IP网络
在本章中,我们将讨论在机器上设置TCP/IP网络所要经历的所有步骤。我们将从IP地址的分配开始,逐步描述TCP/IP网络接口的配置过程,并且介绍几个在解决网络安装问题时非常有用的工具。
本章所述的大多数工作通常你只需要做一次。而后,仅当你要向网络中增加新系统时,或者当你完全重新配置你的系统时,你才会接触许多配置文件。然而,有些用于配置TCP/IP的命令必须在系统每次引导时都要执行之。这通常是通过在系统的/etc/rc脚本中调用它们来做的。
一般地,这个过程的网络专有部分包括在称为rc.net或rc.inet的脚本中。有时,你也会看到名为rc.inet1和rc.inet2的两个脚本文件,前一个用于初始化网络的核心部分,而后者启动基本的网络服务和应用程序。在本章下面,我将注重讨论后者的概念。
下面,我将讨论执行rc.inet1的作用结果,而应用程序将在后面章节中讨论。在读完本章以后,你将建立起在计算机上正确配置TCP/IP的一个命令顺序。然后,你应该替换计算机上rc.inet1里的任何例子命令、确信rc.inet1在系统引导时被执行,并重新引导你的机器。随着你中意的Linux版本而来的网络rc脚本会给你一个很好的例子。
5.1 安装proc文件系统
有些Net-2版本的配置工具要依赖proc文件系统来与内核进行通信。这是一个使用像文件系统似的机制以允许对内核运行时信息进行访问的接口。当加载时,你可以象使用任何其它文件系统一样地列出文件、或显示它们的内容。典型的项包括含有系统平均负载的loadavg文件、或显示当前核心内存以及交换使用情况的meminfo。
对于此,网络代码添加了net目录。它含有许多文件,这些文件显示象内核ARP表格、TCP连接状态,以及路由[选择]表。许多网络管理工具从这些文件中取得它们的信息。
Proc文件系统(或者也以procfs而著称)通常在系统引导时被加载到/proc目录上。最好的办法是将下面几行增加到/etc/fstab之中:
# procfs mont point:
none /proc proc defaults
并且从你的/etc/rc脚本中执行“mount /proc” 。
缺省地,现在procfs被配置进大多数的内核中。如果procfs不在你的内核中,你会得到象这样的消息:“mount: fs type procfs not supported by kernel”(“加载:内核不支持文件系统类型procfs”)。你就必须重新编译内核并且在问及procfs支持时回答“yes”。
5.2 安装执行文件
如果你正在使用一个打包之前的(未打包的)Linux发布版本,它将很可能包括主要的网络应用程序以及实用工具和附带的一组例子文件。你可能必须得到和安装新工具的唯一情况是当你安装了一个新的内核版本。由于它们有时在内核的网络层中含有更改的情况,你将需要更新基本配置工具。这起码包括重新编译,但有时也可能需要获得最新的执行文件组。这些通常和内核一起发行,以文档的形式打包并切称为net-XXX.tar.gz,这里XXX是版本号。与Linux 1.0相匹配的是0 .32b,在本书写作时的最新内核(1.1.12及以后)需要0.32d。
如果你想自己编译并且安装标准TCP/IP网络应用程序的话,你可以从许多Linux FTP服务器上获得原程序。这些是或多或少从Net-BSD或其它原程序经过大量修正的程序版本。其它的应用程序,比如Xmosaic、xarchie、或Gopher以及IRC客户程序必须分别地获得。其中大多数程序如果按照说明编译,则与盒装版本的一样。
官方的Net-3的FTP站点是sunacm.swan.ac.uk,镜象站点在sunsite.unc.edu下的system/Network/sunacm。最新的Net-2e补丁程序以及执行程序在ftp.aris.com。Matthias Urlichs的起源于BSD网络代码的程序在ftp.ira.uka.de.in /pub/system/linux/上有。
5.3 另一个例子
在本书的余下部分,让我介绍一个新的例子,这个例子要比Groucho Marx大学的例子简单,并且可能更加接近你实际要遇到的问题。考虑虚拟酿酒厂(Virtual Brewery),一个小型的酿造—正如名称指出的那样--虚拟啤酒的公司。为了更有效地管理好他们的生意,虚拟酿酒人想要将他们的计算机连网,这些正好都是运行bright and shiny 1.0(明亮与闪耀1.0)的PC机。
在同一楼层上恰好穿过大厅的地方,有一家工作与之相近的葡萄酿酒厂。他们有一个自己的以太网。很自然地,一旦他们的网络开始正常运作时,这两家公司就想将他们的网络连接起来。作为第一步,他们想要设置一台用于在这两个子网之间转发数据报的网关主机。接下来,他们也想有一个与外界世界联系的UUCP链接,通过这个连接,他们就能交换邮件和news了。最后,他们也希望安装一个SLIP连接以便有时能连接到Internet上。
5.4 设置主机名(hostname)
绝大多数情况下—如果不是全部的话,网络应用程序要依赖于合理地设置本地主机名。这通常是在引导过程通过执行hostname命令来完成的。如要将主机名设置成name的话,它的调用如
# hostname name
使用一个与任何域名都无关的任意的主机名也是常有的事。例如,虚拟酿酒厂的主机可能叫做vale.vbrew.com、vlager.vbrew.com等等。这些是它们正式的、全资域名。它们的本地主机名将是这个名字的第一部分,如vale。然而,由于本地主机名常常用来查找主机的IP地址,你就必须确信解析库能够查找到该主机的IP地址。这通常意味着你必须将这个名字写入/etc/hosts中(见下面)。
有些人建议使用domainname命令来设置内核意义上的域名为FQDN的余下部分。这样的话,你可以组合hostname和domainname的输出来再次得到FQDN。然而,这最多对了一半。Domainname一般用来设置主机的NIS域,这可能与你的主机所属的DNS域完全不同。NIS将在第十章中讨论。
5.5 分配IP地址
如果在你的主机上为单机操作配置连网软件(例如,为了能够运行INN网络新闻软件),你可以安全地跳过本节,因为你只需要为回送(loopback)接口分配一个接口,它总是127.0.0.1。
而对于象以太网那样的真实网络来说,事情就有一些复杂。如果你想将你的主机连接到一个现成的网络上,你就必须要求该网的管理员给你一个这个网络的IP地址。当整个网络都是由你自己来设定时,你就必须按如下描述自己来分配IP地址。
在一个本地网络内的主机通常应该有相同的逻辑IP网络地址。因此,你必须分配一个IP网络地址。如果你有几个物理网络,你或者必须给它们分配不同的网络号(网络地址),或者使用子网技术将你的IP地址范围分割成几个子网。
如果你的网络没有连接到Internet上,你可以自由地选择任何(合法的)网络地址。你只须确信选择了A类、B类或C类中的一种,否则的话事情可能会工作得不正常。然而,如果你打算近期连接Internet,你现在就得获取一个正式的(官方的)IP地址。进行的最佳方法是是请求你的网络服务提供商帮助你。如果你想获取一个网络地址只是因为万一某天你可能连上Internet,从[email protected]要一张网络地址申请表。
为了操作几个以太网(或其它网络,一旦有了驱动程序),你必须将你的网络分隔成子网。注意,只有当你有多个广播网络(broadcast network)时,你才需要应用子网技术;点对点的连接不算在内。例如,如果你有一个以太网,并且有一个或多个SLIP链接到外部世界,你无需分割你的网络。其理由将在第7章中给出。
作为一个例子,酿酒厂的网络管理人员向NIC申请了一个B类网络号,得到191.72.0.0。为适应两个以太网,她决定使用主机部分的8个比特作为额外的子网比特位。主机部分剩余的8个比特,允许每个子网有254台主机。然后,她将子网号1给了酿酒厂、子网号2给了葡萄酒厂。这样他们的网络地址分别为191.72.1.0和191.72.2.0。子网掩码是255.255.255.0。
在两个网络之间的网关vlager,在它们两边都分配给它主机号1,这分别给了它IP地址191.72.1.1和191.72.2.1。图5.1 示出了这两个子网和网关。
注意,在这个例子中,我使用了一个B类网络来使得事情简单化;而一个C类网络将更现实些。有了新的网络代码,子网的分割并不限于字节边界,所以,即使是一个C类网络也可以分割成几个子网。例如,你可以使用2比特的主机部分作为网络掩码,就可得到四个可能的子网,每个子网可以有64台主机。[1]
5.6 编写hosts和networks文件
在把你的网络分成子网以后,你应该使用/etc/hosts文件为某些简单的主机名解析作些准备。如果你不打算使用DNS或NIS来作地址解析,你就必须将所有的主机名写入hosts文件中。
图5.1 虚拟酿酒厂和虚拟葡萄酒厂—两个子网。
即使你在正常操作期间想运行DNS或NIS,你仍然会将一些主机名写入/etc/hosts文件中。一个原因是,即使没有网络接口正在运行,你还是会想有一些名字解析功能,例如,在系统引导期间。这不但是为了方便,而且也允许你在rc.inet脚本中使用符号主机名。这样,当更改IP地址时,你只需将更新过的hosts文件拷贝到所有机器上并且重新启动机器即可。而无需去分别编辑大量的rc文件。通常,你应该将所有本地主机名和地址放入hosts,加入用到的任何网关和NIS服务器的名称和地址。[2]
同样,在最初的测试阶段,你应该确信你的解析器只使用到hosts文件中的信息。你的DNS或NIS软件可能附带有样本文件,当使用这些文件时就可能产生奇怪的结果。为了让所有的应用程序在查找一个主机的IP地址时只使用/etc/hosts文件,你必须编辑/etc/host.conf文件。用井字符注释掉以关键字order开始的所有行,并插入一行
order hosts
解析器库的配置将在第六章中详细讨论。
Hosts文件中每一行包含一项,每项由一个IP地址、一个主机名、和任选的该主机的一个别名列表组成。各个域用空格或制表符分开,并且地址域必须从第一列开始。任何以井字符开始的行都看作是注释行,被忽略掉。
主机名可以是全资的、或者是与本地域相关的。对与vale来说,你通常可以往hosts文件中输入全资名vale.vbrew.com,以及vale名本身,这样该主机就有正式名和短小的本地名两个名字了。
这是虚拟酿酒厂的hosts文件样式的一个例子。其中包括了两个特别的名字,vlager-if1和vlager-if2,它给出了vlager所用的两个接口的地址。
#
# Hosts file for Virtual Brewery/Virtual Winery
#
# IP local fully qualified domain name
#
127.0.0.1 localhost
#
191.72.1.1 vlager vlager.vbrew.com
191.72.1.1 vlager-if1
191.72.1.2 vstout vstout.vbrew.com
191.72.1.3 vale vale.vbrew.com
#
191.72.2.1 vlager-if2
191.72.2.2 vbeaujolais vbeaujolais.vbrew.com
191.72.2.3 vbardolino vbardolino.vbrew.com
191.72.2.4 vchianti vchianti.vbrew.com
正如对待主机的IP地址一样,有时对于网络号你也可能想使用一个符号名称。因此,hosts文件有一个相伴的称为/etc/networks的文件,用于映射网络名到网络号以及反之。在虚拟酿酒厂,我们可以安装一个象下面的networks文件:[3]
# /etc/networks for the Virtual Brewery
brew-net 191.72.1.0
wine-net 191.72.2.0
5.7 IP的接口配置
在如前章里解释那样设置好你的硬件以后,你必须让内核的网络软件知道这些设备。有几个命令是用于配置网络接口和初始化路由选择表的。这些任务通常是在系统每次启动引导时由rc.inet1脚本来做的。做这些任务的基本工具称为ifconfig(这里“if”表示接口的意思interface),和route。
Ifconfig用于使得一个接口能够被内核的网络层访问。这包括IP地址的分配和其它参数的指派、激活接口—也以“起用”(“taking up”)而知名。这里激活表示内核将通过接口发送和接收IP数据报。调用它的最简单的办法是
ifconfig interface ip-address
它分配IP地址ip-address给接口interface并激活它。所有其它的参数都设置成缺省值。例如,缺省的子网掩码是从IP地址的网络类型中获得的,如255.255.0.0是B类地址的掩码。Ifconfig将在本章末给予详细的讨论。
Route允许你对内核的路由表进行增加或删除路由的操作。它可以象这样调用
route [add|del] target
这里add和dell是决定增加还是删除到目的(target)网络或主机的路由。
5.7.1 回送(loopback)接口
最早被激活的接口是回送接口(loopback interface):
# ifconfig lo 127.0.0.1
有时,你也会看到使用伪主机名localhost替代IP地址的用法。Ifconfig将在hosts文件中查找这个名字,在hosts文件中应该有一项申明localhost是127.0.0.1的主机名:
# Sample /etc/hosts entry for localhost
localhost 127.0.0.1
要查看一个接口的配置,你要用接口名作为参数调用ifconfig:
$ ifconfig lo
lo Link encap Local Loopback
inet addr 127.0.0.1 Bcast [NONE SET] Mask 255.0.0.0
UP BROADCAST LOOPBACK RUNNING MTU 2000 Metric 1
RX packets 0 errors 0 dropped 0 overrun 0
TX packets 0 errors 0 dropped 0 overrun 0
如你所见,lookback接口被赋予255.0.0.0掩码,这是因为127.0.0.1是一个A类地址。该地址没有一个广播地址集,但这在loopback中并没有什么用。然而,如果你在主机上运行了rwhod后台服务程序的话,你就必须设置loopback设备的广播地址,以便rwho能够正确地运行。如何设置广播地址会在下面的“关于ifconfig”一节中描述。
现在,你几乎可以启动运行你的米你-“网络”了。最后所缺的是路由选择表里的一项,该项将告诉IP,它可以使用这个接口作为到达目的127.0.0.1的路由。这是通过键入下面的命令来完成的
# route add 127.0.0.1
再次,你可以使用localhost来代替这个IP地址。
接下来,你要检查是否每样事情正常工作着,例如通过使用ping来检查。ping是声纳设备的网络等价物[4] 用于验证一个给定的地址是否真正能达到,并且测量发送一个数据报到给定地址然后返回到主机的延迟时间。所需的时间常称为来回程时间。
# ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp seq=0 ttl=32 time=1 ms
64 bytes from 127.0.0.1: icmp seq=1 ttl=32 time=0 ms
64 bytes from 127.0.0.1: icmp seq=2 ttl=32 time=0 ms
^C
--- localhost ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0/0/1 ms
当如上调用ping时,它将继续不停地发送信息包,除非被用户中断掉。上面的^C标记出我们按Ctrl-C的地方。
上面这个例子显示出127.0.0.1的信息包正确地发送了出去并且一个应答几乎是瞬时就返回到ping的。这表示你已经成功地设置好第一个网络接口。
如果你从ping得到的输出信息与不象上面所示的,你就碰到问题了。查看出错信息看看是否它指出了某些文件没有正确地被安装。查看你所使用的ifconfig和route执行文件是否与你运行的内核版本兼容,并且,最重要的是检查所编译的内核是网络使能的(激活的)(你可以从是否存在/proc/net目录看出)。如果你得到出错信息说“网络不可达,”那么你很可能用错了route命令。请确信你使用了与给ifconfig相同的地址。
上面所描述的步骤对于在单机上使用网络应用程序来说已足够了。在将上面的几行添加到rc.inet1并确信这两个rc.inet脚本都已在/etc/rc中执行以后,你可以重新引导你的机器并且试验各种应用程序。例如,“telnet localhost”将会建立一个到你主机的telnet连接,给你一个登录提示画面。
然而,loopback接口是有用的,不仅是在网络书本中作为一个例子,或作为开发期间的一个测试台,而且实际上在正常操作时也被用于某些应用程序。[5] 因此,不管你的机器是否连接到一个网络上,你总是必须要配置它的。
5.7.2 以太网接口
配置一个以太网接口与配置loopback接口非常相象。它只是在你使用子网技术时需要稍多的参数。
在虚拟酿酒厂,我们已经将IP网络分割成了C类子网,这个IP网络原是一个B类网络。为了使得接口能够识别这个变化,ifconfig的参数应该看上去象这样:
# ifconfig eth0 vstout netmask 255.255.255.0
它将vstout(191.72.1.2)IP地址分配给了eth0接口。如果我们已经省略了网络掩码,那么ifconfig将推论出该IP地址类的掩码来,它将会已有255.255.0.0这样的网络掩码。现在,一个快速查看显示出:
# ifconfig eth0
eth0 Link encap 10Mps Ethernet HWaddr 00:00:C0:90:B3:42
inet addr 191.72.1.2 Bcast 191.72.1.255 Mask 255.255.255.0
UP BROADCAST RUNNING MTU 1500 Metric 1
RX packets 0 errors 0 dropped 0 overrun 0
TX packets 0 errors 0 dropped 0 overrun 0
你可以看出,ifconfig自动地将广播地址(上面的Bcast域)设置成常用的值,即将主机的网络号的主机部分的所有比特位置为1。同样,消息传输单元(message transfer unit)(内核为该接口生成的最大以太网帧的大小)已被设置成最大值1500字节。所有这些值都可以用特定的选项覆盖掉,这将在下面讨论之。
同loopback的情况非常相似,你现在必须安装一个路由选择项,它会通知内核有关通过eth0能够到达的网络。对于虚拟酿酒厂来说,你应该按如下调用route
# route add –net 191.72.1.0
起先,这看上去有点象变魔术,因为并不清楚route是如何探测到要通过哪个接口进行路由。然而,窍门是很简单的:内核检测已配置的所有接口并且将目的地址(此时为192.72.1.0)与接口地址的网络部分相比较(也即将接口地址和网络掩码进行逐位与)。只有eth0接口与之匹配。
现在,-net选项是干什么用的呢?使用这个选项是因为route既可以处理路由到网络也可以处理路由到单机的情况(正如上面你已看到有关localhost的情况)。当给出的地址是用点分四组表示法表示时,route通过查看主机部分比特位来试图猜测它是个网络号还是个主机地址。如果地址的主机部分是零的话,route假定它表示一个网络,否则的话route把它当作一个主机地址。因此,route会认为192.72.1.0是一个主机地址而不是一个网络号,因为它并不知道我们使用了子网技术。因此,我们必须给出-net标志,明确地告之route它代表一个网络。
当然,上面的route命令键入时很冗长,并且很容易输错。一个更简便的方法是使用我们已经在/dev/networks中定义的网络名字。这使得这个命令非常易读;而且也可以将-net标志省略掉了,因为route现在知道191.72.1.0表示一个网络。
# route add brew-net
现在既然我们已经完成了基本的配置步骤,我们要确信该以太网接口确实能正常运行。从你的以太网络上任选一台主机,例如vlager,并键入
# ping vlager
PING vlager: 64 byte packets
64 bytes from 191.72.1.1: icmp seq=0. time=11. ms
64 bytes from 191.72.1.1: icmp seq=1. time=7. ms
64 bytes from 191.72.1.1: icmp seq=2. time=12. ms
64 bytes from 191.72.1.1: icmp seq=3. time=3. ms
^C
----vstout.vbrew.com PING Statistics----
4 packets transmitted, 4 packets received, 0% packet loss
round-trip (ms) min/avg/max = 3/8/12
如果你看不到任何象这样的输出,那么,很明显有地方出了问题。如果你碰到不正常的包丢失速率,这意味着是个硬件问题,如坏的或丢失了终端头等等。如果你一点也没收到任何信息包,你应该用netstat来检查接口配置。Ifconfig的信息包统计信息会告诉你接口是否发送了任何信息包。如果你也可以访问那台远程的主机,你也应该过去检查它的接口的统计信息。用这种方法,你就可以正确地确定这些信息包是在哪丢失的。另外,你应该用route显示选路(路由选择)信息,来看看两台主机的路由项目是否正确。当不使用任何参数调用route时,会打印出整个内核选路表(-n选项只是使得它用点分四组表示法打印出地址来,而不是用主机名):
# route -n
Kernel routing table
Destination Gateway Genmask Flags Metric Ref Use
127.0.0.1 * 255.255.255.255 UH 1 0
191.72.1.0 * 255.255.255.0 U 1 0
这些域的详细含义将在下面的“使用netstat检查”一节中给出。Flag列包含每个接口标志的一个列表。U对于活动的接口总是置位的,H是指目的地址表示一台主机。如果H标志是为一个作为网络路由器的路由器置位的,那么你就必须为route命令指定-net选项。为了测试你加入的一个路由器是否被使用,检查倒数第二列中的Use域在ping的对话期间会增加。
5.7.3 通过网关进行路由
在前一节中,我只描述了在单个以太网上设置一台主机的情况。然而经常性地,一个人会遇到网络通过网关连接到另一个网络的情况。这些网关可能只是简单地连接两个或多个以太网络,但也可能提供到外部世界的Internet连接。为了使用一个网关的服务,你必须在网络层提供额外的选路信息。
例如,虚拟酿酒厂和虚拟葡萄酒厂的以太网络是通过这样的一个网关,也即主机vlager,连在一起的。假设vlager早已被配置好,我们只需在vstout的选路表中添加另一个项,这个项告诉内核,它可以通过vlager到达葡萄酒厂网络上的所有主机。适当的route“咒语”显示如下;关键字gw告诉route下一个参数表示一个网关。
# route add wine-net gw vlager
当然,你所希望对话的葡萄酒厂网络上的任何主机必须有一个酿酒厂网络的相应选路项,否则的话,你将只能将数据从vstout发送到vbardolino,但后者的任何响应都将丢失(go into the great bit bucket)。
这个例子只描述了一个网关,它在两个隔离的以太网之间交换信息包。现在假设,vlager也有一个到Internet的连接(例如,通过一个另外的SLIP连接)。那么我们希望除了到达酿酒厂的数据报,到达任何其他网络的数据报都将交由vlager处理。这可以通过使vlager成为vstout缺省的路由器来做到。
# route add default gw vlager
网络名default是0.0.0.0的缩写,它表示缺省路由器。你无需把这个名字添加到/etc/networks中,因为它内建于route中。
当你ping一台隔着一个或几个网关的主机时看到很高的包丢失率,这可能意味着网络很拥挤。包丢失并不主要是技术上不足的原因,如由于转发主机暂时的超负荷运行,使得它们延迟甚至丢失了输入的数据报。
5.7.4 配置网关
配置一台机器使其在两个以太网之间交换信息包是非常直接明了的。假设我们回到vlager上,它配备了两块以太网卡,每块网卡连接一个网络。全部你所要做的是分别配置这两个接口,给它们各自的IP地址,并且就这些了!
将两个接口的信息按如下方式添加到hosts文件中是非常有用的,我们也有唾手可得的名字:
191.72.1.1 vlager vlager.vbrew.com
191.72.1.1 vlager-if1
191.72.2.1 vlager-if2
设置这两个接口的命令序列也就成为:
# ifconfig eth0 vlager-if1
# ifconfig eth1 vlager-if2
# route add brew-net
# route add wine-net
5.7.5 PLIP接口
当使用PLIP链接来连接两台机器时,事情就与使用以太网的稍微有些不同。前者是所谓的点对点的链接,因为相对于通信网络来说,它们只包括两台主机(“点”)。
作为一个例子,我们考虑虚拟酿酒厂的某个员工的膝上型电脑(笔记本电脑),它通过PLIP与vlager连接。笔记本电脑本身叫做vlite,并且只有一个并行端口。在引导期间,这个端口将被注册为plip1。为了激活这个连接,你必须使用下列命令配置这个plip1接口:[6]
# ifconfig plip1 vlite pointopoint vlager
# route add default gw vlager
第一个命令配置这个接口,告诉内核这是个点对点的链接,远端一边的地址是vlager。第二个命令安装缺省路由器,vlager用作网关。在vlager上,需用一个类似的ifconfig命令来激活连接(路由器启用是不需的):
# ifconfig plip1 vlager pointopoint vlite
这里有趣的一点是vlager上的plip1接口不需要有一个独立的IP地址,而同样是地址192.72.1.1。[7]
现在,我们已经配置好了从笔记本电脑到酿酒厂网络的路由;还缺的是酿酒厂的任何主机到vlite的路由的方法。一个特别笨的方法是在指定vlager为网关的各个主机的选路表中增加一特别的到vlite的路由项。
# route add vlite gw vlager
在面对临时路由的一个更好的选择是使用动态路由。这样做的一个方法是使用gated,一个路由后台服务程序,它需要你安装在网络上的每台主机上来动态地发布选路信息。然而,最简单的方法是使用代理(proxy)ARP(地址解析协议),使用代理ARP,vlager将通过发出自己的以太网地址来响应任何对vlite的ARP请求。这个的作用是所有到vlite的信息包都送至vlager,然后vlager将信息包转发到笔记本电脑。我们将在“检查ARP表”一节中再讨论代理ARP。
以后发行的Net-3将包含一个称为plipconfig的工具,它允许你设置所使用的打印机端口的IRQ。今后,这将由更通用的ifconfig命令来代替。
5.7.6 SLIP和PPP接口
尽管SLIP和PPP链接只是简单的象PLIP一样的点对点连接,但对它们有很多要讨论的。通常,建立一个SLIP连接包括通过modem拨号到远程站点,并设置串行线路成SLIP模式。PPP使用同样的方式。设置SLIP或PPP所需的工具将在第七章和第八章中描述。
5.7.7 哑(Dummy)接口
哑接口实在是有一些特殊的,但却是非常有用的。它的主要好处是,对于独立的主机以及那些仅有的IP网络连接是通过拨号连接才有的机器。实际上,后者在大多数时间也是一台独立的主机。
令独立主机进退维谷的是它们只有一个网络设备是激活的,即回送(loopback)接口,该接口通常分配了地址127.0.0.1。然而在某些情况下,你需要将数据发送到“正式的”的本地主机IP地址上去。例如,考虑笔记本电脑vlite,假设此时它没有连接任何的网络。Vlite上的一个应用程序现在可能需要发送一些数据到同一个主机的另一个应用程序中。在/etc/hosts中查看vlite,找到它的IP地址是191.72.1.65,所以这个应用程序试图往这个地址发送数据。由于回送接口是该机器上目前唯一活动的接口,所以内核就根本不知道该地址实际上就是自己的!作为结果,内核就会丢弃这个数据报,并且给应用程序返回一个出错信息。
这里就是哑设备需要起作用的地方。它通过简单地作为回送接口的一个密友来解决这个难题。对于vlite的情况,你只须简单地给它地址191.72.1.65并且加入一个指向它的主机路由。此时,到191.72.1.65的每个数据报都将在本地投递了。正确的调用是:
# ifconfig dummy vlite
# route add vlite
5.8 关于ifconfig
ifconfig还有比我们在上面所讨论的更多的参数。它通常的调用是:
ifconfig interface [[-net|-host] address [parameters]]
interface是接口名字,address是分配给该接口的IP地址。它可以是一个点分四组表示的IP地址;或者是一个ifconfig可以在/etc/hosts和/etc/networks中查到的名字。-net和-host选项分别迫使ifconfig将地址作为网络号或主机地址来对待。
如果ifconfig只带一个接口名来调用,它就显示出该接口的配置。当不待任何参数来调用,它就显示你目前已设置的所有接口的配置;-a选项迫使ifconfig同时也显示不活动的接口。对以太网接口eth0的一个调用样本可能看上去象这样:
# ifconfig eth0
eth0 Link encap 10Mbps Ethernet HWaddr 00:00:C0:90:B3:42
inet addr 191.72.1.2 Bcast 191.72.1.255 Mask 255.255.255.0
UP BROADCAST RUNNING MTU 1500 Metric 0
RX packets 3136 errors 217 dropped 7 overrun 26
TX packets 1752 errors 25 dropped 0 overrun 0
MTU和度量域显示出该接口的当前MTU和度量值。传统上,度量值被用于某些操作系统计算路由的代价。Linux还没有使用这个值,但为了兼容性而定义了它。
RX和TX行显示出有多少个包已被无错地接收和发送了、发生了多少个错误、有多少个包丢失了(通常是由于内存不足)、有多少个包由于超限而丢失了。接收器超限发生通常是由于到来的包的速率快于内核可以对最后一个中断的响应。Ifconfig所打印出的标志值或多或少与它的命令行选项的名字相对应;它们将在下面给出解释。
下面是ifconfig所能识别的参数的一个列表,相应的标志名在括号中给出。简单地打开一个特性的选项同样也能在该选项的前面加上一短划(-)再来关闭这个特性。
Up
这标记一个接口为“up”,也即可以访问IP层。在命令行上给出地址时,就隐含了该选项。它也可以用于重新使能被down选项临时关闭的接口。(这个选项与标志UP RUNNING相对应。)
down
这标记一个接口为“down”,也即不可以访问IP层。这有效地禁止了通过该接口的任何通信。注意,这并不删除自动使用该接口的所有选路项。如果你要永远地停掉该接口,你应该删除这些路由项并且提供可能的其它选路信息。
Netmask mask
这指派了用于该接口的一个子网掩码。它可以以一个前面加有0x的十六进制的32比特数给出,或以点分四组十进制数给出。
Pointopoint
这个选项只用于包含两台主机的点对点IP链接。例如,这个选项需要被用于SLIP或PLIP接口的配置。(如果设置了一个点对点的地址,ifconfig会显示POINTOPOINT标志。)
broadcast address
广播地址通常是通过将网络号的主机部分所有比特位置位产生的。有些IP实现使用一个不同的方案;这个选项是用于适应那些特殊的环境。(如果设置了一个广播地址,ifconfig就显示一个BROADCAST标志。)
metric number
这个选项可用于为一个接口建立的选路表项分配一个度量值。这个度量用于路由信息协议(Routing Information Protocol RIP)为网络建立选路表。[8] ifconfig所用的缺省的度量值是零。如果你没有运行一个RIP后台程序,你一点也不需要这个选项;如果你用了,你也很少需要改变度量的值。
Mtu bytes
这设置最大传输单元(Maximum Transmission Unit),这是接口能够在一次传输中处理的最大8比特组的数目。对于以太网,MTU的缺省值是1500;对于SLIP接口,它是296。
arp
这个选项特别用于象以太网或无线电包的广播型网络的。它启动ARP的使用,地址解析协议,来侦测连接到网络上的主机的物理地址。对于广播型网络,它总是缺省启用的。
-arp
在这个接口上禁止ARP的使用。
Promisc
将接口置为混合模式。在一个广播型网络上,这使得该接口接收所有的包,而不管它们是否是到达其它主机的信息包。这使得可以使用包过滤器等来分析网络交通流量,也称为以太网侦听。通常,这是查出用其它方法难以克服的网络问题的一个很好的技术。而另一方面,这也使得攻击者从你的网络流量中得到密码并且做其它肮脏的事。针对这类攻击的一个保护措施是不要让任何人可以随便将他们的计算机插入你的以太网中。另一个选择是使用安全认证协议(secure authentication protocols),如Kerberos、或SRA登录组件。[9] (这个选项与标志PROMISC相对应。)
-promisc
禁止混合模式。
Allmulti
组播[多址通信,多点传送]地址是对无需在一个子网上的的一组主机的广播。目前,内核不支持组播地址。(这个选项对应于标志ALLMULTI。)
-allmulti
禁止组播地址。
5.9 使用netstat检查
下面,我们转过来讨论一个对检查网络配置和行为很有用的工具。它称为netstat并且实际上是几个工具的汇总。我们将在下面几节中讨论它的每一个功能。
5.9.1 显示路由选择表
当使用-r标志调用netstat时,它以我们在上面已经用route做过的方式显示内核选路表。在vstout,它产生:
# netstat -nr
Kernel routing table
Destination Gateway Genmask Flags Metric Ref Use
127.0.0.1 * 255.255.255.255 UH 1 0
191.72.1.0 * 255.255.255.0 U 1 0
191.72.2.0 191.72.1.1 255.255.255.0 UGN 1 0
-n选项使得netstat以点分四组IP数的方式打印出地址,而不是用主机名或网络名。当你想避免在网络上查找地址时这是特别有用的(例如,对于一个DNS或NIS服务器)。
Netstat输出的第二列示出了选路选项指向的网关。如果没用到网关,就只打印一个星号。列三显示出路由的“一般性”。当给定一个IP地址而要找出适当的路由,内核查询选路表的所有项,在与路由的目的地址比较之前将该地址与genmask进行位与(bitwise AND)。
第四列显示了描述路由的各种标志:
G 路由使用了网关。
U 所用的接口已启动。
II 通过路由只能到达单个主机,例如,loopback项127.0.0.1就是这种情况。
D 如果该表项是由一个ICMP重定向消息产生的,就设置该标志(见2.5节)。
M 如果该表项被一个ICMP重定向消息修改过,就设置该标志。
Netstat输出的Ref列显示了对这个路由的参考数,也即,有多少个其它的路由(例如,通过网关)依赖于这个路由的存在。最后两列显示出了选路表项已被使用的次数,以及数据报通过其分发的接口。
5.9.2 显示接口统计信息
当带-I标志调用时,netstat将显示当前配置的网络接口的统计信息。如果再另加上一个-a标志,它将打印出内核中存在的所有接口,不仅是那些目前已经配置了的。在vstout上,netstat的输出看上去象这样:
$ netstat -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flags
lo 0 0 3185 0 0 0 3185 0 0 0 BLRU
eth0 1500 0 972633 17 20 120 628711 217 0 0 BRU
MTU和Met域那个接口的当前MTU和度量值。RX和TX列显示有多少信息包是无错接收和发送的(RX-OK/TX-OK)、出错的(RX-ERR/TX-ERR)、丢失了多少包(RX-DRP/TX-DRP)、以及有多少包是由于超限而丢失的(RX-OVR/TX-OVR)。
最后一列显示出该接口被设置的标志。这些是当你用ifconfig显示接口配置的长标志名字的一字符版本。
B
一个广播地址已被设置。
L
这个接口是一个回送(loopback)接口。
M
所有的包都将被接收(混合模式)。
N
避免包尾。
O
对于该接口,ARP被禁止。
P
这是一个点对点连接。
R
接口正在运行。
U
接口被起用。
5.9.3 显示连接状态
netstat支持一组选项来显示主动的或被动的套接字。选项-t、-u、-w和-x显示主动的TCP、UDP、RAW或UNIX套接字连接。如果你另外增加-a标志,那么,等待连接的(例如,正在倾听的)套接字也被显示出来了。这将给出你的系统上目前运行着的所有服务器的一张列表。
在vlager上调用netstat –ta产生:
$ netstat -ta
Active Internet connections
Proto Recv-Q Send-Q Local Address Foreign Address (State)
tcp 0 0 *:domain *:* LISTEN
tcp 0 0 *:time *:* LISTEN
tcp 0 0 *:smtp *:* LISTEN
tcp 0 0 vlager:smtp vstout:1040 ESTABLISHED
tcp 0 0 *:telnet *:* LISTEN
tcp 0 0 localhost:1046 vbardolino:telnet ESTABLISHED
tcp 0 0 *:chargen *:* LISTEN
tcp 0 0 *:daytime *:* LISTEN
tcp 0 0 *:discard *:* LISTEN
tcp 0 0 *:echo *:* LISTEN
tcp 0 0 *:shell *:* LISTEN
tcp 0 0 *:login *:* LISTEN
这显示出大多数的服务器只是简单地在等待输入连接。然而,第四行显示从vstout来的一个SMTP连接,第六行告知你有一个输出的到vbardolino的telnet连接。[10]
使用-a标志将显示出各类的所有套接字。
5.10 检查ARP表
在某些情况下,观察甚至改动内核的ARP表的内容是很有用的,例如,当你怀疑重复使用的Internet地址是某些间歇性的网络问题的原因时。arp工具就是为此类事情而编制的。它的命令行选项是
arp [-v] [-t hwtype] -a [hostname]
arp [-v] [-t hwtype] -s hostname hwaddr
arp [-v] -d hostname [hostname...]
所有的hostname参数可以是符号主机名或是以点分四组表示的IP地址。
第一个调用显示指定IP地址或主机的ARP项,或者如果没有给出hostname时显示所有已知的主机的ARP项。例如,在vlager上执行arp会产生
# arp -a
IP address HW type HW address
191.72.1.3 10Mbps Ethernet 00:00:C0:5A:42:C1
191.72.1.2 10Mbps Ethernet 00:00:C0:90:B3:42
191.72.2.4 10Mbps Ethernet 00:00:C0:04:69:AA
它显示出了vlager、vstout和vale的以太网地址。
使用-t选项你可以限制显示信息为指定的硬件类型的。这可以是ether、ax25、或者是pronet,分别表示10Mbps的以太网、AMPR-AX.25、和IEEE-802.5令牌环网。
-s选项用于永久性地将hostname的以太网地址加入到ARP表中。Hwaddr参数指定硬件地址,它缺省地指的是以太网地址、由冒号分隔的六个十六进制字节指定。使用-t选项,你也可以为其它类型硬件设置硬件地址。
有一个问题,它可能需要你手工地将一个IP地址加入到ARP表中,是当由于某些原因对远端主机的ARP请求失败了的时候,例如当它的ARP驱动程序有错或网络上有另外一台主机错误地使用了那个主机的IP地址。ARP表中硬配置的IP地址也是一个(非常强烈的)方法来保护你自己免受你的以太网上其它主机冒充别人的主机。
使用-d开关调用arp将删除与给定主机相关的所有ARP项。这可以用于迫使该接口重新尝试获处理中的IP地址的以太网地址。这在当错误配置的系统已经广播了错误的ARP信息时很有用(当然,你要首先重新配置这个出错的主机)。
选项-s也可以用于实现代理(proxy)ARP。这是一个特殊的技术,这里一个主机,比如说gate,通过假装这两个地址引用同一台主机gate,而为另一台名为fnord的主机担当一个网关。它是通过公布一个指向自己(gate)以太网接口的fnord的ARP项。现在,当一台主机发出一个对fnord的ARP请求时,gate将返回一个包含自己以太网地址的响应。此时,发出请求的主机将会送出所有的数据报到gate,gate将有责任地转发这些数据报到fnord。
这些带拐弯的处理有时是需要的,例如,当你想从一个不能很好地理解路由的TCP实现的DOS机器上访问fnord时。当你使用代理ARP时,对于DOS机器看来,fnord好象救灾本地子网上,所以它就不需要知道如何路由通过一个网关了。
代理ARP的另一个非常有用的应用是,当你的主机之一对于某些主机只是临时充当一个网关时,例如,通过一个拨号链接。在前一个例子当中,我们已经遇到了偶尔通过PLIP�发布人:netbull 来自:Linux自由鸽