第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将会自动运行。NFSD的-u,-t标记会告诉它服务UDP和TCP客户端。-n
4标记告诉nfsd启动它自己的4个拷贝。
在客户端,确信你有这些:
nfs_client_enable=“YES”
nfs_client_flags=“-n 4”
象nfsd,-n
4告诉nfsiod启动它自己的4个拷贝。
最后的配置步骤要求你创建一个叫做/etc/export的文件。输出的文件会指定在你的服务器上哪个文件系统将被共享,和他们需要与哪个客户端共享。在文件中的每一行指定一个将被共享的文件系统。有很多选项可以用在这个文件中,但这儿只提到几个。你可以在export的联机手册中找到其余的。
这儿是/etc/export记录的几个例子:
下面一行把/CDROM指向三个具有同样域名的不同的机器上,或者在你的/etc/hosts文件中有同样的域名。-ro标记使得共享文件系统为只读。由于这个标记,远程系统将不能对共享文件系统作任何修改。
/cdrom -ro moe larry curly
下面一行通过IP地址将/home指向三个不同的主机。如果你有一个不运行DNS的私有网络,这是很有用的设置。-alldirs标记允许在被指定文件系统下的所有目录都能同样被输出。
/home -alldirs 10.0.0.2 10.0.0.3 10.0.0.4
下面一行将/a指向拥有不同域的两台机器。-maproot=0标记允许远程系统的root用户以root来写入共享文件系统。没有-maproot=0标记,即使有远程访问的root权限,他们也不能修改共享文件系统。
/a -maproot=0 host.domain.com box.example.com
要访问一个客户端——一个输出文件系统,必须要有权限才能这样做。确信你的客户端已经在/etc/exports文件中列出了。
记住无论你什么时候修改/etc/exports文件,你都必须重新启用mountd,这样你的修改才会起作用,这一点很重要。这可以通过发送一个挂起信号给mountd进程来完成:
# kill -HUP `cat
/var/run/mountd.pid`
现在,你已经作了这些修改,需要重新启动,让FreeBSD启用你刚才做的修改,或以root来运行下面这些命令:
在NFS服务器上:
# portmap
# nfsd -u -t -n 4
# mountd -r
在NFS客户端上:
# nfsiod -n 4
现在你可以准备挂上一个远程文件系统了。这可以有两种方法。在这些例子中,服务器的名字将是服务器,客户机的名字就是客户机。如果你要挂上一个远程文件系统,或只要测试你的配置,你可以在客户端以root来运行这样一个命令:
# mount server:/home /mnt
这将在服务器上挂上/home目录,在客户机上挂上/mnt目录。如果每一样都设置正确,你将能进入客户端的/mnt,看到服务器上的所有文件。
如果你要永久地挂上一个远程文件系统,你需要在/etc/fstab文件中添加它,例如:
server:/home /mnt nfs rw
0 0
看看fstab的联机手册了解更多信息。
17.4.3实际使用
NFS有很多非常Cool的用途:
在网络中有很多机器,需要共享CDROM或软盘驱动器。这是比较便宜和方便的做法。
在网络中有这么多的机器,你的个人文件散布在各个地方。你需要一个中央NFS服务器来存放所有用户的目录和共享网络中剩余的机器,所以无论在哪儿登陆,你将使用同一个home目录。
当你在一台机器上重新安装FreeBSD时,NFS是很好的方法。只要将CDROM连通到你的文件服务器上,你可以在远处安装!
有一个你所有机器都共享的普通目录/usr/port/distfiles。当你要安装一个port时,而你已经安装在了一台不同的机器上,你不需要再重新下载源代码了!
17.4.4 amd
Amd,是一个很有名的自动加载程序,是一个有用的自动挂上远程文件系统的程序。文件系统一段时间不运作,它将被amd自动卸载。使用amd提供了一个简单的可选择的静态加载方法。
amd通过将自己作为一个NFS服务器来操作/host和/net目录。当一个文件访问这些目录中的某一个时,amd会寻找相应的远程加载点,然后加载它。/net被用来挂上一个文件系统,而/host被用来挂上一个远程主机名。
在/host/foobar/usr中,一个文件的访问将告诉amd设法在主机foobar上挂上/usr输出。
例17-1. 用amd挂上输出
% showmount -e foobar
Export list on foobar:
/usr
10.10.10.0
/a
10.10.10.0
% cd /host/foobar/usr
正如例子中显示的,showmount显示了把/usr作为一个输出。当改变目录为/host/foobar/usr时,amd设法分离主机名foobar,然后自动挂上希望的输出。
可以通过在/etc/rc.conf文件中添加下面一行来启动amd。
amd_enable=“YES”
另外,默认的amd标记被设置成:
amd_flags=“-a /.amd_mnt -l
syslog /host /etc/amd.map /net /etc/amd.map”
/etc/amd.map文件定义了用来加载输出的默认选项。/etc/amd.conf文件定义了amd的更多的高级特性。参考amd和amd.conf的联机手册了解更多信息。
17.4.5与其他系统相集成的问题
某些用于ISA PC系统的以太网卡(Ethernet adapter) 可能会导致网络发生严重的问题,尤其是使用NFS的时候。这个问题并非FreeBSD特有的,但是FreeBSD多少会受到影响。
这个问题几乎总是发生在同时拥有(FreeBSD) PC系统与高性能工作站的网络上,例如硅图(Silicon Graphics,Inc.) 和升阳(Sun
Microsystems,Inc.)所制造的工作站。一开始,客户端成功地挂上NFS文件系统,一些操作也都顺利完成,但是服务器突然对客户端的请求毫无反应,而其他客户端却仍能正常工作,无论这些客户端是FreeBSD系统还是工作站,在许多系统上,只要出现这个问题就无法正常地将客户端关闭,因为没有办法解决这种问题,唯一的办法就是不断的刷新(reset)客户端。
虽然FreeBSD“正确”的解决方法是改用性能更好的网卡,不过也有一个简单可行的办法:如果你的FreeBSD系统是服务器,在挂上NFS时加上-w=1024这个参数。如果是客户端,则在挂上NFS时加上-r=1024这个参数。这些参数可以加在客户端fstab文件的第四个字段,或者是mount命令的参数-o后面。
有时候会出现另一种问题,但是经常被误认为是我们在上面所提到的问题,当NFS服务器和客户端位于不同的网络时,务必确定你的路由器会发送必要的UDP信息,否则就无法使用NFS。
在接下来的例子中,fastws是一台高性能工作站的名称,freebox是一台FreeBSD系统的主机名,并且使用低性能的网卡。另外,/sharedfs是开放(export)的NFS文件系统(请参考man
export),而/project则是在客户端的NFS挂载点(mount
point)。在所有情况下,注意其他的选项,例如hard、soft和bg可能应用在的应用程序中会更好。
以FreeBSD系统(freebox)作为客户端的例子:在freebox上的/etc/fstab文件中:
fastws:/sharedfs /project
nfs rw,-r=1024 0 0
在freebox上运行一个手工加载命令:
# mount -t nfs -o -r=1024
fastws:/sharedfs /project
以FreeBSD系统为服务器的例子:在fastws的/etc/fstab文件中:
freebox:/sharedfs /project
nfs rw,-w=1024 0 0
在fastws上直接使用mount命令:
# mount -t nfs -o -w=1024
freebox:/sharedfs /project
几乎所有16位的以太网卡对读取或写入的容量都没有限制。
如果你有兴趣,这部分会告诉你错误发生时的情况,同时也会说明无法复原的原因。NFS一般是以8K为数据的传输单位,但是以太网络的数据包最大为1500字节,因此NFS发送的数据会被切割为许多的以太网络数据包,而接收端则必须接收、组合数据包,然后形成一个单元。高性能工作站可以将包含NFS数据的数据包依序取出(pump out)。但是在比较廉阶的网卡上,较晚送出的数据包可能会跑得比先送出的数据包还快,导致NFS的数据无法重新组合,当超时值到达后,接收端就会要求发送端将数据再送一次,但是提供NFS服务的机器会将整个8K的数据重新送出,而上面所说的整个程序就会再重复一次,最后进入一个不会停止的循环。
借着让NFS的数据传输单位小于以太网络数据包,我们可以保证每个数据包都可以正确地被接收及响应,从而避免这个问题。
当一台高性能的工作站以高速将数据送给PC系统时,即使这台PC所用的是较好的网卡,这种情况仍可能发生。当情况发生时,被影响的NFS数据会被重新发送,不过数据包会有一定的机会被接收、重组,然后送出响应。
17.5 无盘操作
FreeBSD机器可以从一台NFS服务器使用NFS文件系统来从网络启动,且无需硬盘就可以操作。对于标准配置文件,无需作任何修改。这样一个系统很容易配置,因为所有必需的细节都可以容易地找到:
• 至少有两种方法可以通过网络来加载内核:
PXE: Intel的预启动运行环境系统是通过内建在一些网卡或主板上的ROM来运行的。看看pxeboot的联机手册了解更多细节。
etherboot
port(/usr/port/net/etherboot)可以引导ROM代码通过网络来启动内核。代码不是被固化在用来启动的网卡的PROM中,就是从软盘(硬盘)上启动,或从一个运行MS-DOS的系统上启动。有很多网卡都被支持。
• 有一个示例脚本(/usr/local/share/examples/clone_root)可以来指导你创建和维护在服务器上的工作站根文件系统。这个脚本可能需要你做一些修改,但你可以很容易地上手。
• 标准的系统启动文件放在/etc中,它用来检测和支持无盘系统的启动。
• 如果需要的话,可以交换到一个NFS文件或一个本地硬盘。
有好几种方法可以来设置无盘工作站。下面将描述一个完整的系统设置,主要要强调标准FreeBSD启动脚本的简单性和兼容性。这个系统主要有下面的特性:
• 无盘工作站使用一个共享的只读的root文件系统,和一个共享只读的/usr文件系统。
Root文件系统是一个标准FreeBSD根的副本,它带有一些指定无盘操作的配置文件,或是它们属于哪个工作站。
能够被写入的root部分会被mfs文件系统所覆盖。当系统重新启动之后,所有的修改将被丢失。
• 内核可以使用DHCP(或BOOTP)和TFTP通过etherboot来被加载。
警告:这个系统是不安全的。它必须处在一个受保护的网络区域中,其他主机无法被信任。
17.5.1 安装说明
配置DHCP/BOOTP
有两个协议通常被用来通过网络启动一个工作站获得它的配置:BOOTP和DHCP。它们在工作站启动时会被使用好几次:
• etherboot使用DHCP(默认)或BOOTP(需要一个配置选项)来寻找内核。(PXE使用DHCP)
• 内核使用BOOTP来定位NFS根。
有时,可能只使用BOOTP来配置系统。bootpd服务器程序被包含在基本的FreeBSD系统中。然而,通过BOOTP,DHCP有许多的优势(良好的配置文件,使用PXE的可能性,加上许多其他的不会直接与无盘操作相关的东西),我们将在后面着重地讨论如何使用ISC DHCP软件包来做一个纯粹的BOOTP和BOOTP+DHCP的配置。
使用ISC DHCP配置
isc-dhcp服务器可以回答BOOTP和DHCP的请求。从4.4版开始,isc-dhcp不再是基本系统的一部分了。你需要先安装/usr/port/net/isc-dhcp3或相应的软件包。请参考第4章有关port和package的安装说明。
一旦isc-dhcp被安装好,它就需要运行一个配置文件(通常被命名为/usr/local/etc/dhcpd.conf)。下面是一个例子:
default-lease-time 600;
max-lease-time 7200;
authoritative;
option domain-name “example.com”;
option domain-name-servers
192.168.4.1;
option routers 192.168.4.1;
subnet 192.168.4.0 netmask 255.255.255.0 {
use-host-decl-names on;
option subnet-mask 255.255.255.0;
option
broadcast-address 192.168.4.255;
host margaux {
hardware ethernet 01:23:45:67:89:ab;
fixed-address margaux.example.com;
next-server 192.168.4.4;
filename “/tftpboot/kernel.diskless”;
option root-path “192.168.4.4:/data/misc/diskless”;
}
}
·
这个选项告诉dhcpd在主机声明中发送正确的值作为无盘主机的主机名。另一个方法是在主机声明中添加一条option host-name margaux。
next-server是指派TFTP服务器(默认将使用同样的主机作为DHCP服务器)。
filename直接定义了etherboot将作为一个内核来加载的文件。
注意:PXE是一个有关的文件名,它能加载pxeboot,而不是内核(option filename “pxeboot”)。
Root-path选项在通常的NFS符号中定义了根文件系统的路径。
使用BOOTP配置
下面是一个相同的bootpd配置方法。可以在/etc/bootptab中找到。
请注意,为了使用BOOTP,etherboot必须使用非默认的选项NO_DHCP_SUPPORT来编译,PXE需要DHCP。bootpd的唯一优势是它存在于基本系统中。
.def100:\
:hn:ht=1:sa=192.168.4.4:vm=rfc1048:\
:sm=255.255.255.0:\
:ds=192.168.4.1:\
:gw=192.168.4.1:\
:hd=“/tftpboot”:\
:bf=“/kernel.diskless”:\
:rp=“192.168.4.4:/data/misc/diskless”:
margaux:ha=0123456789ab:tc=.def100
用Etherboot准备一个启动程序
Etherboot的网站(http://etherboot.sourceforge.net/)包含了一些额外的文档(http://etherboot.sourceforge.net/doc/html/userman.html),它们主要是针对Linux系统,但是里面包含了许多有用的信息。下面就简要地介绍一下你如何在FreeBSD系统上使用etherboot。
首先,你必须要安装etherboot软件包(可能需要编译)。etherboot
port通常可以在/usr/port/net/etherboot中找到。如果port树已经被安装在你的系统中,只要在这个目录中键入make,就可以完成所有安装工作。你可以参考第4章,有关port和package的安装信息。
在我们的安装中。我们将使用一个启动软盘。其他方法(如PROM或dos程序),请参考etherboot的文档。
先制作一个启动软盘,插入软盘,然后改变你当前的目录到src目录,再键入:
# gmake bin32/devicetype.fd0
Devicetype是你无盘工作站上使用的以太网卡的类型。在同一个目录中的NIC文件就是指devicetype。
配置TFTP和NFS服务器
你需要在TFTP服务器上启用tftpd:
1. 从tftpd将提供文件的地方创建一个目录,如:/tftpboot
2. 添加这行到你的/etc/inetd.conf文件:
tftp
dgram udp wait nobody
/usr/libexec/tftpd
tftpd /tftpboot
注意:有些PXE版本要求TFTP的TCP版本。在这个例子中,在添加一行,把dgram udp替换成stream tcp。
3. 告诉inetd重新读取它的配置文件:
# kill -HUP ‘cat /var/run/inetd.pid’
你可以在服务器的任何地方放置tftpboot目录,但,对于实际的放置位置,在inetd.conf中的值必须与在dhcpd.conf中的值保持一致。
你也需要启用NFS服务,然后在NFS服务器上输出适当的文件系统。
1. 把下面这行添加到/etc/rc.conf:
nfs_server_enable=“YES”
2. 通过添加下面这行到/etc/export中来定位无盘根目录的位置,以便输出文件系统(调整卷加载点和工作站的名称):
/data/misc
-alldirs -ro margaux
3. 告诉mountd重新读取它的配置文件。如果你确实需要在第1步配置NFS服务,你可能需要重新启动一下。
# kill -HUP
‘cat /var/run/mountd.pid’
建立一个无盘操作的内核
使用下面这些选项来为无盘的客户端创建一个内核配置文件(除了平常要用到的):
options BOOTP
# Use BOOTP to obtain
IP address/hostname
options BOOTP_NFSROOT # NFS mount root filesystem using BOOTP
info
options BOOTP_COMPAT # Workaround for broken bootp
daemons.
你可能也会要用到BOOTP_NFSV3和BOOTP_WIRED_TO(请参考LINT文件)。建立内核(参考第9章),然后把它拷贝到tftp目录,在dhcpd.conf中列出的名字后面。
准备root文件系统
你需要为无盘工作站创建一个根文件系统,在dhcpd.conf中用root-path列出来的位置。这样做的最简单的方法是使用/usr/share/examples/diskless/clone_root shell脚本。这个脚本需要你定制一下,至少你需要调整创建文件系统的位置。
你可以参考每个脚本上面的注释。它们解释了基本文件系统是如何建立的,文件是如何有选择地被指定版本转给无盘操作,或给一个子网,或给一个单独的工作站的。它们也为无盘操作的配置文件/etc/fstab和/etc/rc.conf提供了例子。
在/usr/share/examples/diskless中的README文件包含了许多有兴趣的背景信息,但,在diskless目录中,和其他例子一起,它们实际上证明了与使用clone_root和/etc/rc.diskless不同的配置方法,这可能会让人感到糊涂。使用它们只是作为参考,要是按他们描述的方法来做,你也需要定制rc脚本。
到FreeBSD 4.4-RELEASE时,在clone_root和/etc/rc.diskless1脚本之间有一个小的不兼容的地方。请参考PR conf/31200(注1)对clone_root作一些适当的调整。也可以看看PR conf/29870(注2),对/etc/rc.diskless2作一些小的调整。
(注1:http://www.freebsd.org/cgi/query-pr.cgi?pr=31200)
(注2:http://www.freebsd.org/cgi/query-pr.cgi?pr=29870)
配置Swap
如果需要的话,可以在服务器上通过NFS运行文件交换的工作。正确的bootptab或dhcpd.conf选项是有一些难以理解。但不管怎样,这儿是一些参考,使用isc-dhcp 3.0rc11。
1. 添加下面这些行到dhcpd.conf:
# Global section
option swap-path code 128 = string;
option swap-size code 129 = integer 32;
host margaux {
... # Standard lines,
see above
option swap-path “192.168.4.4:/netswapvolume/netswap”;
option swap-size 64000;
}
有一点,至少对于FreeBSD客户端来讲,DHCP/BOOTP选项中的代码128是NFS交换文件的路径,而代码129是交换文件的大小。
/etc/bootptab将会使用下面的语法:
T128=“192.168.4.4:/netswapvolume/netswap”:T129=64000
2. 在NFS交换文件服务器上,创建交换文件
# mkdir /netswapvolume/netswap
# cd /netswapvolume/netswap
# dd if=/dev/zero bs=1024 count=64000 of=swap.192.168.4.6
# chmod 0600 swap.192.168.4.6
192.168.4.6是无盘客户端的IP地址。
3. 在NFS交换文件服务器上,添加下面一行到/etc/export中
/netswapvolume
-maproot=0:10 -alldirs margaux
然后,就象上面一样,告诉mountd重新读取输出文件。
其他问题
用一个只读的/usr运行
如果无盘工作站被配置成运行X,你将必须调整xdm配置文件,默认情况下会把错误日志放在/usr中。
使用一个非FreeBSD的服务器
当root文件的服务器不是运行FreeBSD时,你将必须在一台FreeBSD机器上创建root文件系统,然后使用tar或cpio把它拷贝到它的目标位置。
在这种情况下,可能在/dev中的一些特殊文件有些问题,因为一些较小的/较大的数的大小可能不同。解决这个问题的方法是从最后的服务器上通过NFS在一个已挂载的目录中运行MAKEDEV。
17.6 ISDN
Dan Kegel的ISDN Page(http://alumni.caltech.edu/~dank/isdn/)是一个取得有关ISDN信息的好地方。
一个对ISDN快速且简单的说明如下:
如果你住在欧洲,建议你研究一下ISDN卡这个部分。
如果你打算使用ISP提供的拨号式ISDN,建议你考虑终端适配器(Terminal Adapter),这样在更换ISP时可以提供足够的灵活性及产生最少的问题。
如果你要通过ISDN专线将两个局域网络连在一起、或是与Internet连接,建议你考虑独立的路由器(router)/网桥(bridge)。
成本是考虑决定使用哪个方案的主要因素。下面的选项列出了从最低成本到最高成本的方案。
17.6.1 ISDN卡
FreeBSD的ISDN程序只支持DSS1/Q.931
(or Euro-ISDN)标准的被动式卡。从FreeBSD 4.4开始,一些主动式卡也开始被支持,而且它的韧件(firmware)也支持其他的信号协议。这也包括Primary Rate (PRI) ISDN卡。
Isdn4bsd允许你通过IP over raw HDLC或同步PPP连接到其他ISDN路由器:可以通过支持isppp的内核PPP,或一个修改过的sppp驱动器,或通过使用用户级的ppp。通过使用用户级ppp,绑定两个或多个ISDN B通道是可能的。
现在FreeBSD支持的PC
ISDN卡越来越多,有报告显示,它可以在所有欧洲国家和世界其他许多国家使用。
被动式ISDN卡绝大多数采用Infineon (以前使用Siemens)的ISAC/HSCX/IPAC ISDN芯片组,另外,ISA接口的卡也使用Cologne Chip的芯片,PCI接口的卡也使用Winbond W6692的芯片。
当前,支持的主动式ISDN卡是AVM
B1 (ISA和PCI) BRI卡和AVM T1 PCI PRI卡。
有关isdn4bsd的文档可以看看你FreeBSD系统的/usr/share/examples/isdn/目录,或是isdn4bsd的主页(http://www.freebsd-support.de/i4b/)。
如果你有兴趣让isdn4bsd支持其他ISDN协议、ISDN
PC卡或是其他功能的增加,请与<hm@FreeBSD.org>联系。
有一个由majordomo所维护的邮件列表,上面有许多有关的安装、配置、和问题解答的讨论,如果你想加入讨论,请寄一封电子邮件至 <majordomo@FreeBSD.org>并且以:
subscribe freebsd-isdn
作为信件内容。
17.6.2 ISDN终端适配器
调制解调器(modem)是给一般的电话线用的,同样的道理,终端适配器(TA,Terminal
Adapter)是给ISDN用的。
大部分的TA是用标准的hayes调制解调器AT命令集,所以可以用来取代一般的调制解调器。
其本上,TA除了连接速度较快,其他运作都与调制解调器器类似,所以设置PPP的步骤与调制解调器完全一样,但是尽量把串行端口的速度调到最高。
使用TA与ISP连接的优点之一就是动态PPP(Dynamic PPP),随着可以使用的IP地址愈来愈少,大部分的ISP不愿意再提供静态IP地址,而大部分的路由器也都没有动态取得IP的功能。
TA的运作完全依赖PPP的daemon,所以在FreeBSD上只要将PPP设置好了,你可以轻易的将调制解调器升级成ISDN,但是你在使用PPP与调制解调器时发生的问题依然存在。
如果你对连接的稳定性要求很高,那你应该用kernel模式的PPP,而非用户模式的 iijPPP。
目前已知在FreeBSD下可以正常工作的TA如下:
Motorola
BitSurfer和Bitsurfer Pro
Adtran
大部分的TA应该都能正常的运作,TA的厂商们都尽量让他们的产品能够接受标准的AT命令集。
外接式TA的问题之一是,你必须使用一块品质良好的串行卡,普通的调制解调器同样也有这个问题。
请参考FreeBSD串行硬件指南(http://www.FreeBSD.org/tutorials)了解更多关于串行设备的信息,以及异步(asynchronous)与同步(synchronous)串行端口之间的不同。
一个与标准PC串行端口连接(异步)的TA,就算是用128Kbs进行连接,传输速度最高只有115.2Kbs,如果要完全利用所有带宽,就必须改用同步串行卡。
不要认为只要买内置式TA就不需要担心上述同步/异步的问题, 内置式TA所用的也是标准PC串行端口的芯片,使用内置式TA 的原因只是不必再买一条串行线,也不必再找一个电源插座。
一块同步串行卡与TA一起使用时的速度至少跟路由器一样快,你可以用安装有FreeBSD的简单的386机器作为路由器,也许更有弹性。
选择sync/TA或路由器是一个严谨的问题,在线讨论区里有不少讨论,建议你参考archives(http://www.freebsd.org/search.html)中的讨论
17.6.3独立的ISDN网桥(Bridge)/路由器(Router)
ISDN网桥或路由器并非只能在FreeBSD或其他操作系统上使用,请阅读网络相关书籍以取得更多关于routing和bridging的信息。
在这里,我会交互使用路由器和网桥这两个名词。
随着ISDN路由器/网桥的成本不断下降,ISDN路由器/网桥的使用会愈来愈普遍。ISDN路由器是一个小盒子,可以直接与你的以太网络(或网卡)连接,同时自行管理与其他网桥/路由器间的连接,并且也拥有处理PPP或其他协议的能力。
路由器的速度远比一个标准的TA快得多,因此路由器可以充分利用同步ISDN的带宽。采用ISDN路由器与网桥的问题之一就是不同牌子间机器的协同工作能力。 如果你打算与ISP连接,建议你先跟ISP讨论你的需求。
如果你打算将两个局域网络相连,例如:从家里连接到办公室,这是最容易、同时成本也是最低的维护方案。 既然要互相连接的两端都是使用相同的设备,这可以确定连接将会正常地进行。
如果要将家里或分公司的网络与总公司连接,可以使用下面的例子。
例17-2. 分公司或家庭网络
使用10
Base T以太网络。如果需要的话,可以通过AUI/10BT transceiver 将路由器与网络线(network cable)连接。
如果家里/分公司只有一台计算机,你可以直接用双绞线与路由器连接。
例17-3. 办公室或其他局域网络
使用双绞线的以太网络。
大多数路由器/网桥的优点之一就是可以同时使用两个独立的PPP连接,除了少数拥有两个串行口的TA外,大部分的TA都没有这种能力,千万不要和通道绑定(channel bonding)和MPP等东西混淆。
这是一个非常有用的特性,如果你只想用其中一个ISDN线路与因特网连接,这时路由器就可以负起管理之责,让一个B 通道(64Kbs)与因特网连接,而另一个B channel则用来接听电话,或是与第一个B 通道做动态绑定(dynamically bound)(MPP等)以增加带宽。
以太网网桥不但能用IP通信,同时也能使用IPX/SPX 或其他你喜欢的通信协议。
17.7 NIS/YP
17.7.1 它是什么?
NIS,是指网络信息服务,是由Sun Microsystems开发的Unix中央管理系统。现在它已成为了一个工业标准。现在所有主流的UNIX系统(Solaris, HP-UX,
AIX, Linux, NetBSD,
OpenBSD,FreeBSD等都支持NIS。)
NIS以前以Yellow
Pages而闻名,但因为商标的原因,SUN改变了名称。老的术语(yp)仍能经常看见和使用。
它是一个基于client/server的系统,允许在一个NIS域中的一组机器共享一批配置文件。 这允许一个系统管理员设置NIS客户端系统时只需要添加一个小小的配置数据,从一个简单的定位删除或修改配置数据。
它与Windows NT的域系统很相似。虽然两者的内部运行不太相似,但基本的功能是相仿的。
17.7.2你应当知道的术语和进程
当你在FreeBSD上试图运行NIS时,无论你是要创建一个NIS服务器还是运行一个NIS客户端,你将遇到有几个术语和重要的用户进程:
术语 |
描述 |
NIS domainname |
一个NIS主服务器和它所有的客户端都有一个NIS域名。与一个NT域名相似,NIS域名不需要任何东西充当DNS。 |
portmap |
为了启用RPC,它必须被运行。如果portmap不运行,它将不可能运行一个NIS服务器,或充当一个NIS客户端。 |
ypbind |
“binds”一个NIS客户端为它的NIS服务器。它将使用系统的域名,然后使用RPC,连接到服务器。Ypbind是在一个NIS环境中client-server通信的核心。如果ypbind在一个客户机上死掉,它将不能访问NIS服务器。 |
ypserv |
只运行在NIS服务器上,它自己就充当NIS服务器的处理。如果ypserv死掉了,那服务器将不能再响应NIS的请求。有一些NIS的运行程序,在服务器死掉之前,他们不能重新连接到另一个服务器。在这个例子中,唯一能做的是重新启动服务器进程,或客户端的ypbind进程。 |
rpc.yppasswdd |
另一个进程只运行在NIS的主服务器上,它是一个允许NIS客户端改变它们的NIS密码的程序。如果这个程序没有运行,用户将必须登陆到NIS主服务器上,改变它们的密码。 |
17.7.3它是如何工作的?
在一个NIS环境中,有三种类型的主机:主服务器,从服务器和客户机。服务器充当一个主机配置信息的中央知识库。主服务器拥有这个信息的权威拷贝。客户机依靠服务器来给它们提供这个信息。
在很多文件中的信息能以这种风格被共享。文件通常通过NIS来共享。无论客户机的一个进程什么时候需要信息,都能在这些文件中被找到。
机器的类型
一个NIS主服务器。这个服务器,与主域控制器相类似,维持着所有NIS客户机使用的文件。passwd,group和其他被NIS客户机使用的不同的文件都依靠主服务器。
注意:对一台机器来讲,作一个服务多个NIS域的主服务器是可能的。然而,这不包含在本次介绍中,这里只讲到了一个小范围的NIS环境。
NIS副服务器。与NT的备份域控制器相似,NIS副服务器维持着NIS主数据文件的拷贝。NIS副服务器提供了冗余,在很多重要的环境中需要。他们也会帮助平衡主服务器的负载:NIS客户端总是依附于最先得到回应的服务器上,这包括副服务器响应。
NIS客户端。象很多NT工作站,登陆时需要有NIS服务器来鉴别。
17.7.4 使用NIS/YP
这节将介绍设置简单的NIS环境。
注意:这节假定你运行FreeBSD 3.3或以后版本。这里给出的用法只能用在FreeBSD 3.0以后的版本中,但不能保证一定没有问题。
计划
让我们来假设一下,你是一所大学实验室的系统管理员。这个实验室,包含了15台FreeBSD机器,当前没有集中的管理。每台机器都有它自己的/etc/passwd 和/etc/master.passwd。这些文件被同步保存。当前,当你为实验室添加一个用户时,你必须在所有15台机器上都运行adduser。毫无疑问,这种做法必须要修改,所以你决定让实验室启用NIS,使用两台机器作为服务器。
因此,实验室的配置应该是这样的:
机器名 |
IP地址 |
机器的任务 |
ellington |
10.0.0.2 |
NIS master |
coltrane |
10.0.0.3 |
NIS slave |
basie |
10.0.0.4 |
Faculty workstation |
bird |
10.0.0.5 |
Client machine |
cli[1-11] |
10.0.0.[6-17] |
Other client machines |
如果你第一次设置了一个NIS方案,考虑你如何着手做是一个好主意。无论你的网络有多大,你都必须做一个规划。
选择一个NIS域名
这不是你过去用的“域名”。它应叫做“NIS 域名”。当一个客户端发送请求信息时,它包含了NIS域的名称。这就是网络上的多台服务器如何回答哪台服务器要回答哪个请求。可以把NIS域名看成是一组主机的名称。
一些组织选择他们的internet域名来作为他们的NIS域名。当你设法检查网络问题时,这可能会引起混乱。NIS域名在你的网络中是唯一的。用它来描述一组机器是有帮助的。例如,Acme Inc.公司的艺术部门可能是在“acme-art”NIS域中。在这个例子中,假定你选择了名称test-domain。
然而,一些操作系统使用它们的NIS域来作为它们的Internet域。如果在网络中有多台机器有这个限制,你必须使用Internet域作为你的NIS域名。
物理服务器要求
当你选择一台机器用做一个NIS服务器时,有几件事情需要记住。如果一个客户机使用它的NIS域不能连接到服务器,通常机器就不能用了。用户和组信息的缺乏导致很多系统趋于停滞。记住,你应当确信选择一台不会轻易重起的机器。NIS服务器应当使用一台单独的服务器。如果你有一个没有过度使用的网络,将运行NIS服务的机器运行其他服务,记住,如果NIS服务器变得不可用,它将影响所有的NIS客户机。
NIS 服务器
所有的NIS信息的拷贝都存储在一个叫做NIS主服务器的机器上。被用来存储数据的数据库叫做NIS地图(map)。在FreeBSD中,这些地图被保存在/var/yp/[domainname]中,[domainname]是NIS的域名。一个简单的NIS服务器能支持几个域,因此,它会有几个这样的目录,每个都支持域,每个域将有它自己独立的设置地图。
NIS主和副服务器会处理所有ypserv程序的NIS请求。Ypserv可以接受来自NIS客户机的请求,翻译请求域和地图的名称给一个路由来对应数据库文件和从数据库传输数据给客户机。
设置一个NIS主服务器
设置一个主服务器依赖于你的需要。所有你需要的是把下面这行添加到文件/etc/rc.conf中,FreeBSD将为你完成余下的工作。
1.
nisdomainname=“test-domain”
这行将设置NIS域名为test-domain。
2.
nis_server_enable=“YES”
这将告诉FreeBSD当网络下次启用时,启动NIS服务器进程。
3.
nis_yppasswdd_enable=“YES”
这将启用rpc.yppasswdd守护程序,正如上面提到的,它将允许用户从一个客户机改变他们的密码。
注意:依赖于你的NIS设置,你可能必须添加更多的记录。看看有关NIS服务器和NIS客户端(第17.7.10)的章节了解更多细节。
现在,你所要做的是以超级用户的身份运行/etc/netstart。它将为你设置一切,你可以使用你在/etc/rc.conf文件中定义的值。
初始化NIS地图
NIS地图是数据库文件,保存在/var/yp目录下。它们来自于NIS主服务器的/etc目录的配置文件。有一个例外:/etc/master.passwd文件。这是有原因的。你不要把密码传给在NIS域中所有的服务器你的root和其他管理帐户。因此,在我们初始化地图之前,你应当:
# cp /etc/master.passwd
/var/yp/master.passwd
# cd /var/yp
# vi master.passwd
你应当删除所有的关于系统帐户的记录(bin,tty,kmem,games等)。另外,你也不要把你不需要的帐户传给NIS客户机。
当你完成之后,该初始化NIS地图了!FreeBSD包含了一个叫做ypinit的脚本来为你做这个。注意,这个脚本可以用于绝大多数的UNIX系统,但不是全部。在Digital Unix/Compaq Tru64 Unix系统上叫做ypsetup。因为我们正为一个NIS主服务器产生一个地图,我们就将给ypinit添加一个-m选项。要产生NIS地图,确信你已经完成了上面的几步,运行:
ellington# ypinit -m
test-domain
Server Type: MASTER Domain:
test-domain
Creating an YP server will
require that you answer a few questions.
Questions will all be asked
at the beginning of the procedure.
Do you want this procedure
to quit on non-fatal errors? [y/n: n] n
Ok, please remember to go back and redo manually
whatever fails.
If you don't, something might not work.
At this point, we have to construct a list of this domains
YP servers.
rod.darktech.org is already
known as master server.
Please continue to add any
slave servers, one per line. When you are
done with the list, type a <control D>.
master server : ellington
next host to add: coltrane
next host to add: ^D
The current list of NIS
servers looks like this:
ellington
coltrane
Is this correct? [y/n: y] y
[..output from map
generation..]
NIS Map update completed.
ellington has been setup as
an YP master server without any errors.
ypinit将从/var/yp/Makefile.dist中创建/var/yp/Makefile。当创建完成之后,假设你只在一个简单的NIS服务环境的FreeBSD机器上操作这个文件。既然test-domain有一个副服务器,你必须编辑/var/yp/Makefile文件:
ellington# vi
/var/yp/Makefile
你应当注意一下叫做`NOPUSH =“True”的那行。
设置一个NIS副服务器
设置一个NIS副服务器要比设置主服务器简单。对副服务器做日志记录然后编辑你以前所做的文件/etc/rc.conf。唯一的不同是当运行ypinit时,我们现在必须使用-s选项,所以我们的命令行看起来是这样的:
coltrane# ypinit -s
ellington test-domain
Server Type: SLAVE Domain:
test-domain Master: ellington
Creating an YP server will
require that you answer a few questions.
Questions will all be asked
at the beginning of the procedure.
Do you want this procedure to quit on non-fatal errors? [y/n:
n] n
Ok, please remember to go back and redo manually
whatever fails.
If you don't, something might not work.
There will be no further
questions. The remainder of the procedure
should take a few minutes, to copy the databases from ellington.
Transferring netgroup...
ypxfr: Exiting: Map
successfully transferred
Transferring
netgroup.byuser...
ypxfr: Exiting: Map
successfully transferred
Transferring
netgroup.byhost...
ypxfr: Exiting: Map
successfully transferred
Transferring
master.passwd.byuid...
ypxfr: Exiting: Map
successfully transferred
Transferring
passwd.byuid...
ypxfr: Exiting: Map
successfully transferred
Transferring
passwd.byname...
ypxfr: Exiting: Map
successfully transferred
Transferring group.bygid...
ypxfr: Exiting: Map
successfully transferred
Transferring
group.byname...
ypxfr: Exiting: Map
successfully transferred
Transferring
services.byname...
ypxfr: Exiting: Map
successfully transferred
Transferring rpc.bynumber...
ypxfr: Exiting: Map
successfully transferred
Transferring rpc.byname...
ypxfr: Exiting: Map
successfully transferred
Transferring
protocols.byname...
ypxfr: Exiting: Map
successfully transferred
Transferring
master.passwd.byname...
ypxfr: Exiting: Map
successfully transferred
Transferring
networks.byname...
ypxfr: Exiting: Map
successfully transferred
Transferring
networks.byaddr...
ypxfr: Exiting: Map
successfully transferred
Transferring netid.byname...
ypxfr: Exiting: Map
successfully transferred
Transferring
hosts.byaddr...
ypxfr: Exiting: Map
successfully transferred
Transferring
protocols.bynumber...
ypxfr: Exiting: Map
successfully transferred
Transferring ypservers...
ypxfr: Exiting: Map
successfully transferred
Transferring
hosts.byname...
ypxfr: Exiting: Map
successfully transferred
coltrane has been setup as
an YP slave server without any errors.
Don't forget to update map
ypservers on ellington.
你现在必须有一个叫做/var/yp/test-domain的目录。NIS主服务器的地图应当在这个目录里。你需要确定这些暂停升级。接下来你的副服务器的/etc/crontab记录将这样做:
20 * * * * root /usr/libexec/ypxfr passwd.byname
21 * * * * root /usr/libexec/ypxfr passwd.byuid
现在,在副服务器上运行命令/etc/netstart,将再次启动NIS服务器。
NIS客户机
一个NIS客户机将使用ypbind守护程序建立与一个特殊NIS服务器的绑定。Ypbind检查系统的默认域,开始在本地网络上广播RPC请求。这些请求指定了ypbind正试图建立绑定的域的名称。
如果一个服务器已配置成服务于被请求域来接收一个广播,它将对ypbind作出回应,它将记录服务器的地址。如果有几个服务器可用,ypbind将使用第一个作出回应的请求。客户系统将指挥所有它的NIS请求给那台服务器。Ypbind将偶尔“ping”服务器来确定它仍在运行。如果它在一段时间内无法接收一个回应,ypbind将标记域为不受限制的,再开始广播。
设置一个NIS客户端
把一个FreeBSD机器设置成为一个NIS客户机是很简单的。
1.
为了设置NIS域名和在网络启动时启用ypbind,需要编辑/etc/rc.conf文件然后添加下面这行:
nisdomainname=“test-domain”
nis_client_enable=“YES”
2.
要从NIS服务器输入所有可能的密码,把这行添加到你的/etc/master.passwd文件中,使用vipw:
+:::::::::
注意:这行将为每个人在NIS服务器的密码地图中添加一个正确的帐户。通过这行,有很多种方法来配置你的NIS客户端。看看下面的网络组那节了解更多信息。
更多的细节请看看O’Reilly公司出版的《Managing NFS and NIS》一书。
另外,你应当确保在你的/etc/master.passwd文件中至少有一个本地帐户,这个帐户也是wheel组的一个成员。如果NIS发生什么错误,可以用这个帐户从远程登陆,变成root后,就可以修复错误。
3.
要从NIS服务器输入所有可能的组,只需要在/etc/group文件中输入这行:
+:*::
完成这步之后,你将能够运行ypcat passwd然后看看NIS服务器的passwd地图。
17.7.5 NIS 安全
通常,任何一个远程用户都能发布一个RPC给ypserv,然后重新得到你的NIS服务器的地图,让远程用户知道你的域名。要阻止这种未授权的处理,ypserv支持叫做securenets的特性,它能被用来限制给定的一组主机的访问。一开始,ypserv将试图从一个叫做/var/yp/securenets的文件加载securenets信息。
# allow connections from
local host -- mandatory
127.0.0.1 255.255.255.255
# allow connections from
any host
# on the 192.168.128.0
network
192.168.128.0 255.255.255.0
# allow connections from
any host
# between 10.0.0.0 to
10.0.15.255
# this includes the
machines in the testlab
10.0.0.0 255.255.240.0
如果ypserv从遵守这些规则的一个地址中接收到一个请求,它将处理这个请求。如果地址不符合这个规则,请求将不被理睬,一个警告信息将被记录下来。如果/var/yp/securenets文件不存在,ypserv将允许来自其他主机的连接。
Ypserv程序也支持Wietse Venema's tcpwrapper的数据包。这允许管理员使用tcpwrapper配置文件来访问控制以代替/var/yp/securenets。
注意:所有这些访问控制机制都提供了安全性。所有的NIS相关的传输将被你的防火墙阻止。
使用的服务器可能无法服务于拥有老的TCP/IP运行机制的合法NIS客户端。当它在运行广播时,这种运行机制会把所有的主机位设置成零。或者当计算广播地址时无法获得子网掩码。当这些问题中的一些通过改变客户机的配置而被修复时,其他的问题可能迫使客户系统又发生问题,或放弃/var/yp/securenets。
以这样一种老的TCP/IP运行机制在服务器上使用/var/yp/securenets是很糟糕的,将导致一个庞大的网络丢失NIS功能。
tcpwrapper包的使用增加了你的NIS服务器的反应时间。额外的延迟可能太长而导致客户程序的超时,特别是在一个繁忙的网络上或是在一个比较慢的NIS服务器上。如果你的客户系统有不止一个发生这样的情况,你应当把受到怀疑的客户系统转移到NIS副服务器上,以迫使他们约束他们自己。
17.7.6排除一些登陆用户
在我们的实验室中,有一台叫做basie的机器,假定用来作为一台工作站。我们不想把这台机器排除在NIS域之外,然而,在主NIS服务器上的passwd文件包含了faculty和students帐户。我们该怎么办?
有一个办法可以阻止一些特殊用户来登陆这台机器,即使他们在NIS数据库中。你必须做的是在客户机器上的/etc/master.passwd文件的末尾添加-username,这儿的username是你希望阻止它登陆的用户的名字。这通常可以使用vipw来完成,它可以完全检查你的/etc/master.passwd的变化,就象你完成编辑后,重建数据库一样。例如,如果我们要阻止一个叫bill的用户登陆basie的机器,我们可以这样:
basie# vipw
[add -bill to the end, exit]
vipw: rebuilding the
database...
vipw: done
basie# cat
/etc/master.passwd
root:[password]:0:0::0:0:The super-user:/root:/bin/csh
toor:[password]:0:0::0:0:The
other super-user:/root:/bin/sh
daemon:*:1:1::0:0:Owner of
many system processes:/root:/sbin/nologin
operator:*:2:5::0:0:System
&:/:/sbin/nologin
bin:*:3:7::0:0:Binaries
Commands and Source,,,:/:/sbin/nologin
tty:*:4:65533::0:0:Tty Sandbox:/:/sbin/nologin
kmem:*:5:65533::0:0:KMem
Sandbox:/:/sbin/nologin
games:*:7:13::0:0:Games
pseudo-user:/usr/games:/sbin/nologin
news:*:8:8::0:0:News
Subsystem:/:/sbin/nologin
man:*:9:9::0:0:Mister Man
Pages:/usr/share/man:/sbin/nologin
bind:*:53:53::0:0:Bind
Sandbox:/:/sbin/nologin
uucp:*:66:66::0:0:UUCP
pseudo-user:/var/spool/uucppublic:/usr/libexec/uucp/uucico
xten:*:67:67::0:0:X-10
daemon:/usr/local/xten:/sbin/nologin
pop:*:68:6::0:0:Post Office
Owner:/nonexistent:/sbin/nologin
nobody:*:65534:65534::0:0:Unprivileged user:/nonexistent:/sbin/nologin
+:::::::::
-bill
basie#
17.7.7使用网络组
如果需要一些特殊的规则来服务少量的用户或机器的话,这个方法工作起来比较好。在比较大的网络中,你可能忘记了阻止一些用户登陆到比较敏感的机器上,或你已经把每台机器给分离开了,因此,就丧失了NIS的优势——集中化的管理。
针对这个问题的解决方案叫做网络组(netgroup)。它的目的是能够使用UNIX文件系统的普通组。主要的不同是缺少一个数字ID,和通过包括用户帐户和其他网络组来定义一个网络组的能力。
网络组被用来支持带有上百个用户和机器的大型的,复杂的网络。一方面,如果你被迫要处理这样的情形,这是好事情。另一方面,这个复杂性使得它无法使用一个简单的例子来解释网络组。这节其余的部分使用的例子将讨论这个问题。
让我们假设在你的实验室,你的成功的有关NIS的介绍引起了你的上级的兴趣。你的下一步工作是将扩展你的NIS域来覆盖校园里的其他机器。下面的两个表包含了新用户和新机器的名字。
用户名 |
描述 |
alpha,beta |
IT部门的临时雇员 |
charlie,delta |
IT部门的新实习生 |
echo,foxtrott,golf,
... |
普通雇员 |
able,baker, ... |
当前的实习生 |
用户名 |
描述 |
war,death,famine,pollution |
你的绝大多数重要的服务器。只有IT部门被允许登陆进这些机器。 |
pride,greed,envy,wrath,lust, sloth |
不太重要的服务器。所有的IT部门都允许登陆进这些机器。 |
one,two,three,four,
... |
普通的工作站。只有真正的雇员可以允许使用这些机器。 |
trashcan |
没有任何重要数据的机器。即使临时雇员也可以访问的机器。 |
如果你正设法通过分离每个用户来运行这些限制,你将必须在不允许登陆到系统的每个用户的系统passwd文件中添加-user一行。如果你只忘记了一个记录,你就会有麻烦。在最初的设置过程中这样做是切实可行的,然而,你将在日复一日的操作中忘记添加这行。
使用网络组来处理这种情形提供了几个优势。每个用户不需要被分离。你可以指派一个或更多的组,来允许或阻止组成员的登陆。如果你添加了一个新的机器,你将必须定义网络组的登陆限制。如果添加了一个新用户,你将必须添加用户给一个或多个网络组。那些变化是互相不受约束的。如果你的NIS设置计划得比较仔细,你只需要修改一个中央的配置文件来同意或拒绝访问机器。
第一步是设置NIS地图网络组的初始化。FreeBSD的ypinit程序默认状态下是不会创建这个地图的,但一旦它被创建,它的NIS运行机制就会支持它。要创建一个空的地图,只要键入:
ellington# vi
/var/yp/netgroup
然后开始添加内容。例如,我们需要至少四个网络组:IT employees,IT apprentices,
normal employees和interns.
IT_EMP (,alpha,test-domain) (,beta,test-domain)
IT_APP (,charlie,test-domain) (,delta,test-domain)
USERS (,echo,test-domain) (,foxtrott,test-domain) \
(,golf,test-domain)
INTERNS (,able,test-domain) (,baker,test-domain)
IT_EMP,IT_APP等是网络组的名称。每个括弧中的组添加了一个或多个用户帐户给它。在一个组中有三块:
1.
后面的项目的主机名是正确。如果你不指定一个主机,在所有的主机上的记录是正确的。如果你指定一个主机,你将进入一个黑暗、恐怖、充满混乱的领域。
2.
属于这个网络组的帐户的名称。
3.
帐户的NIS域。你可以从其他NIS服务器输入帐户然后进入你的网络组。
注意:网络组名超过8个字符就不能用了,特别是如果在你的NIS域中有运行其他操作系统的机器。名字是严格区分大小写的。使用大写字母来充当你的网络组名称来区分用户、机器和网络组名是一个很容易的方法。
一些NIS客户机不能处理带有大量登陆用户的网络组。例如,一些比较老版本的Sunos,如果一个网络组包含超过15个记录,就会出现问题。你可以通过创建几个少于15个用户的子网络组来解决这个问题,一个真正的网络组是由很多子网络组组成的:
BIGGRP1 (,joe1,domain)
(,joe2,domain) (,joe3,domain) [...]
BIGGRP2 (,joe16,domain)
(,joe17,domain) [...]
BIGGRP3 (,joe31,domain)
(,joe32,domain)
BIGGROUP BIGGRP1 BIGGRP2 BIGGRP3
如果你需要在一个单一的网络组中超过225个用户,你需要重复这个进程。
激活和分发你的新NIS地图是很容易的:
ellington# cd /var/yp
ellington# make
这将产生三个NIS地图netgroup,netgroup.byhost 和 netgroup.byuser。如果你的新NIS地图是可用的,可以使用ypcat来检查:
ellington% ypcat -k
netgroup
ellington% ypcat -k
netgroup.byhost
ellington% ypcat -k
netgroup.byuser
第一个命令的输出类似于/var/yp/netgroup的内容。如果你没有指定明确的主网络组,第二个命令将不会产生输出。第三个命令被用来为一个用户得到一个网络组的列表。
客户端设置很简单。要配置一个服务器war,你只需要启动vipw然后用
+@IT_EMP:::::::::
替换这行:
+:::::::::
现在,只有被netgroup IT_EMP定义的用户数据能被输入到war的密码数据库中,只有这些用户被允许登陆。
不幸的是,这个限制也适用于shell的~功能和所有转换用户名称和用户ID的程序中。另外,cd ~user将不会工作,ls -l将显示数字ID以替换用户名。要修正这个,你将必须输入所有用户的记录,不允许他们登陆进你的服务器。
这个可以通过在/etc/master.passwd文件中添加一行来完成。这行将包含+:::::::::/sbin/nologin,意味着输入所有的记录,但用/sbin/nologin来替换shell。你可以通过在你的/etc/master.passwd文件中放置一个默认的值在passwd的记录替换任何一个。
修改完,如果有一个新的雇员加入到IT department,你将必须修改一个NIS地图。你将可以象这样在它们的本地/etc/master.passwd版本中通过替换old +:::::::::来使用一个相似的针对一些不重要的服务器访问:
+@IT_EMP:::::::::
+@IT_APP:::::::::
+:::::::::/sbin/nologin
对于普通工作站的相应的行是这样的:
+@IT_EMP:::::::::
+@USERS:::::::::
+:::::::::/sbin/nologin
接着,一切都将变得很好,除非几个星期以后有一个总的方针的改变:IT department要雇佣实习生,IT实习生被允许使用普通的工作站和一些不重要的服务器。IT学徒被允许登陆到主服务器。你需要添加一个新的网络组IT_INTERN,给这个网络组添加新的IT实习生,开始在这台机器上修改配置......有句老话:“Errors in centralized planning
lead to global mess”。
NIS的从其他网络组创建网络组的功能可以用来解决这种情形。一个可能是基于角色的网络组的创建。例如,你可以查一个叫做BIGSRV的网络组来定义针对一些重要服务器的登陆限制。这些包含网络组的网络组被允许登陆这些机器。你的NIS地图的网络组的新的记录是这样的:
BIGSRV IT_EMP IT_APP
SMALLSRV IT_EMP IT_APP ITINTERN
USERBOX IT_EMP ITINTERN USERS
如果你能用同样的限制来定义机器的组,这个定义登陆限制的方法会工作得很好。不幸的是,这是一个例外,不是一个惯例。大多数情况下,你将需要在每台机器上定义登陆限制的能力。
特定机器的网络组定义可能是由于基本方针发生了变化。在这个例子中,每个机器的/etc/master.passwd文件都包含以“+”开始的两行。他们中的第一个用允许登陆到这台机器的帐号添加了一个网络组,第二个添加了所有用/sbin/nologin作为shell的其他帐户。使用机器名ALL-CAPS的版本作为网络组的名称是个好主意。另外,这行看起来是这样的:
+@BOXNAME:::::::::
+:::::::::/sbin/nologin
一旦你对所有你的机器完成了这个任务,你将不必再修改/etc/master.passwd的本地版本。所有更深入的修改可以通过修改NIS地图来完成。这儿是一个网络组地图的例子。
# Define groups of users
first
IT_EMP (,alpha,test-domain) (,beta,test-domain)
IT_APP (,charlie,test-domain) (,delta,test-domain)
DEPT1 (,echo,test-domain) (,foxtrott,test-domain)
DEPT2 (,golf,test-domain) (,hotel,test-domain)
DEPT3 (,india,test-domain) (,juliet,test-domain)
ITINTERN (,kilo,test-domain) (,lima,test-domain)
D_INTERNS (,able,test-domain) (,baker,test-domain)
#
# Now, define some groups based on roles
USERS DEPT1 DEPT2 DEPT3
BIGSRV IT_EMP IT_APP
SMALLSRV IT_EMP IT_APP
ITINTERN
USERBOX IT_EMP ITINTERN USERS
#
# And a groups for a
special tasks
# Allow echo and golf to
access our anti-virus-machine
SECURITY IT_EMP (,echo,test-domain) (,golf,test-domain)
#
# machine-based netgroups
# Our main servers
WAR BIGSRV
FAMINE BIGSRV
# User india needs access
to this server
POLLUTION BIGSRV (,india,test-domain)
#
# This one is really
important and needs more access restrictions
DEATH IT_EMP
#
# The anti-virus-machine
mentioned above
ONE SECURITY
#
# Restrict a machine to a
single user
TWO (,hotel,test-domain)
# [...more groups to follow]
如果你使用多种数据库来管理你的用户帐户,你将能够用你的数据库的报告工具创建第一部分的地图。这样,新的用户将自动访问你的机器。
最后一点忠告:使用基于机器的网络组是不明智的。如果你正在为学生实验室配置几百台同样的机器,你可以使用基于角色的网络组来代替基于机器的网络组以确保NIS地图的大小保持在一个合理的限制之内。
17.7.8需要记住的一些重要事情
现在,仍有许多与你所在的NIS环境不同的事情要做。
1.
每次你希望给实验室添加一个用户,你必须把它添加到一个主NIS服务器,然后你必须重建NIS地图。如果你忘记了这样做,新的用户将不能登陆。例如,如果我们需要添加一个新的用户jsmith到实验室,我们将:
# pw useradd jsmith
# cd /var/yp
# make test-domain
你也可以运行adduser jsmith来代替pw
useradd jsmith。
2.
把管理员帐户排除在NIS地图之外。你不要把管理员帐户和密码传给那些无权访问那些服务器的用户的机器。
3.
确保NIS主服务器和从服务器的安全,减少它们的当机机会。
这是一个任何中央管理系统都有的主要缺点,大概也是最重要的缺点。如果你不能保护好你的NIS服务器,你将会有很多愤怒的用户!
17.7.9 NIS v1兼容性
FreeBSD的ypserv已经支持服务NIS v1客户端了。FreeBSD的NIS的运行机制只使用NIS v2协议,然而,它也向后兼容老系统使用的V1协议。守护程序提供了这些系统的ypbind守护程序将设法建立一个与NIS v1服务器的绑定。注意,当提供了普通客户端呼叫的支持时,ypserv的这个版本不使用v1地图传输请求了。因此,它不能被用来作为一个主或从服务器来与比较老的使用V1协议的NIS服务器连接起来。但幸运的是,今天,已经没有这样的服务器在使用了。
17.7.10充当NIS 客户端的NIS服务器
注意,当在多服务器域上运行ypserv时,服务器也是NIS客户机。迫使服务器绑定它们自己而不是允许它们广播绑定的请求,可能会让它们互相之间绑定。一些奇怪的错误模式可能是由一个服务器当掉和其他机器过分依赖它而导致的。最终,所有的客户机将超时,然后试图绑定其他服务器,但由于延迟时间太长,而导致错误模式仍然存在。
你可以通过运行ypbind加-S标记来迫使一个主机绑定一个特定的服务器。如果你不想每次重新启动NIS服务器时都手工这样做,你可以在/etc/rc.conf文件添加下面这两行:
nis_client_enable="YES"
# run client stuff as well
nis_client_flags="-S
NIS domain, server"
看看ypbind的联机手册了解更多信息。
17.7.11 libscrypt
v.s. libdescrypt
当你正试图运行NIS时,可能会遇到的非常普通的事情是加密(crypt)库的兼容性。如果你的NIS服务器使用DES
crypt库,它将只支持使用DES的客户机。要检查你的服务器和客户机正在使用哪个时,可以看看在/usr/lib中的连接。如果一台机器被配置成使用DES库,可以这样做:
% ls -l /usr/lib/*crypt*
lrwxrwxrwx 1 root wheel 13 Jul 15 08:55 libcrypt.a@ ->
libdescrypt.a
lrwxrwxrwx 1 root wheel 14 Jul 15 08:55 libcrypt.so@ ->
libdescrypt.so
lrwxrwxrwx
1 root wheel 16 Jul 15 08:55
libcrypt.so.2@ -> libdescrypt.so.2
lrwxrwxrwx 1 root wheel 15 Jul 15 08:55 libcrypt_p.a@ ->
libdescrypt_p.a
-r--r--r-- 1 root wheel 13018 Nov 8 14:27 libdescrypt.a
lrwxr-xr-x 1 root wheel 16 Nov 8 14:27 libdescrypt.so@ -> libdescrypt.so.2
-r--r--r-- 1 root wheel 12965 Nov 8 14:27 libdescrypt.so.2
-r--r--r-- 1 root wheel 14750 Nov 8 14:27 libdescrypt_p.a
如果机器被配置成使用标准的FreeBSD MD5 crypt库,可以这样做:
% ls -l /usr/lib/*crypt*
lrwxrwxrwx 1 root wheel 13 Jul 15 08:55 libcrypt.a@ ->
libscrypt.a
lrwxrwxrwx 1 root wheel 14 Jul 15 08:55 libcrypt.so@ ->
libscrypt.so
lrwxrwxrwx 1 root wheel 16 Jul 15 08:55 libcrypt.so.2@
-> libscrypt.so.2
lrwxrwxrwx 1 root wheel 15 Jul 15 08:55 libcrypt_p.a@ ->
libscrypt_p.a
-r--r--r-- 1 root wheel
6194 Nov 8 14:27
libscrypt.a
lrwxr-xr-x 1 root wheel 14 Nov 8 14:27 libscrypt.so@ -> libscrypt.so.2
-r--r--r-- 1 root wheel
7579 Nov 8 14:27
libscrypt.so.2
-r--r--r-- 1 root wheel
6684 Nov 8 14:27
libscrypt_p.a
如果你在一个NIS客户机上有验证问题,这是一个寻找问题的好地方。如果要为一个不同的网络配置一个NIS服务器,你将必须在所有系统中使用DES,因为它是最普通的标准。
17.8 DHCP
17.8.1什么是DHCP?
DHCP,动态主机配置协议,描述了一个系统连接到网络,然后获得必须的通信信息的方法。FreeBSD使用ISC(Internet Software Consortium)DHCP运行机制,所以这儿所有的运行信息是使用ISC的版本。
17.8.2这节包含些什么
这节将只描述与FreeBSD集成在一起的DHCP系统的一部分。因此,服务器的一部分没有被描述。除了下面的参考以外,DHCP联机手册是很有用的资源。
17.8.3它如何工作
DHCP client,在客户机上运行,它开始广播配置信息的请求。默认的,这些请求在UDP68端口。服务器在UDP 67端口作回复,给客户机一个IP地址,和其他如子网掩码、路由、DNS服务器的相关网络信息。所有这些信息以DHCP“lease”的形式出现。在这种方式中,客户机的旧IP地址不再连接到网络,而是自动收回。DHCP客户机能获得很多来自服务器的信息。一个详尽的列表可以在dhcp-options的联机手册中找到。
17.8.4 FreeBSD综合
FreeBSD完全集成了ISC DHCP客户端,dhclient。DHCP客户端支持在安装和基本系统中被提供,消除了在任何运行一个DHCP服务器的网络中需要详细的网络配置知识的要求。Dhclient已经被包含在3.2以后的FreeBSD发行版中了。
DHCP被sysinstall支持。当在sysinstall中配置一个网络接口时,第一个要问的问题是“Do you want to try DHCP configuration of this
interface?”肯定的回答是运行dhclient,如果成功了,将自动添加网络配置信息。
启动时就使用DHCP,你必须要做两件事:
确信bpf设备被编译进内核。你需要在内核配置文件中添加pseudo-device bpf,然后重建内核。更多详细信息,请参考第9章。
默认情况下,Bpf设备已经在GENERIC内核中了。所以如果你没有定制内核,你不需 要为了让DHCP工作而创建一个。
编辑包含下面行的/etc/rc.conf文件:
ifconfig_fxp0=“DHCP”
注意:确信你想动态配置的接口名称已经替换了fxp0。
如果你使用针对dhclient的不同定位,或如果你希望传递额外的标记给dhclient,也要包括下面这些:
dhcp_program=“/sbin/dhclient”
dhcp_flags=““
DHCP服务器,dhcpd在ports collection中被包含在isc-dhcp2 port中。这个port包含了全部ISC DHCP的发行组件,从客户端到服务器,传输代理和文件。
17.8.5 文件
/etc/dhclient.conf
Dhclient要求有一个配置文件/etc/dhclient.conf。典型的这些文件只包含注释。这个配置文件在dhclient.conf的联机手册上有描述。
/sbin/dhclient
Dhclient静态连接在/sbin。
/sbin/dhclient-script
dhclient-script是FreeBSD指定的DHCP客户端配置脚本。它在dhclient-script(http://www.freebsd.org/cgi/man.cgi?query=dhclient-script&sektion=8)中描述,但不需要用户做任何修改。
/var/db/dhclient.leases
DHCP客户端保存了一个数据库在这个文件中作为一个日志。dhclient.leases(http://www.freebsd.org/cgi/man.cgi?query=dhclient.leases&sektion=5)给出了一个比较长的描述。
17.9 DNS
17.9.1概要
FreeBSD使用一个叫做BIND(Berkeley Internet Name Domain)的程序来运行DNS协议。DNS是一个用来映射IP地址的协议。例如,运行www.FreeBSD.org将返回一个The
FreeBSD Project's web服务器的IP地址的回应,而运行ftp.FreeBSD.org将返回一个相应的FTP机器的IP地址。
DNS通过一个复杂的root域名服务器和其他小范围的域名服务器来定位到internet上。这篇文章参考了BIND8.x。BIND9.x可以在net/bind9 port中安装。
RFC1034 和 RFC1035规定了DNS协议。当前,BIND主要由Internet
Software Consortium (www.isc.org)维护。
17.9.2 术语
要理解这篇文章,一些与DNS相关的术语应当要了解:
术语 |
定义 |
forward
DNS |
将主机名映射为IP地址 |
origin |
为特殊的区域文件引用隐藏的域 |
named,bind,name server |
FreeBSD中为BIND命名的服务器软件包的一般名称 |
resolver |
一台机器为区域信息查询名字服务器的系统进程 |
reverse
DNS |
与DNS相反,把IP地址映射为主机名 |
root
zone |
照字面意思,一个“.”,指 root或开始区域。所有其他的区域跟在后面,就象所有的文件都跟在root目录后一样。它是internet区域层次结构的开始。 |
zone |
每一个单独的域,子域,或区域都有DNS来指示 |
区域(zone)的例子:
. 是根区域
org.是根区域下的一个区域
foobar.org是org. 区域下的一个区域
foo.foobar.org.是foobar.org. 区域下的一个区域中的子域
1.2.3.in-addr.arpa是一个参照了所有3.2.1.* 下面的IP地址的区域
正如你所看到的,一个主机名的比较特殊的部分显示在它的左边。例如,foobar.org.要比org.特殊,因为org.要比root区域还要特殊。一个主机名的每个部分的设计更象一个文件系统:/dev目录就在root下面。
17.9.3运行域名服务器的原因
域名服务器通常有两种形式:一个认证的域名服务器,和一个带有缓存的域名服务器。
一个认证的域名服务器:
需要服务全球的DNS信息,针对查询的正式回复。
注册一个域名,例如foobar.org,IP地址需要被指派给主机名。
需要与DNS记录相对应的一个IP地址块(IP到主机名)。
一个备份的域名服务器,叫做slave。当主机停掉或无法访问时,需要对此作出回应。
一个带有缓存的域名服务器:
一个本地DNS服务器要比一个外部的域名服务器反应更快。
在网络传输量很大时,做一些限制是必要的。
当查询www.FreeBSD.org时,通常需要向上搜索ISP的域名服务器,然后重新获得回应。对于一个本地的带有缓存的域名服务器,查询必须通过缓存的域名服务器才能与外部网络进行联系。既然信息已经被缓存起来,每一个查询将不需要指望本地网络的外部连接。
17.9.4它如何工作
在FreeBSD中,BIND程序被叫做named。
文件 |
描述 |
named |
BIND守护程序 |
ndc |
名称守护程序的控制程序 |
/etc/namedb |
BIND区域信息放置的目录 |
/etc/namedb/named.conf |
守护程序配置文件 |
区域文件通常被包含在/etc/namedb目录下,被域名服务器服务的区域信息包含在DNS中。
17.9.5 启动BIND
既然BIND是默认安装的,配置它就很简单了。要保证在启动时就启用named程序,可以把下面这行加到/etc/rc.conf中:
named_enable=“YES”
要手动启动程序
# ndc start
17.9.6 配置文件
17.9.6.1
make-localhost
确信在/etc/namedb/localhost.rev中正确地创建了本地相反的DNS区域文件:
# cd /etc/namedb
# sh make-localhost
17.9.6.2
/etc/namedb/named.conf
// $FreeBSD$
//
// Refer to the named(8)
manual page for details. If you are
ever going
// to setup a primary
server, make sure you've understood the
hairy
// details of how DNS is
working. Even with simple mistakes, you can
// break connectivity for
affected parties, or cause huge amount of
// useless Internet traffic.
options {
directory “/etc/namedb”;
// In addition to the
“forwarders” clause, you can force your name
// server to never initiate
queries of its own, but always ask its
// forwarders only, by enabling the following line:
//
// forward only;
// If you've got a DNS
server around at your upstream provider,
enter
// its IP address here, and enable the line below. This will make you
// benefit from its cache, thus reduce overall DNS traffic in the
Internet.
/*
forwarders {
127.0.0.1;
};
*/
就象注释中所说的,它受益于这个缓存,传输在这儿被启用。在通常的情况下,一个域名服务器将循环地查询internet寻找某个域名服务器,直到它找到了它要找的答案。把这个启用之后,将会让它先向上查询域名服务器,然后使用它的缓存。如果向上的有问题的域名服务器有很大的通信量,启用快速域名服务器是很有必要的。
警告:127.0.0.1在这儿不能工作。在你连接时把这改成一个域名服务器。
/*
* If there is a firewall between you and name servers you want
* to talk to, you might need to uncomment the
query-source
* directive below. Previous
versions of BIND always asked
* questions using port 53,
but BIND 8.1 uses an unprivileged
* port by default.
*/
// query-source address * port 53;
/*
* If running in a sandbox,
you may have to specify a different
* location for the dumpfile.
*/
// dump-file “s/named_dump.db”;
};
// Note: the following will
be supported in a future release.
/*
host { any; } {
topology {
127.0.0.0/8;
};
};
*/
// Setting up secondaries
is way easier and the rough picture for this
// is explained below.
//
// If you enable a local
name server, don't forget to enter 127.0.0.1
// into your
/etc/resolv.conf so this server will be queried first.
// Also, make sure to enable it in /etc/rc.conf.
zone “.” {
type hint;
file “named.root”;
};
zone “0.0.127.IN-ADDR.ARPA”
{
type master;
file “localhost.rev”;
};
zone
“0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.INT”
{
type master;
file “localhost.rev”;
};
// NB: Do not use the IP
addresses below, they are faked, and only
// serve
demonstration/documentation purposes!
//
// 例secondary config entries. It can be convenient to become
// a secondary at least for
the zone where your own domain is in.
Ask
// your network administrator
for the IP address of the responsible
// primary.
//
// Never forget to include
the reverse lookup (IN-ADDR.ARPA) zone!
// (This is the first bytes
of the respective IP address,
in reverse
// order, with “.IN-ADDR.ARPA” appended.)
//
// Before starting to setup
a primary zone, better make sure you fully
// understand how DNS and
BIND works, however. There are sometimes
// unobvious pitfalls. Setting up a secondary is comparably
simpler.
//
// NB: Don't blindly enable
the 例s below. :-) Use actual names
// and addresses instead.
//
// NOTE!!! FreeBSD runs
bind in a sandbox (see named_flags in rc.conf).
// The directory containing
the secondary zones must be write accessible
// to bind. The following sequence is suggested:
//
// mkdir
/etc/namedb/s
// chown bind:bind
/etc/namedb/s
// chmod 750
/etc/namedb/s
在一个sandbox中有关运行BIND的信息,可以看看在sandbox中运行named的说明。
/*
zone “domain.com” {
type slave;
file
“s/domain.com.bak”;
masters {
192.168.1.1;
};
};
zone
“0.168.192.in-addr.arpa” {
type slave;
file “s/0.168.192.in-addr.arpa.bak”;
masters {
192.168.1.1;
};
};
*/
在named.conf中,这些是针对早期的相反区域的副记录的例子。在每个服务的新区域中,一个新的区域记录必须被添加到named.conf中。例如,最简单的区域记录foobar.org是这样的:
zone “foobar.org” {
type master;
file “foobar.org”;
};
这个区域是一个主服务器,可以通过类型声明来显示。
zone “foobar.org” {
type slave;
file
“foobar.org”;
};
在slave例子中,区域信息作为特殊的区域从主域名服务器被传输,在被指定的文件中被保存。当主服务器死了或无法访问,副域名服务器将替换主服务器来提供服务。
区域(zone)文件
一个针对foobar.org的区域文件(存在于/etc/namedb/foobar.org)是这样的:
$TTL 3600
foobar.org. IN SOA
ns1.foobar.org. admin.foobar.org. (
5
; Serial
10800
; Refresh
3600
; Retry
604800
; Expire
86400 )
; Minimum TTL
; DNS Servers
@ IN NS
ns1.foobar.org.
@ IN NS
ns2.foobar.org.
; Machine Names
localhost IN A 127.0.0.1
ns1
IN A 3.2.1.2
ns2
IN A 3.2.1.3
mail IN A 3.2.1.10
@
IN A 3.2.1.30
; Aliases
www
IN CNAME @
; MX Record
@
IN MX 10
mail.foobar.org.
注意,每个后面有一个“.”的域名是一个正确的域名,没有一个点将无法参考它的来源。例如,www被翻译成www+来源。在我们的假设的区域文件中,我们的区域是foobar.org.,所以www将传输到www.foobar.org。
一个区域文件的格式是这样的:
recordname
IN recordtype value
绝大多数使用DNS记录:
SOA
区域认证的开始
NS
一个认证的域名服务器
A
一个主机地址
CNAME
用一个规范的名字作为一个别名
MX
邮件交换
PTR
一个域名指示器
foobar.org. IN SOA
ns1.foobar.org. admin.foobar.org. (
5
; Serial
10800
; Refresh after 3 hours
3600
; Retry after 1 hour
604800
; Expire after 1 week
86400
)
; Minimum TTL of 1 day
foobar.org.
域名,也是这个区域文件的来源:
ns1.foobar.org.
这个区域的主/认证域名服务器
admin.foobar.org.
这个区域的可信任的管理员,email地址用@来替换
(<admin@foobar.org> becomes
admin.foobar.org)
5
这个文件的序列号。这必须在每次每个区域文件修改时增加。现在,每个管理员都喜欢用yyyymmddrr格式来作为序列号。2001041002意思是上次修改的时间是04/10/2001,后面的02是这天的第2次修改。序列号是很重要的。
@ IN NS
ns1.foobar.org.
这是一个NS记录。每个将回复认证信息的域名服务器必须有这样一个记录。这儿的@是给foobar.org的。@将转换成来源。
localhost IN A 127.0.0.1
ns1
IN A 3.2.1.2
ns2
IN A 3.2.1.3
mail
IN A 3.2.1.10
@
IN A 3.2.1.30
A记录指出了机器的名字。就象上面看到的,ns1.foobar.org将指定给3.2.1.2。另外,来源符号@在这儿也被使用,然而,foobar.org将指定给3.2.1.30。
www
IN CNAME @
规范的名称记录通常被用来给一台机器以别名的。在这个例子中,www被别名成与来源联系的机器地址,或foobar.org (3.2.1.30)。CNAME能被用来提供别名主机名。
@ IN
MX 10 mail.foobar.org.
MX记录指出了哪个邮件服务器可以用来接受邮件。mail.foobar.org是邮件服务器的主机名,10成了那台邮件服务器的优先权。
如果有几个邮件服务器,它们的优先权是3,2,1。一个试图分发给foobar.org的邮件服务器将先运行最高级优先权MX,然后是第二优先权,依次类推,直到邮件被正确分发完。
对于in-addr.arpa的区域文件,也可以使用同样的格式,除了使用PTR记录来代替A或CNAME。
$TTL 3600
1.2.3.in-addr.arpa. IN SOA
ns1.foobar.org. admin.foobar.org. (
5
; Serial
10800
; Refresh
3600
; Retry
604800 ; Expire
3600 )
; Minimum
@ IN NS ns1.foobar.org.
@ IN NS ns2.foobar.org.
2 IN PTR ns1.foobar.org.
3 IN PTR ns2.foobar.org.
10 IN PTR mail.foobar.org.
30 IN PTR foobar.org.
这个文件得到了上面我们假设的域的域名映射的Ip地址。
17.9.7 缓存域名服务器
缓存域名服务器(caching name server)是一个不需要认证的域名服务器。它只要对它自己做一个简单的查询,以后使用时就记住了。要设置一个,只需要象平常配置域名服务器一样,省略掉包含的区域。
17.9.8 在Sandbox中运行named
为了添加更多的安全性,你需要在sandbox中运行named。这将减少潜在的危害。如果你在它的命令行包含一个sandbox目录,named将在完成处理这个命令行时chroot进那个目录。默认的FreeBSD安装包含一个带有group的用户bind。如果我们要在/etc/namedb/sandbox目录中添加一个sandbox,可以这样运行:
# /usr/sbin/named -u
bind -g bind -t /etc/namedb/sandbox <path_to_named.conf>
为了成功运行named,下一步将很好地运行。通过下面的讨论,我们将假设你的sandbox的路由是/etc/namedb/sandbox。
创建sandbox的目录: /etc/namedb/sandbox
创建其他必须的目录: etc 和 var/run
拷贝/etc/localtime 到sandbox/etc
确定在sandbox中的所有文件和目录的拥有者为bind:bind:
# chown -R bind:bind
/etc/namedb/sandbox
# chmod -R 750 /etc/namedb/sandbox
当你在sandbox中运行named时,你需要知道一些事情:
你的named.conf文件和所有你的区域文件必须在sandbox中。
为了在日志信息中有正确的时间,sandbox/etc/localtime是必须的。
named将它的进程ID写入到一个sandbox/var/run文件中。
用于通信的unix socket将被创建在sandbox/var/run中。
当使用ndc工具时,通过使用# ndc -c /etc/namedb/sandbox/var/run/ndc,你必须指定你在sandbox中创建的Unix socket的位置,
如果你启用了日志文件,那日志文件必须在sandbox中。
如果下面一行在/etc/rc.conf文件中,named可以在sandbox中被正确启动:
named_flags=“-u bind -g
bind -t /etc/namedb/sandbox <path_to_named.conf>“
17.9.9如何使用域名服务器
如果安装正确,域名服务器能通过网络和本地机器来访问。/etc/resolv.conf必须用本地IP地址包含一个域名服务器的记录,所以它将先寻找本地域名服务器。
要通过网络访问它,机器必须在它自己的域名服务器配置选项中将IP地址设置正确。
17.9.10安全
虽然BIND是最常用的DNS运行程序,但也有很多安全方面的问题。一些可能的或可利用的安全漏洞有时可以被找到。
提示:如果一个问题出现了,需要及时地寻找修复错误的源代码,并作出修补。
17.9.11更深入的阅读
BIND/named联机手册:ndc,named,named.conf
Official
ISC Bind Page(http://www.isc.org/products/BIND)
BIND
FAQ(http://www.nomium.com/resources/faqs/bind-faqs.html)
O'Reilly
DNS and BIND 4th Edition(http://www.oreilly.com/catalog/dns4)
RFC1034
- Domain Names - Concepts and Facilities(ftp://ftp.isi.edu/in-notes/rfc1034.txt)
RFC1035
- Domain Names - Implementation and Specification(ftp://ftp.isi.edu/in-notes/rfc1035.txt)
17.10 NTP
17.10.1 概要
随着时间的过去,计算机的时钟可能会发生漂移(走快或走慢),计算机时钟变得不再正确。NTP (Network Time Protocol)是一种确保计算机时钟正确的方法。
许多Internet服务依赖于或得益于精确的计算机时钟。例如,一个web服务器如果它在同一时间被修改了的话,那它就可以接受一个发送文件的请求。像cron这样的服务需要在一个给定的时间内运行命令。如果时钟发生错误,这些命令就无法象我们所期望的那样运行。
FreeBSD包含了ntpd NTP服务器,它可以用来查询其他的NTP服务器以便与为你的机器设置时钟或为其他机器提供时钟服务。
17.10.2 选择适当的NTP服务器
为了同步你的时钟,你需要一个或多个NTP服务器。你的网络管理员或ISP可以为你提供这个服务。下面是一个可以提供这种服务的NTP服务器列表。确信你明白你选择的服务器的规则,如果需要的话,需要请求权限。
1.
http://www.cert.org
2.
http://www.FreeBSD.org/handbook/eresources.html#ERESOURCES-MAIL
3.
http://www.eecis.udel.edu/~mills/ntp/servers.htm
17.10.3配置你的机器
基本配置
如果你希望在启动机器时就同步你的时钟,你可以使用ntpdate。这对那些频繁重启和很少要求同步的一些桌面机器是比较适合的,但绝大多数的机器会运行ntpd。
对于那些运行ntpd的机器来说,在启动时使用ntpdate也是一个好主意。无论机器的当前时钟与正确时钟之间的变化有多大,Ntpd会逐渐地改变时钟,而ntpdate会固定时钟。
要在启动时启用ntpdate,需要在/etc/rc.conf中添加一行ntpdate_enable=“YES”
你也需要在ntpdate_flags中指定所有你希望同步的和所有已被传递给ntpdate的服务器。
通用配置
NTP可以用在ntp.conf中描述的格式通过/etc/ntp.conf文件来配置,这儿是一个简单的例子:
server
ntplocal.example.com prefer
server
timeserver.foobar.org
server
ntp2a.example.net
driftfile
/var/db/ntp.drift
server选项指定了哪个服务器将被使用。如果一个服务器被指定为prefer,就象ntplocal.example.com,那这个服务器就比其他服务器更有优先权。如果它与其他服务器的响应很不同,那从那个有优先权的服务器接受的响应将被丢弃。首选项一般都是给具有高精度的NTP服务器使用的。
Driftfile选项指定了哪个文件被用来储存系统时钟的频率偏置。Ntpd使用这个来自动补偿时钟的自然漂移,即使它与外部时钟源断开了一段时间,也可以让它保持一个具有相当正确的设置。
Driftfile选项指定了哪个文件被用来存储有关先前来自你正在使用的NTP服务器的回应。这个文件包含了针对NTP的内部信息。它不会被任何其他处理所修改。
控制访问你的服务器
默认情况下,你的NTP服务器将可以访问internet上的所有主机。在ntp.conf文件中的一些限制选项允许你控制哪台机器能够访问你的服务器。
如果你想拒绝所有的机器访问你的NTP服务器,添加下面这行到/etc/ntp.conf:
restrict
default ignore
如果你只想在你自己网络内的机器同步他们的时钟,当不让他们配置服务器或作相反的同步,添加下面这行:
restrict
192.168.1.0 mask 255.255.255.0 notrust nomodify notrap
这儿的192.168.0.1是你网络中的一个IP地址,而255.255.255.0是你网络的子网掩码。
/etc/ntp.conf可以包含多个限制选项。更多细节,可以参看ntp.conf的访问控制支持单元。
17.10.4 运行NTP服务器
要确保NTP服务器在启动时就启动,需要在/etc/rc.conf中添加一行:
xntpd_enable=“YES”
如果你希望传递额外的标记给ntpd,可以在/etc/rc.conf中编辑xntpd_flags参数。
如果在不重新启动机器的情况下启动服务的话,运行ntpd,确保在/etc/rc.conf中从xntpd_flags指定一些其他的参数,例如。
# ntpd -p
/var/run/ntpd.pid
17.10.5以一个临时的Internet连接使用ntpd
ntpd不需要永久地连接到Internet就可以完成功能。然而,如果你使用的临时连接是按照按需拨出配置的,这是一个好主意,因为它可以阻止NTP通信触发连接而导致连接长时间在线。如果你使用用户级PPP,你可以在/etc/ppp/ppp.conf中使用过滤指示器。例如:
set filter
dial 0 deny udp src eq 123 # Stop NTP from starting a dial out
set filter
dial 1 permit 0 0
set filter
alive 0 deny udp src eq 123 # Stop inbound NTP traffic from
keeping
the connection open
set filter
alive 1 deny udp dst eq 123 # Stop outbound NTP traffic from
keeping
the connection open
set filter
alive 2 permit 0/0 0/0
更多细节,可以在ppp的联机手册中看看PACKET
FILTERING那节,和在/usr/share/example/ppp/中例子。
注意:一些ISP会阻断一些低速端口,阻止NTP回应到达你的机器。
17.10.6 更多信息
有关NTP服务器的文档可以在/usr/share/doc/ntp中找到。
17.11网络地址转换
17.11.1 概要
FreeBSD的网络地址转换程序,通常以natd最为著名,它是一个接收IP数据包,把本地机器改为数据源,然后再把这些数据包重新变为IP数据流。Natd通过改变IP地址和端口源来完成这些,以便当数据被接收回来的时候,它能决定数据的源定位,然后返回它的最初的请求。NAT的最普通用法是internet连接共享。
17.11.2 设置
由于在IPv4协议基础上,可用的IP地址越来越少,而且随着cable和 DSL这样的宽带接入用户的越来越多,人们更加需要用到internet连接共享。通过使用natd来使用连接共享可以使几台机器通过一个IP地址来访问因特网,这是一个很好的选择。
要这样做,在Iternet上的FreeBSD机器必须充当一个网关。这个网关机器必须有两个NIC-一个用于连接到路由器,另一个用于连接到内部局域网。所有在局域网上的机器需要通过一个hub或交换机连接起来。
这样设置,那些无法访问internet的机器可以通过这个网关来访问外部网络。
17.11.3配置
下面这个选项必须存在于内核配置文件中:
options IPFIREWALL
options IPDIVERT
另外,作为选择,下面几项也是可以的:
options
IPFIREWALL_DEFAULT_TO_ACCEPT
options
IPFIREWALL_VERBOSE
下面几项必须在/etc/rc.conf文件中:
gateway_enable=“YES”
firewall_enable=“YES”
firewall_type=“OPEN”
natd_enable=“YES”
natd_interface=“fxp0”
natd_flags=““
gateway_enable=“YES” |
把机器设为一个网关。运行sysctl -w net.inet.ip.forwarding=1也是同样的结果。 |
firewall_enable=“YES” |
在启动时在/etc/rc.firewall文件中启用防火墙规则。 |
firewall_type=“OPEN” |
这个指定一个预先确定什么可以进入的防火墙规则。 看看/etc/rc.firewall了解更多情况。 |
natd_interface=“fxp0” |
确定哪个接口是传输数据包的。(连接internet的接口) |
natd_flags=“” |
在启动时通过natd的任何额外选项。 |
前面在文件中的定义将在启动时运行natd-接口是fxp0。这也可以手动运行。
在lan后面的每台机器和接口将在私人网络空间中被分派IP地址,它会有一个默认的natd机器的内部IP地址网关。
例如,LAN中的客户机a,b有IP地址192.168.0.2 和192.168.0.3。而natd机器的LAN接口有一个IP地址192.168.0.1。客户机a,b的默认网关就是natd机器的IP地址,192.168.0.1。natd机器的内部或外部接口都不需要作任何修改就可以工作。
17.11.4端口重定向
Natd的缺点是LAN客户端不能从internet访问。在LAN中的客户端能够使机器与外部世界连接,但不能接收输入信息。如果你设法在某台客户机器上运行internet服务,这将是一个问题。一个简单的方法是在natd机器上重新选择internet端口到一个LAN机器上。
例如,一个IRC服务器运行在客户机A上,一个web服务器运行在客户机B上。如果这样正确工作,连接接收在端口6667上(irc),80必须被重新定位到各自的机器上。
-redirect端口必须用适当的选项被传给natd。语法是这样的:
-redirect_port proto targetIP:targetPORT[-targetPORT]
[aliasIP:]aliasPORT[-aliasPORT]
[remoteIP[:remotePORT[-remotePORT]]]
在上面的例子中,结论是这样的:
-redirect_port tcp 192.168.0.2:6667 6667
-redirect_port tcp 192.168.0.3:80 80
这将重新把适当的端口定位为LAN客户机。
-redirect端口被用来指出端口的范围。例如,tcp 192.168.0.2:2000-3000
2000-3000将重新定位所有在端口2000 到3000上的接收数据的连接。
当直接运行natd或用/etc/rc.conf中的选项替换的话,这些选项可以被使用
natd_flags=“”
更多的配置选项,请参看natd的联机手册。
17.11.5地址重定向
如果几个IP可以使用,地址重定向是很有用的,然而,他们必须在一台机器上。基于这点,natd可以分配每个LAN客户机一个它自己的扩展IP地址。Natd接着用适当的扩展IP地址从LAN客户端重新写入输出数据包,然后重新把所有的接收数据在一个特殊的IP地址上返回给指定的LAN客户机。这以静态NAT出名。例如,IP地址128.1.1.1, 128.1.1.2, 和128.1.1.3属于natd网关机器。128.1.1.1能被用作natd网关机器的扩展IP地址,而128.1.1.2, 和128.1.1.3被转回LAN客户机A和B。
-redirect地址的语法是这样的:
-redirect_address localIP publicIP
localIP |
LAN客户端的内部IP地址。 |
publicIP |
与LAN客户端对应的外部IP地址。 |
在这个例子中:
像-redirect端口,这些标记被定位在/etc/rc.conf中。对于地址重定向,既然所有的在特殊IP地址上接收的所有数据已经被重定向,那端口重定向就不需要了。
在natd机器上的扩展IP地址必须是active的,对于外部的接口用别名。参考rc.conf配置文件。
17.12 inetd(超级服务器)
17.12.1 概要
Natd被称为“Internet
Super-Server”,因为它管理几个守护程序的连接。提供网络服务的程序通常作为守护程序。inetd充当一个其他程序的管理服务器。当一个连接被inetd接收时,它将决定连接将前往哪个程序。运行一个inetd的例子,通过独立地运行每个守护程序来减少系统的负载。
起初,inetd用来产生其他程序,但几个普通的协议将直接被使用,如chargen,auth,和daytime。
这节将通过它的命令行选项和它的配置文件-/etc/inetd.conf介绍配置inetd的基础知识。
17.12.2 设置
inetd将通过/etc/rc.conf系统来进行初始化。inetd_enable选项默认被设置成”NO”,但通过sysinstall可以被多次打开。
inetd_enable=“YES”
或
inetd_enable=“NO”
inetd在启动时可以被启用或禁用。另外,不同的命令行选项能够通过inetd_flags选项来传给inetd。
17.12.3命令行选项
inetd语法:
inetd [-d] [-l] [-w] [-W] [-c maximum] [-C rate] [-a address |
hostname] [-p filename] [-R rate] [configuration file]
-d
打开调试。
-l
打开成功连接的日志。
-w
打开TCP包装作为扩展服务(默认的)。
-W
打开TCP包装作为inetd内建的内部服务(默认的)。
-c maximum
指定默认的每个设备的最大的并发访问数量。默认是无限的。
-C rate
指定默认的在一分钟内从一个简单的IP地址调用一个服务所需的最大时间。默认是无限的。
-R rate
指定在一分钟内调用一个服务所需的最大时间。默认是256。0允许被无限制地调用。
-a
指定一个特殊的绑定IP地址。一个主机名可以被指定。
当IPv4 和IPv6绑定都想要时,每个希望绑定的协议被要求为在/etc/inetd.conf中的每个服务。例如,一个基本的TCP服务将需要两个记录,一个用作tcp4协议,另一个用作tcp6协议。
-p
指定一个交替的文件用来存储进程ID。
这些选项可以在/etc/rc.conf中使用inetd_flags选项来传给inetd。默认的,inetd_flags被设置成“-wW”,这可以为inetd的内部和外部服务打开TCP包装。对于新手来说,这些参数不需要被修改或在/etc/rc.conf中被键入。
17.12.4 inetd.conf
inetd的配置可以通过/etc/inetd.conf文件来控制。
当/etc/inetd.conf作了修改的时候,inetd能够通过发送一个HangUP信号给inetd进程来重新读取它的配置文件:
例 18-4.发送一个HangUP信号给inetd
# kill -HUP `cat
/var/run/inetd.pid`
配置文件的每一行会指定一个不同的程序。在文件中的注意可以在这行前加上一个”#”号。/etc/inetd.conf的格式是这样的:
service-name
socket-type
protocol
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute]]
user[:group][/login-class]
server-program
server-program-arguments
一个使用IPv4的ftpd程序的记录是:
ftp stream tcp nowait root
/usr/libexec/ftpd ftpd -l
service-name
这是特殊程序的服务名。它必须在/etc/services文件中指定一个服务。这个决定了哪个inetd 的端口必须被侦听。如果一个新的服务被创建,它必须先在/etc/services文件中设置。
socket-type
无论是stream,dgram,raw,还是seqpacket。数据流必须被用来作为基础连接,TCP程序,而dgram被用来作为利用UDP的传输协议。
protocol
其中之一:
协议 |
说明 |
tcp, tcp4 |
TCP IPv4 |
udp, udp4 |
UDP IPv4 |
tcp6 |
TCP IPv6 |
udp6 |
UDP IPv6 |
tcp46 |
Both TCP IPv4 and v6 |
udp46 |
Both UDP IPv4 and v6 |
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute]]
wait|nowait指出了调用inetd的程序是否能够利用它自己的socket。dgram
socket类型必须使用wait选项,而数据流socket程序通常是多线程的,应当使用nowait。Wait通常提交多个socket给一个简单的程序,而nowait给每个新socket产生一个子程序。
子程序inetd可以产生的最大数目可以使用max-child选项来设置。除此之外,另一个限制从一个简单的地方到一个特殊的程序的限制最大连接的选项能被启用。 max-connections-per-ip-per-minute就是这样做的。这儿的十将限制任何特殊的连接到一个特殊服务的IP地址的次数保持在每分钟10次。这是阻止有意或无意的资源消耗和DoS攻击很有用的。在这个领域中,wait或nowait是强制性的,max-child 和max-connections-per-ip-per-minute是可选择的。一个没有任何max-child或max-connections-per-ip-per-minute限制的多线程程序将是:nowait
带有十个程序的最大限制的同样的程序将读成:nowait/10
另外,同样的每分钟每个IP地址限制在20个连接的设置和十个子程序的最大限制将读成:nowait/10/20
这些选项可以通过默认的fingerd程序设置来完成,请看下面:
finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd
fingerd -s
user
用户是运行特殊程序的用户名。通常情况下,程序运行在root下。出于安全目的,它可以找到一些以程序用户的身份来运行的一些服务器,或至少没有用户使用的。
server-program
当连接被接受时,被运行的程序的完全路由。如果程序是被inetd所提供的一个服务,那内部的将被使用。
server-program-arguments
这个工作通过指定argument来连接服务程序,用aargv[0]来启动,在启动时直接传到程序。如果mydaemon -d是命令行,mydaemon -d将是服务程序的值。另外,如果程序是一个内部服务,在这儿使用internal。
17.12.5 安全
在安装时请选择安全选项,许多inetd程序可能默认是被启用的。如果对于一个特殊的程序没有特殊的需要,可以把它禁掉!可以在有问题的程序前面加上一个“#”,然后发送一个hangup信号给inetd。一些程序,如fingerd,根本就不需要。因为他们会给攻击者提供很多信息。
一些守护程序是没有安全意识的,或者是长时间的,不存在超时的连接的。这样会让攻击者发送一些连接请求给一个特殊的守护程序,因而就有了可用的资源。在某个程序上放上ip-per-minute 和max-child限制可能是一个好主意。
17.12.6 其他方面
daytime,time,echo,discard,chargen和auth都是inetd提供的服务。
auth服务提供了一致的(ident,identd)网络服务,被配置成某个程度。参考inetd的联机手册了解更深入的信息。