查看文章 |
配置TCP/IP网络 proc文件系统 设置主机名 分配IP地址 IP的接口配置 以太网接口
2008-12-26 10:55
http://www.cn-doc.com/_soft_ect_doc/2005_08_19_00/20050819004313734.htm 本章所述的大多数工作通常你只需要做一次。而后,仅当你要向网络中增加新系统时,或者当你完全重新配置你的系统时,你才会接触许多配置文件。然而,有些用于配置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,从hostmaster@internic.net要一张网络地址申请表。 为了操作几个以太网(或其它网络,一旦有了驱动程序),你必须将你的网络分隔成子网。注意,只有当你有多个广播网络(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表示一个网络。
|
最近读者:

