第17章 高级网络
17.1 概要
这章将介绍在UNIX系统上经常使用的网络服务。我们将介绍如何定义、安装、测试和维护所有的FreeBSD网络服务。另外,还有很多参考例子可以让你更好地掌握这章的内容。
读完这章,你将了解到这些:
网关和路由的基础知识。
如何将FreeBSD设置成一个网桥。
如何安装一个网络文件系统。
如何从一个无盘机器上启动来设置网络。
如何设置一个用来共享用户帐号的网络信息服务器。
如何使用DHCP来自动设置网络。
如何设置一个域名服务器。
如何同步时间和日期,和用NTP协议设置一个时间服务器。
如何设置网络地址转换(NAT)。
如何管理inetd守护程序。
阅读这章之前,你应当了解:
理解/etc/rc脚本的基础知识。
熟悉基本的网络术语。
17.2 网关与路由
为了让一台计算机能找到另一台计算机,需要有一种机制来描述两台计算机之间如何通信,这个机制就是路由(routing)。一个路由(route)是由一对地址所定义的:一个目标以及一个网关(gateway)。这对地址表示要送到目标的数据包,必须经过网关。目标分为三种类型:主机、子网络(subnet)和默认路由 (default route)。如果没有其他的路由可以使用,这时就会使用默认路由,稍后我们会对默认路由作进一步的说明。此外,网关也有三种类型:主机、传输接口(interface,也称为 “links”) 和以太网络硬件地址(MAC地址)。
17.2.1 一个例子
为了说明不同类型的路由选择,我们将使用由netstat -r命令取得的数据作为例子:
% netstat
-r
Routing
tables
Destination Gateway
Flags Refs Use Netif Expire
Default
outside-gw
UGSc 37 418 ppp0
localhost localhost
UH 0 181 lo0
test0 0:e0:b5:36:cf:4f UHLW 5 63288 ed0
77
10.20.30.255 link#1 UHLW 1 2421
foobar.com link#1 UC 0
0
host1
0:e0:a8:37:8:1e UHLW 3 4601 lo0
host2
0:e0:a8:37:8:1e UHLW 0 5 lo0 =>
host2.foobar.com
link#1
UC 0 0
224
link#1 UC 0 0
第一行是默认路由(我们会在下一段说明),第二行则是本地主机(localhost)路由。
由Netif列可以知道localhost
所使用的接口是lo0,也就是loopback设备。这表示所有的数据包不会被送上网络,而是在内部处理。
接下来是0:e0:...这些地址。这些都是以太网络硬件地址,也就是MAC地址。FreeBSD会自动识别在同一个以太网络中的主机(如test0),并且将它加入路由表,然后通过ed0这个接口直接与它通信,在Expire列会显示与这种路由相关的延迟时间,如果在一个指定的时间内我们没有接受到来自主机的回音,就使用这个时间。在这个例子中这条路由会自动被删除。这些主机是用一种称为RIP(Routing Information Protocol)的机制来识别,通过RIP我们可以得到与本地主机通信的最佳路由。
FreeBSD也会替本地子网添加子网路由(10.20.30.255是子网10.20.30的广播地址,foobar.com则是与这个子网相关的域名)。link#1代表主机的第一块以太网卡,你也许也注意到了,这些路由都没有指定接口。
本地网络主机和本地子网的路由是由routed这个守护程序(daemon)自动设置的,如果没有运行routed,那就只有静态定义的路由存在。
host1这一行指出了我们的主机,它是以太网地址。因为我们是发送端主机,FreeBSD知道该使用loopback接口(lo0),而不是通过以太网接口发送出去。
host2这两行是为了示范当我们使用ifconfig alias时的情况(这么做的原因请参考以太网络这个部分)。lo0之后的=>符号表示我们不仅仅在使用loopback(由于这是用于本地主机的地址),而且它也是一个别名。这种路由只有在支持别名的主机上才会显示出来,所有其他本地主机对这种路由只会简单的显示一行link#1。
最后一行(目标子网络224)是用于多播(MultiCasting),我们会在下一节再说明的。
我们将讨论的其他列是Flags。每一个路由的不同属性都在这里显示,下面的表格是这些属性的简短说明:
|
U |
启动(Up):代表正常运作。 |
|
H |
主机(Host):通向一台主机的路由。 |
|
G |
网关(Gateway):任何送到目标的数据包都会先被这台主机接收,然后再由这台主机转送。 |
|
S |
静态(Static):这种路由是人工设置的,并非由系统自动产生。 |
|
C |
Clone:以此路由为基础产生新的路由,这种路由通常只在本地网络使用。 |
|
W |
WasCloned:表示这个路由是以属性为C(Clone)的路由为基础自动产生的。 |
|
L |
Link:路由包括以太网络硬件的参考。 |
17.2.2默认路由
当本地系统需要连接到远程主机时,它会先检查路由表以决定是否已经有一个已知的路径存在。如果远程主机位于我们已经知道如何到达的子网,系统就会检查看是否能通过这个路由进行连接。
如果所有已知路由都无法使用,系统只有最后一个选择:默认路由。默认路由是一种特殊类型的网关路由(通常也是系统中唯一的一个),而且一定会在标记段用一个c来标记。对于本地局域网络中的主机,这个网关被设置成无论什么主机都有一个与外界的直接连接(无论是用PPP,Cable modem,T1,还是另一个网络接口)。
如果你正在为一台机器配置一个默认路由,而这台机器又充当连接外部世界的网关,那默认路由就是你的ISP(Internet Service Provider)站点的网关机器。
让我们看看一个默认路由的例子,这是一个很常见的情况:
主机Local1与Local2在你的站点中。Local1通过一个拨号点对点(PPP)连接与ISP相连。这个服务器计算机通过一个本地网络被连接到另一个网关计算机。
这两台主机的默认路由如下:
|
主机 |
默认网关 |
界面 |
|
Local2 |
Local1 |
ethernet |
|
Local1 |
T1-GW |
PPP |
一个常见的问题是“为什么(或如何)将默认路由设成T1-GW,而不是它被连接到的ISP服务器?”
记住,既然PPP接口使用的地址是属于ISP的局域网络,在这个局域网络中所有主机的路由就会自动产生,因此自然也就得到T1-GW这台机器的路由,所以多余的设置是不需要的。
最后一点需要注意的是,一般都是把X.X.X.1这个地址作为你本地网络的网关地址,因此(使用同样的例子),如果你的本地C类地址空间是10.20.30,而ISP是用10.9.9,那么默认的路由是这样的:
Local2 (10.20.30.2)
--> Local1 (10.20.30.1)
Local1 (10.20.30.1,10.9.9.30) --> T1-GW (10.9.9.1)
17.2.3 Daul-Homed主机
还有一种配置方式是我们应该知道的,那就是一台连接两个不同网络的主机。从技术上来讲,任何作为网关的机器都可以视为daul-homed主机,但是这个术语仅用来表示同时连接两个局域网络的机器。
举例来说,一台机器有两块以太网卡,两块网卡的地址都在不同的子网上。另外一个例子就是,一台机器只有一块以太网卡,但是用了ifconfig加上别名。第一个例子是在同时使用两个物理以太网络时,第二个例子是只有一个物理网络,但是有两个逻辑子网络。
此外,可以设置路由表让每个子网都知道这台机器是通往另一个子网的网关。将机器作为两个子网的网桥,当我们需要在某个连接或两个连接中执行数据包过滤(packet filtering)或防火墙(firewall)安全时,就要使用这个配置。
17.2.4路由传播
我们已经讨论了我们如何定义通向外部世界的路由,但是还不知道别人是怎么找到我们的。
我们已经知道通过设置路由表,所有送到某段地址的数据包(在例子中是一个class-C的子网)都会被送到一台位于目标网络的特定主机,接着这台主机会将数据包转送给真正的接收者。
当你得到指派给你的站点的一个地址空间时,你的ISP会设置他们的路由表,以便所有送给你的数据包都会通过你的PPP连接送到你的站点。但是位于其他国家的计算机是如何将数据包送到你的ISP呢?
有一个系统(与分布式DNS信息很象)不断地记录所有分配的地址空间,并且为它们定义到因特网骨干(Internet Backbone)的连接点,“Backbone”是负责全球因特网通信的骨干线路,每一台位于骨干线路上的机器(backbone machine)都保存一份对应表,有了这份对应表,数据包就可以送到你的ISP,最后到达你的网络。
此外,你的ISP也必须让骨干线路上的机器知道你是通过这家ISP连上网络的。这个就是路由传播。
17.2.5问题解答
有时候路由传播(routing propagation)出了问题,导致某些地方的计算机无法与你连接。也许traceroute这个最有用的命令可以帮你找出路由是在哪里中断的。如果你无法与远程主机连接,这个命令一样有用(例如当ping失败时)。
traceroute这个命令是以你要连接的远程主机作为参数。它会将数据包所经过的网关显示出来,无论最后是否能成功到达远程主机。请参考traceroute的联机手册了解更多信息。
17.3 网桥
17.3.1 介绍
有时,把一个物理网络(如一个以太网段)分成两个分离的网络而没有创建IP子网,需要使用一个路由器来将两个子网连起来。连接这两个网络的设备就叫做网桥。带有两个网络接口卡的FreeBSD系统就可以充当一个网桥。
网桥通过每个网络接口设备的MAC层地址(以太网地址)来工作。当它的源和目标在不同网络上时,它会在两个网络之间进行通信。
在我看来,网桥就象一个提供很多端口的以太网交换机。
17.3.2网桥的一些功能
今天,网桥有两个普通的功能。
网段之间的高通信量
一种情形是你的物理网络之间的通信量超载,但你不希望因为某些原因就把子网与路由器断开。让我们来看一个报社的例子。编辑部和出版部都在同一个子网中。编辑部的用户使用服务器A来作为文件服务,出版部的用户使用服务器B。用一个以太网来连接所有的用户,网络的高负载使网络性能大大下降。
如果编辑部的用户被隔离在一个网段内,出版部的用户使用另一段,两个网络段通过一个网桥来连接。前往网桥另一边的网络传输将被发送到其他网络,这样减少了在每个网段的拥塞现象。
过滤传输的防火墙
第二个普通的功能是不需要IP伪装的防火墙功能。通常一个小公司是通过DSL或ISDN来连接到ISP的。他们可以使用13个全球访问的IP地址,可以在他们的网络上带有10台PC机。在这种情形下,因为子网的原因,使用一个带有路由功能的防火墙是很困难的。一个带有网桥功能的防火墙能够被配置并接在DSL/ISDN的后面,就不会有任何IP编号的问题。
17.3.3 配置网桥
选择网络接口卡
一个网桥要求至少两个网卡。不幸的是,不是所有的网卡FreeBSD都能支持充当网桥的。阅读bridge联机手册了解更多信息。在继续之前,先安装和测试两个网卡。
内核配置修改
要启用网桥支持,需要添加:
options BRIDGE
声明一下你的内核配置文件,然后重新编译内核。
防火墙支持
如果你计划使用网桥来充当一个防火墙,你需要添加IPFIREWALL选项。阅读第10.7节了解配置信息。
如果你想允许非IP数据包通过网桥,有一个非正式的防火墙选项需要设置。这个选项是IPFIREWALL_DEFAULT_TO_ACCEPT。确信在设置之前,你知道如何进行修改。
数据传输的支持
如果你想使用网桥来充当一个传输器,你需要在内核配置中添加DUMMYNET选项。阅读dummynet联机手册了解更多信息。
17.3.4启用网桥
添加一行:
net.link.ether.bridge=1
到/etc/sysctl.conf来实时启用网桥。如果你要通过ipfw来过滤数据包,你可以这样做:
net.link.ether.bridge_ipfw=1
等。
17.3.5性能
我的网桥/防火墙是一台带有3Com 3C900B和3C905B两个网卡的Pentium 90机器。受保护的网络运行10M半双工的网卡,在网桥与我的路由器(Cisco 675)之间的连接运行100M全双工的网卡。没有启用包过滤功能,我发现在ping受保护的10M网络与Cisco 675时,网桥的响应时间只有0.4毫秒。
17.3.6其他信息
如果你要从网络登陆进网桥时,指派给其中一个网卡一个IP地址是非常好的。大家都同意同时给两个网卡指派一个地址是很糟糕的主意。
如果在你的网络中有多个网桥,在两个工作站之间就不可能超过一个路径。技术上,这意味着不支持形成树连接管理。
17.4 NFS
在许多不同的文件系统中,FreeBSD支持网络文件系统(NFS)。NFS允许你通过网络在不同机器之间共享目录和文件。使用NFS,用户和程序能访问远程系统上的文件,就象它们是本地文件一样。
NFS 有几个好处:
本地工作站不需要太多的磁盘空间,因为普通使用的数据可能被保存在某台机器上,其他用户也可以通过网络访问到它。
用户不需要在每台机器上都有唯一的home目录。一旦它们通过NFS建立了一个目录,它就可以在任何地方被访问到。
象软盘和CDROM驱动器这样的存储设备能够被网络上的其他机器所使用。
17.4.1它如何工作
NFS有两部分组成——客户端和服务端。它们是一个主从关系。客户端索取数据,服务端提供数据。服务器与客户端共享数据。为了这个系统能正确运行,有几个处理必须配置和运行:
服务器端必须运行下面的程序:
|
程序 |
描述 |
|
nfsd |
响应NFS客户端的请求 |
|
mountd |
响应nfsd发出的请求 |
|
portmap |
允许NFS客户端寻找NFS服务器端使用的是哪个port |
客户端只需要运行一个简单的程序:
|
nfsiod |
哪个服务请求来自NFS服务器 |
17.4.2 配置NFS
如果幸运的话,在一个FreeBSD系统上,这个设置是很好的。可以在/etc/rc.conf文件中作几处修改,这样需要运行的进程在启动时就可以被自动运行了。
你确定在NFS服务器上有:
portmap_enable=“YES”
nfs_server_enable=“YES”
nfs_server_flags=“-u -t -n
4”
mountd_flags=“-r”
无论NFS服务器什么时候被启用时,mountd将会自动运行。