当前位置: 首页 > 科技观察

使用NIS和NFS管理UNIX网络

时间:2023-03-21 22:25:35 科技观察

我想大多数UNIX网络管理员或多或少都有类似这样的烦恼:一个用户需要在多个不同的UNIX上登录,保存自己的文件等,而管理员必须在每个UNIX系统上给他创建一个账号,设置密码,设置组信息,创建一个目录,这样他就可以在所有的机器上正常工作了。同时需要建立FTP服务器。每次用户都必须将自己的文件保存在这个FTP服务器上,然后在登录到另一个UNIX系统时,再从FTP服务器上取回自己需要的文件。这样不仅麻烦,而且管理起来也很不方便,因为哪天员工一旦离职,管理层就会去各个UNIX系统删除他的账号和文件,保证他不能在那些机器上登录。而且有些系统信息的管理也很不方便,比如每台机器上的hosts文件,必须在每台机器上创建一个相同的hosts文件,才能保证所有机器的机器名和IP地址的对应关系是正确的.但是一旦某天某台机器需要更改其IP地址,管理员就必须为每台UNIX机器更改其主机文件。从上面的问题可以看出,我们改的东西大部分都是一模一样的,同一个账号,同一个目录,同一个hosts文件。如果机器少,就什么都没有。一旦你管理超过200个单位,那么你可能一整天都在做这些重复的事情。也许你要问,那些大型网络的UNIX管理员是用什么方法来解决这些问题的?当然,他们不可能为每台机器更改这些设置。他们使用了我们今天要介绍的NIS和NFS服务。下面我们将向大家介绍在FreeBSD中建立NIS和NFS服务的思路和方法。(注:以下是我们的实验环境)cat.mydomain.nisOpenBSD3.3NIS和NFS客户端dog.mydomain.nisFreeBSD4.8NIS主服务器和NFS服务器(保存账户信息,组信息和用户文件)bee.mydomain.nisFreeBSD4.5NIS辅助服务器1.使用NIS共享系统信息NIS是SunMicrosystem公司开发的用于在UNIX系统之间共享用户数据、组数据、主机数据、协议等数据的服务系统。最开始叫YelloPage,后来因为商标冲突被Sun改名为NIS,不过很多地方都叫YP。由于NIS的出现极大地促进了UNIX的网络管理,现在几乎所有的UNIX系统都支持它。当然,FreeBSD系统也不例外。FreeBSD目前主要提供NISv2,同时也提供对NISv1的兼容支持。我们可以看到,如果一个用户要在多个UNIX系统上工作,大部分都是使用同一个用户名,属于同一个组,使用同一个密码。那么我们就可以把这些信息存储在一台机器上统一管理,其他机器就从这台机器上获取这些信息。一旦需要更改用户信息,管理员只需要将信息保存在存储信息的机器上即可。进行更改,其他机器会自动收到更改后的信息,无需管理员一一设置。这是NIS工作的基本方式。NIS使用域来管理需要共享的信息。这些信息足以成为NIS数据库,所有拥有相同域名的机器都可以共享该域名的数据库。这些数据库存储在一台机器上,这台机器是NIS的主服务器,其他机器用它来查询NIS数据库,但有时为了稳定起见,也可以建立一台或多台辅助NIS服务器。它们与NIS主服务器保持数据同步,并在主服务器发生故障时承担主服务器的角色。让我们来看看如何在FreeBSD中设置NIS主服务器。首先,由于NIS是基于域进行管理的,因此需要为服务器设置一个域名。你可以通过domainname查看你当前的域名(注:这里的域名和DNS的域名没有关系,它只是连接一个网络,可以分为几个部分,所以可以是任意值,当然你也可以设置为你的DNS域名):dog#domainnamemydomain.nis如果上面显示为空,说明你还没有设置你的域名,你也可以通过domainname:dog#domainname来设置和更改你的域名mydomain.nis域名设置完成后,开始进入下面的工作。默认情况下,FreeBSD将各个域的NIS数据库存放在/var/yp/你的域名下,你需要复制你要共享的信息,比如master。默认情况下,MD5用于加密用户密码。因此,如果你在一个有多个UNIX系统的网络中,而有些UNIX不支持MD5加密,你需要将你的密码加密方式改为这些UNIX支持的加密方式。方法(如DES),否则用户将无法在那些机器上登录。更改FreeBSD默认加密方式的方法如下:dog#vi/etc/login.conf然后编辑用户所在的类(不指定则为默认类),然后添加:passwd_format=des:\(其中des代表DES加密,md5代表MD5加密,blf代表Blowfish加密),例如:default:\:passwd_format=des:\:datasize=infinity:\...保存后exiting,需要用cap_mkdb生成BD(BerkeleyDatabase)格式的数据库文件:dog#cap_mkdb/etc/login.conf这会更新(或生成)/etc目录下的login.conf.db文件。现在我们只是更改了密码的默认加密方式,而真正的密码并没有改变,所以我们需要使用passwd命令更改每个需要共享的用户的密码,然后将master.passwd复制到/var/yp目录,为了安全,你应该更改master.passwd文件的权限:dog#cp/etc/master.passwd/var/yp/master.passwddog#chmod0600/var/yp/master.passwd也在考虑安全因素,最好删除那些你不需要也不应该共享的用户(比如:root用户和系统默认用户bin,daemon等)现在我们可以初始化我们的NISmasterserver,用ypinit初始化(8)命令:dog#cd/var/ypdog#ypinit-mmydomain.nis这里-m表示生成主服务器,mydomain.nis是你的域名。在初始化过程中,您将被问到一些问题:您是否希望此过程在出现非致命错误时退出?[y/n:n]直接选择n,然后设置NIS服务器的名称,包括primaryserver和secondaryserver,因为这里我们只有一台primaryserver,所以按Ctrl-D直接退出。如果您计划构建多个辅助服务器,请输入您的NIS辅助服务器的名称。然后将显示您的服务器信息:当前的NIS服务器列表如下所示:dog.mattcell.com是否正确?[y/n:y]如果没有错误,选择y然后进入初始化过程,这个过程中会有一些错误信息,但是忽略它,这是因为你的NIS服务进程(ypserv)还没有开始了。完成后会提示:dog.mattcell.com已成功设置为YP主服务器。这意味着您的NIS主服务器已经初始化。现在我们需要启动我们的NIS守护进程:ypserv(8),因为ypserv使用RPC服务,所以我们需要先运行portmap(8)来使用它的RPC服务,如果用户需要在客户端机器上更改密码,我们需要在NIS服务器上运行rpc.yppasswdd(8)守护进程:dog#portmapdog#ypservdog#rpc.yppasswdd为了让这些命令在系统启动时自动启动,需要在/etc中添加以下内容/rc.conf设置:portmap_enable="YES"nisdomainname="mydomain.nis"nis_server_enable="YES"nis_yppasswdd_enable="YES"现在我们的NIS主服务器启动并运行,您可以使用以下命令测试它的工作:dog#ypbind启动NIS客户端支持程序dog#ypcatpasswd查询NIS服务器上的/etc/passwd信息dog#ypcatmaster.passwd查询NIS服务器上的/etc/master.passwd信息dog#ypcatgroup查询/etc/passwd上的信息NISserver/groupinformationdog#ypcathostsquery/etc/hosts上NISserverdog的信息#ypcatnetworks查询NISserverdog/etc/networks信息#ypcatnetgroup查询NISserverdog/etc/netgroup信息#ypcatservices查询NISserverdog/etc/services信息#ypcatprotocols查询/etc/NIS服务器上的协议信息dog#ypcatypservers查询NIS服务器信息dog#killall-9ypbind关闭NIS客户端支持程序客户端共享此信息。首先确保客户端的NIS域名与NIS服务器的域名一致。因为客户端需要查询NIS服务器上的信息,所以需要在客户端启动一个守护进程ypbind(8)来提供对NIS的支持。同样,ypbind也使用RPC服务,所以在运行之前需要先运行portmap(8)Process:cat#domainnamemydomain.niscat#portmapcat#ypbind这里cat机器会向网络发送广播寻找NISmaster服务器。同样,你也可以在rc.conf中添加这些信息,让它们自动运行:nisdomainname="mydomain.nis"portmap_enable="YES"nis_client_enable="YES"nis_client_flags="-Smydomain.nis,dog.mydomain.nis,bee.mydomain.nis”这里的nis_client_flags是设置NIS域名为mydomain.nis,并设置NIS服务器列表:dog.mydomain.nis,bee.domain.nis,这对那些远程用户很有帮助,因为在这个caseif依赖ypbind使用广播来寻找服务器是比较困难的。接下来需要设置系统使用NIS接受用户信息,需要在/etc/master.passwd的末尾添加:+::::::::这样,如果一个用户是在本机(cat.mydomain.nis)登录本机,登录会先检查本地是否有用户的账号信息,如果有就使用本地信息,如果没有就通过NIS获取。同理,如果要共享组信息,需要在/etc/group最后一行添加:+:*::也可以共享NIS服务器上的hosts信息,需要添加nis查询/etc/host.conf中的选项:#$FreeBSD:src/etc/host.conf#首先尝试/etc/hosts文件主机#其次使用YP/NISnis#现在尝试DNSbind以便当您尝试查询IP地址时对于一台机器,系统会先尝试在/etc/hosts中寻找相应的记录,如果没有找到,就通过NIS查询NIS主服务器上的hosts文件,如果没有找到,则使用DNS查找。(注意:/etc/host.conf在FreeBSD5.0之后已经被/etc/nsswitch.conf代替)现在可以使用dog.mydomain.nis服务器上的账号登录cat.mydomain.nis机器了这里:FreeBSD(i386)Login:matthewPasswd:注意,因为我们还没有在cat.mydomain.nis上为用户matthew创建HOME目录,所以这时候会提示找不到HOME目录,忽略它,因为我们稍后会解决这个问题。如果客户端想要更改您在NIS服务器上的密码,您可以使用yppasswd(1)来更改它(需要在服务器上运行rpc.yppasswdd守护程序):matthew@cat$yppasswdChangingNISpasswdformatthewondog.mydomain。nis.OldPassword:NewPassword:Retypenewpasswd:NIS密码已在dog.mydomain.nis上更改。让我们看看如何更改NIS服务器上的NIS数据库。如果我们更改NIS服务器上的一些数据(如:添加用户,添加组等)注意:更改master.passwd后,必须将/etc/master.passwd重新复制到/var/yp目录下,不需要的用户将被删除),NIS客户端不能立即使用更改的数据,因为NIS数据库存储在/var/yp/yourdomainname下,所以我们需要更新NIS数据库:dog#cd/var/ypdog#make然后make会自动根据Makefile更新NIS数据库,注意,因为NIS数据库是实时查询的,所以不需要重启ypserv守护进程。搭建NIS辅助服务器如果担心自己的NIS主服务器工作不稳定,用户无法登录,那么可以搭建一个或多个NIS辅助服务器,其搭建方法比较简单。首先还是初始化,但是因为它的NIS数据库是直接从主服务器上获取的,所以直接在你想做副服务器的机器上执行:bee#cd/var/ypbee#ypinit-sdog。我的域名.ns我的域名。nis其中-s指定NIS主服务器的名称,后面的mydomain.nis表示要初始化的NIS域名(即从服务器的NIS域名)。然后修改从服务器上的/etc/rc.conf,使NIS服务自动运行。同时,为了让从服务器在主服务器上的数据发生变化时自动同步,需要启动NIS同步进程rpc.ypxfrd:portmap_enable="YES"nisdomainname="mydomain.nis"nis_server_enable="YES"nis_yppasswd_enable="YES"nis_ypxfrd_enable="YES"同时,为了支持同步数据传输,需要在master服务器上稍微改动一下设置,因为默认设置只考虑一台NIS服务器的情况.我们需要在/var/yp/Makefile中注释掉NOPUSH="True":#NOPUSH="True"如果之前初始化主服务器的时候没有准备安装从服务器,所以没有输入名字副服务器,而你现在要使用副服务器,那么你可以通过以下方法添加你的副服务器:dog#cd/var/ypdog#viypservers添加你的副服务器名称,这里我们的副服务器名称是bee.mydomain.nis:dog.mydomain.nisdog.mydomain.nisbee.mydomain.nisbee.mydomain.nis现在,每次主服务器更新时,您的辅助服务器都会自动保持数据同步。NISAdvancedSettings在上面的例子中,我们让NIS主服务器上的所有用户都可以在NIS客户端(此时是cat)上登录,那么是不是只允许部分用户登录,或者不允许部分用户登录呢?羊毛布?答案是肯定的,当我们要允许某个用户登录时,可以在master.passwd中添加如下内容:allowedto这里如果+号后面没有指定用户名,系统默认允许所有用户登录。这就是上面的情况。如果要禁止某个用户登录:-badman::::::::::表示禁止NIS服务器上的badman(-)登录本机。注意,因为系统处理master.passwd是从第一行开始匹配的,一旦匹配到某一行,就不会处理后面的几行,所以如果要禁止部分用户登录,允许其他所有用户登录,必须使用-user::::::::::写在+:::::::::之前,否则用户仍然可以登录系统:-badman::::::::-hacker::::::::+::::::::::以上设置使得其他用户可以登录,除了NIS服务器上的badman和hacker不能登录这些机器。另一种情况是我只允许部分用户登录我的系统,不让其他用户登录,但是我也要保证用户信息和NIS服务器上的服务信息一致,这样才可以使用id等时正确显示用户的用户名和组名,也可以使用以下方法实现,在客户端的/etc/master.passwd后添加:+matthew:::::::::+guest:::::::::/home/ftp:+:::::::::/sbin/nologin上面的设置使Matthew可以在本机登录,guest也可以登录in,但是它的HOME目录会被移到/home/ftp,其他用户的shell改成/sbin/nologin,所以其他用户无法登录,但同时可以同步这些用户的信息NIS服务器。#p#2。使用NFS共享目录NFS也是SunMicrosystem开发的用于UNIX系统之间共享文件的网络服务系统。与NIS一样,大多数UNIX系统也支持它。文章开头我们提到了用户每次都需要从FTP下载文件的问题。现在我们可以使用NFS来解决这个问题。我们可以将某台机器的某个文件(文件夹)共享给其他机器使用。上面讲到NIS的时候,我们注意到当我们使用NIS主服务器上的用户登录其他UNIX机器时,会提示找不到用户的HOME目录,所以我们使用NFS将/复制到NIS主服务器。共享home目录,然后在每个UNIX客户端上挂载到本机的/home,这样就可以解决找不到用户HOME目录的问题,而且无论用户在哪台机器登录,他们可以直接进入自己的工作环境,使用自己的文件。下面让我们来实现具体的工作。首先rootmannfsd,我们可以知道nfsd(8)只是处理了NFS协议,真正的远程挂载(共享)功能是由mountd(8)完成的,mountd通过/etc/exports设置共享目录。exports(5)中的每一行代表第一个共享设置,第一行有以下三部分:第一部分是设置要共享的目录或目录列表,多个目录共享时用空格隔开每个目录。第二部分是共享参数,比如设置只读共享,映射到账户等。第三部分是设置可以访问共享的主机或者主机列表,多个主机之间用空格隔开。下面以共享NIS服务器(dog.mydomain.nis)的/home目录为例,说明如何准备导出:dog#cat/etc/exports/home-maproot=daemon-network192.168.7.0-mask255.255。255.0其中/home是我们要共享的目录,-maproot=daemon是共享参数,意思是本地UNIX系统使用远程/home目录时,将本地root账户的uid映射到daemon和远程机器上的gid映射为空,这意味着当我们以root身份访问dog上的/home目录时,我们的身份将转换为远程主机dog上守护进程的身份。下面的-netmask=192.168.7.0-mask=255.255.255.0设置可以访问这些共享资源的主机为192.168.7.0/255.255.255.0子网内的所有机器。可以设置的共享参数有很多,比较有用的有:-mapall=将所有本地账户映射到远程主机上的指定账户,-ro以只读方式共享文件夹(默认为读写)其他parameters你可以通过manexports得到它,这里有一个列表。现在我们的共享资源已经通过/etc/exports设置好了,接下来就是启动NFS家庭进程nfsd和远程共享进程mountd。由于NFS也和NIS一样使用RPC,所以在启动NFS之前需要先启动portmap进程。:dog#portmap如果已经启动就不再需要这一步dog#nfsd-n5dog#mountd其中nfsd-n5中的-n参数是指定同时创建多少个服务副本,可以选择4-6,这有利于提高NFS系统性能,但也不能太高,否则会占用大量资源。现在NFS已经启动成功,可以通过showmount(8)查询你的共享资源:dog#showmount-elocalhost/home192.168.7.0这说明我们的NFS服务器已经正确启动了,接下来就是安装到客户终端已设置。在客户端,我们使用mount_nfs将远程主机共享的目录挂载到本地,因为本例中我们要将远程主机(dog)的/home目录挂载到客户端(cat)的/home目录)来保证系统用户的数据是同步的,所以我们进行如下操作:cat#mount_nfsdog:/home/home此时远程共享目录/home已经挂载到本地/home目录,我们可以看到mount_nfs与其他挂载命令不同的是,它不使用设备名(如/dev/ad0s1),而是使用hostname:/sharedir来表示挂载源,其中hostname是远程主机的主机名或IP地址。现在我们再次使用Matthew账号(这个账号存在于NIS服务器dog.mydomain.nis上),在cat.mydomain.nis登录:FreeBSD(i386)Login:matthewPasswd:matthew$pwd/home/matthew现在我们可以看到,我们现在可以在cat上看到dog机器上的所有文件了,当然之前的找不到用户HOME目录的错误信息现在也没有了。可以看出,通过NIS和NFS,管理员在UNIX网络中管理用户账号等信息是非常方便的,因为所有的修改只需要在一台机器上进行,其他机器会自动改变。同时,对于用户而言,只需一个账号即可登录任意一台主机,不再需要使用麻烦的FTP在不同主机之间传输文件,用户在每台机器上的文件会自动保持更新。【编者推荐】在RHEL中配置NIS服务器和客户端5RHEL上NIS网络信息服务配置示例RHEL5.1主/从NIS服务器配置及测试详解