NIS 服务器端主要在于提供数据库给客户端作为验证之用,并且服务器端因为数据库的来源又可分为 master/slave 两大类。底下我们将会介绍这两种服务器的安装方式哩!
由于 NIS 服务器需要使用 RPC 协议,且 NIS 服务器同时也可以当成客户端, 因此他需要的套件就有底下这几个:
- yp-tools :提供 NIS 相关的查寻指令功能
- ypbind :提供 NIS Client 端的设定套件
- ypserv :提供 NIS Server 端的设定套件
- portmap :就是 RPC 一定需要的数据啊!
如果你是使用 Red Hat 的系统,例如我们的 CentOS 4.x 的话,那你可以利用『 rpm -qa | grep ‘^yp‘ 』 来检查是否有安装上述的套件。一般来说 yp-tools, ypbind 都会主动的安装,不过 ypserv 可能就不会安装了。 此时建议你直接使用『
yum install ypserv 』来安装吧!立刻就装好了。底下立刻来设定啰!
NIS 的设定真是很简单,首先,你必须要在 NIS master 这部服务器上面搞定你的账号与密码相关数据, 这包括 /etc/passwd, /etc/shadow, /etc/hosts, /etc/group .... 等等,都得要先搞定才行! 详细的账号相关资料请参考
基础篇的账号管理章节。 等到搞定之后你就可以继续 NIS 服务器的设定了:
- 设定 NIS 的域名 (NIS domain name)
因为所有的 NIS server/client 都需要设定 NIS 领域名才行,所以就设定吧!设定的方式很简单, 直接以 nisdomainname 这个指令来下达即可。(其实 nisdomainname 与 ypdomainname 及 domainname 都是一模一样的指令啦!你只要记住一个指令名称即可。请自行 man domainname 吧!)
[root@linux ~]# nisdomainname [NIS 领域名]
参数:
若没有加上领域名,则会显示出目前的 NIS 领域;
[root@linux ~]# nisdomainname vbirdnis
[root@linux ~]# nisdomainname
vbirdnis <==瞧!已经设定了 NIS 领域名啰!
|
如果确定每次开机时都需要启动这个 NIS 领域名的话,直接写到 /etc/rc.d/rc.local 去:
[root@linux ~]# vi /etc/rc.d/rc.local
# 加入底下这一行:
/bin/nisdomainname vbirdnis
|
若是想要在启动 NIS 时就自动设定好 NIS 领域的话,可以利用 /etc/sysconfig/network 这个档案,写成如下所示的模样:
[root@linux ~]# vi /etc/sysconfig/network
# 加入底下这一行:
NISDOMAIN=vbirdnis
|
如此一来,你的服务器就会在开机时,或者是在启动 NIS 相关服务时,就能够自行设定好 NIS 领域啰!
这个配置文件就是 NIS 服务器最主要的配置文件啦!内容其实很简单,你可以保留默认值即可。 不过,也可以作一些更动啦!
[root@linux ~]# vi /etc/ypserv.conf
dns: no
# NIS 服务器的使用时机绝大部分都是在局域网络内而已,所以不需要 DNS 系统,
# 只要 /etc/hosts 设定正确即可!!
files: 30
# 预设会有 30 个数据库被读入内存当中,因为我们的账号档案其实不多,
# 30 个已经足够使用了!
slp: no
slp_timeout: 3600
# 这两个与 SLP 服务有关,因为我们仅使用单纯的 NIS ,所以不需要启动。
xfr_check_port: yes
# 这个与 master/slave 有关,将同步更新的数据库比对所使用的端口,
# 放置于小于 1024 的埠口内。
# 底下则是设定限制客户端或 slave server 查询的权限,利用冒号隔成四部分,分别为:
# [主机名/IP] : [NIS域名] : [可用数据库名称] : [安全限制]
# [主机名/IP] :可以使用 network/netmask 如 192.168.1.0/255.255.255.0
# [NIS域名] :例如本案例中的 vbirdnis
# [可用数据库名称]:就是由 NIS 制作出来的数据库名称;
# [安全限制] :包括没有限制 (none)、仅能使用 <1024 (port) 及拒绝 (deny)
# 一般来说,你可以依照我们的网域来设定成为底下的模样:
127.0.0.0/255.255.255.0 : * : * : none
192.168.1.0/255.255.255.0 : * : * : none
* : * : * : deny
# 星号 (*) 代表任何数据都接受的意思。上面三行的意思是,开放 lo 内部接口、
# 开放内部 LAN 网域,且杜绝所有其他来源的 NIS 要求的意思。
# 万一上面这三行权限相关的设定无法让你的 NIS 顺利的生效时,
# 你可以先将上面三行批注,然后加入底下这一行:
* : * : * : none
# 这样应该就能够让 NIS 顺利的联机了。
|
- 设定主机名 (/etc/hosts) 与建立信任群组 (/etc/netgroup)
在 /etc/ypserv.conf 的设定当中我们谈到 NIS 大部分是给局域网络内的主机使用的, 所以当然就不需要 DNS 的设定了。不过,由于 NIS 使用到很多的主机名,
所以你一定要设定好 /etc/hosts 对应,否则会无法成功联机 NIS ! 这个很重要,绝大部分的朋友无法达成 NIS server/client 的联机都是这里出问题而已。 依据本案例的设定值,你应该这样做:
[root@linux ~]# vi /etc/hosts
192.168.1.2 master.vbirdnis
192.168.1.10 slave.vbirdnis
192.168.1.100 client.vbirdnis
|
注意!如果你的主机名与 NIS 的主机名不一样,那么在这个档案当中还是需要将你的主机名给他设定进来! 否则在后面数据库的设定时,肯定会发生问题。当然啦,你也可以直接在 /etc/sysconfig/network 当中直接重新设定主机名,然后重新启动,或者是利用 hostname 这个指令重新设定你的主机名也可以。
除了这个设定之外,有时候你可能需要设定 /etc/netgroup ,虽然比较新的 distributions 都可以略过这个档案的检查了,不过建议您还是可以了解一下的啦!这个 /etc/netgroup 档案可以记录在我们网域里面被信任的群,这个档案的内容当中,每一行都有三个字段,分别以逗号『,』隔开,意义为:
<host>,<user>,<domain>
主机,用户账号,领域名
|
事实上,如果这个档案是『空的』的话,那么代表着『全部的主机、账号与领域名都接受』的意思,因为我们已经在 /etc/ypserv.conf 里头设定好了关于安全的项目了,所以这个档案只要建立即可(本来是不存在的!):
[root@linux ~]# touch /etc/netgroup
|
接下来当然是先启动所有相关的服务啰,这包括 RPC, ypserv 以及 yppasswdd 啰! 不过,如果你的 RPC 本来就已经启动的话,那就不要重新启动 portmap 了!
[root@linux ~]# /etc/init.d/portmap start
[root@linux ~]# /etc/init.d/ypserv start
[root@linux ~]# /etc/init.d/yppasswdd start
|
注意,主要的 NIS 服务是 ypserv ,不过,如果要提供 NIS 客户端的密码修改功能的话, 最好还是得要启动 yppasswdd 这个服务才好。在启动完毕后,我们可以利用 rpcinfo 来检查看看:
[root@linux ~]# rpcinfo -p localhost
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100004 2 udp 942 ypserv
100004 1 udp 942 ypserv
100004 2 tcp 945 ypserv
100004 1 tcp 945 ypserv
100009 1 udp 950 yppasswdd
[root@linux ~]# rpcinfo -u localhost ypserv
program 100004 version 1 ready and waiting
program 100004 version 2 ready and waiting
|
要出现上述的画面才表示正确的启动了 ypserv 喔!若有需要开机立即启动 ypserv 的话,请使用 chkconfig 来处理吧!
在完成了上面的所有步骤后,接下来我们得要开始将主机上面的账号档案转成数据库档案啦! 转换的动作直接透过 /usr/lib/yp/ypinit 这个指令来处理即可!整个步骤是这样做的:
[root@linux ~]# /usr/lib/yp/ypinit -m
At this point, we have to construct a list of the hosts which will run NIS
servers. master.vbirdnis is in the list of NIS server hosts. Please continue
to add the names for the other hosts, one per line. When you are done with the
list, type a <control D>.
next host to add: master.vbirdnis <==这个地方系统会主动捉到
next host to add: <==按下 [ctrl]-d
The current list of NIS servers looks like this:
master.vbirdnis
Is this correct? [y/n: y] y
We need a few minutes to build the databases...
Building /var/yp/vbirdnis/ypservers...
Running /var/yp/Makefile...
gmake[1]: Entering directory `/var/yp/vbirdnis‘
Updating passwd.byname...
....中间省略....
gmake[1]: Leaving directory `/var/yp/vbirdnis‘
master.vbirdnis has been set up as a NIS master server.
Now you can run ypinit -s master.vbirdnis on all slave server.
|
要注意出现的信息当中,在告知你可以直接输入 [ctrl]-d 以结束的那个地方, 你的主机名会主动的被捉出来,注意!这个主机名务必需要在 /etc/hosts 可以被找到 IP 的对应, 否则会出现问题。另外,万一在执行 ypinit -m 时,出现如下的错误,那肯定就是有些数据没有被建立了!
gmake[1]: *** No rule to make target `/etc/aliases‘, needed by
`mail.aliases‘. Stop.
gmake[1]: Leaving directory `/var/yp/vbirdnis‘
make: *** [target] Error 2
Error running Makefile.
Please try it by hand.
[root@linux ~]# touch /etc/aliases
# 解决方法很简单吶!缺少什么档案,就 touch 他就是了!
[root@linux ~]# /usr/lib/yp/ypinit -m
# 然后再重新执行一次即可!
|
如果是如下的错误,那可能是因为:
- 你的 ypserv 没有顺利启动,请利用 rpcinfo 检查看看;
- 你的主机名没有对应好,请检查 /etc/hosts
gmake[1]: Entering directory `/var/yp/vbirdnis‘
Updating passwd.byname...
failed to send ‘clear‘ to local ypserv: RPC: Program not
registeredUpdating passwd.byuid...
failed to send ‘clear‘ to local ypserv: RPC: Program not
registeredUpdating group.byname...
....
|
建立了数据库后,你必需要通知 ypserv 与 yppasswdd 这两支服务,告知数据库已经被更改了, 所以你可以这样做:
[root@linux ~]# /etc/init.d/ypserv restart
[root@linux ~]# /etc/init.d/yppasswdd restart
|
要注意啊,如果你的用户密码有变动过,那么你就得要重新制作数据库,重新启动 ypserv 及 yppasswdd 喔! 注意注意啊!
- 与 slave server 及数据库有关的一些设定 (optional)
当我们执行了 ypinit -m 之后,所有的主机上面的账号相关档案会被转成数据库档案, 这些数据库会被放置到 /var/yp/"nisdomainname" 当中,我们的 nisdomainname 是 vbirdnis , 所以被建立的数据库通通被放置到 /var/yp/vbirdnis/ 目录中啰!您可以自行去检查看看。
事实上,我们的 ypinit 其实是透过 /var/yp/Makefile 来进行数据库的建立的呢! 所以,我们当然也就可以藉由该档案内的功能来处理某些特定档案的更新啰! 举例来说,若妳仅修改了一个使用者的账号参数而已,所以仅有 /etc/passwd 有被变更过, 那么如何仅针对这个档案进行数据库的更新呢?你可以这样做:
[root@linux ~]# cd /var/yp
[root@linux yp]# make passwd
Updating passwd.byname...
Updating passwd.byuid...
|
这样做就能够更新了,只不过更新后的数据库会被放置到 /var/yp 当中,而不是 /var/yp/vbirdnis 当中, 或许妳还得需要手动移动一下该档案就是了。
再者,如果你有 slave 服务器的话,总是需要进行 master/slave 的同步化吧? 那如何告知我们的 master 服务器将数据库提供给 slave 呢?这个时候就得要修改 /var/yp/Makefile 啰! 您可以自行进入该档案内查阅一些资料,不过,基本上你只要改一个地方就好了:
[root@linux ~]# vi /var/yp/Makefile
# 找到底下这一行:
NOPUSH=true
# 将他改成这样:
NOPUSH=false
|
这个设定值可以将数据库给他『推 (push)』到其他的 slave 服务器上头!接下来,你必需要告知 master 要推出去的数据库是给哪部服务器?所以,你还得要修改这里:
[root@linux ~]# vi /var/yp/ypservers
master.vbirdnis
slave.vbirdnis
# 增加上头这一行!
|
你可以将所有的 slave 服务器都加到 /var/yp/ypservers 档案当中,只要记得该服务器的 IP 必需要在 /etc/hosts 内可以找到对应才行喔!如果你要提供 master/slave 服务器的数据库文件传输时, 那么还需要启动 ypxfrd 这个服务才行!这个服务可以让 slave 服务器主动链接上 ypxfrd 来更新数据库, 可以免除系统管理原自己手动更新啦!启动方式太简单了吧!
[root@linux ~]# /etc/init.d/ypxfrd start
|
做到这里就 OK 啦!您的 NIS Master 服务器已经搞定啰!接下来,您就可以准备处理 slave 服务器,或是直接处理 NIS client 端啰!此外,如果您的 master 机器想要直接将某些特定的数据库直接传给 slave 主机的话, 那么可以使用 yppush 这个指令喔!例如下列范例:
[root@linux ~]# yppush -h slave.vbirdnis passwd.*
|
如果 master/slave 的数据库不符合的话,那么该 passwd.byname 及 passwd.byuid 就会同步更新了! 很简单吧! ^_^!也就是说,您得先要制作数据库,然后再利用 yppush 来处理数据库的同步啊! 亦即是:
- 先以 useradd username 或 passwd username 等制作出 master 上面的实体用户;
- 再以 make 或者直接以 /usr/lib/yp/ypinit -m 来制作出最新的数据库;
- 利用 yppush 这个指令功能来进行数据库的传输。
如此一来,您就不需要进行 slave 上面的其他数据库处理啦!方便又简单!
参考
图一的 NIS 运作流程当中,我们知道由于
NIS 服务器预设还是会先搜寻自己的 /etc/passwd, /etc/shadow 等信息,因此你最好先将 NIS slave 的账号与密码数据作个简单的修订,让他保留在比较干净的账号数据,例如仅有系统账号 (UID 小于 500 内的系统账号) 就是一个不错的环境。这样可以避免 UID 重复出现的问题 (在 /etc/passwd 及 NIS 的环境中都出现相同的 UID ,但其相关参数却并相同时,可能有困扰)。
NIS slave 的设定要比 NIS master 简单多了,事实上,很多设定都一样!你甚至可以复制 NIS master 的很多配置文件哩!在你处理完 NIS slave 服务器的账号密码相关档案后,接下来你可以这样设定喔:
同样的, NIS slave 也需要设定相同的网域,设定方式可以参考前一小节的介绍,我们这里很快的介绍一遍:
1. 直接建立领域名
[root@linux ~]# nisdomainname vbirdnis
2. 开机立即启动此一领域名
[root@linux ~]# vi /etc/rc.d/rc.local
# 加入底下这一行:
/bin/nisdomainname vbirdnis
3. 预设在启动 ypserv 时,设定 NIS 领域名
[root@linux ~]# vi /etc/sysconfig/network
# 加入底下这一行:
NISDOMAIN=vbirdnis
|
这个配置文件也是很简单的啦!可以与前面的 NIS master 相同即可。在鸟哥的这个例子当中, 我是直接在该档案加入这三行而已喔!
[root@linux ~]# vi /etc/ypserv.conf
127.0.0.0/255.255.255.0 : * : * : none
192.168.1.0/255.255.255.0 : * : * : none
* : * : * : deny
|
- /etc/hosts 及 /etc/netgroup
这两个档案不陌生吧?直接设定他吧!
[root@linux ~]# touch /etc/netgroup
[root@linux ~]# vi /etc/hosts
192.168.1.2 master.vbirdnis
192.168.1.10 slave.vbirdnis
192.168.1.100 client.vbirdnis
|
还记得吧?我们需要 portmap 与 ypserv 喔!至于 yppasswdd 这个功能主要是在修改主控服务器 (master) 上面的账号密码,而 slave 只是在取得 master 的数据库而已,本身并不具备修改数据库的能力的, 所以 slave 当然就不需要这个东西啦!所以你可以这样设定:
[root@linux ~]# /etc/init.d/portmap start
[root@linux ~]# /etc/init.d/ypserv start
|
那如何取得来自 master 服务器的数据库档案呢?还是一样得要透过 /usr/lib/yp/ypinit 这支程序啦! 只是他的指令下达会变成这样喔:
[root@linux ~]# /usr/lib/yp/ypinit -s master.vbirdnis
参数:
-s :后面接预计取得的 master 主机名!
We will need a few minutes to copy the data from master.vbirdnis.
Transferring hosts.byname...
Trying ypxfrd ... not running
Transferring services.byname...
Trying ypxfrd ... not running
....中间省略....
|
虽然使用上头的指令事实上会出现有错误的信息,就是那个『Trying ypxfrd ... not running』的信息, 但事实上数据库的转移还是成功的!不相信的话,你可以使用底下这个指令来测试一下数据库是否正确:
[root@linux ~]# ypcat -h localhost passwd.byname
|
如果有正确的输出账号/密码数据的话,呵呵!那就是 OK 的啦!如此一来,您的 NIS slave 就启动 OK 啦! 不过,由于您的 master 服务器可能随时都会有账号/密码的改变,所以你其实是可以使用 ypxfrd 这个服务来帮助数据库在 master/slave 间转移的!如果你有在 master 服务器启动 ypxfrd 的话, 那么你可以在 slave 的工作排程上这样处理的:
[root@linux ~]# vi /etc/crontab
# 在最后加入以 ypxfr 传输数据的 script 喔!
20 * * * * root /usr/lib/yp/ypxfr_1perhour
40 6 * * * root /usr/lib/yp/ypxfr_2perday
55 6,18 * * * root /usr/lib/yp/ypxfr_2perday
# 事实上,这三支程序只是利用 /usr/lib/yp/ypxfr 来进行数据库的更新,
# 不过鸟哥实际进行时,似乎有点小问题,或许需要修改一下上述三个档案,
# 我们以 /usr/lib/yp/ypxfr_1perhour 为例来说明好了:
[root@linux ~]# vi /usr/lib/yp/ypxfr_1perhour
# 找到这一行:
$YPBINDIR/ypxfr $map
# 将他改成这样:
$YPBINDIR/ypxfr $map -h master.vbirdnis
|
Tips: 事实上,如果 master 服务器有启动 ypxfrd 的话,那么下达 ypinit -s master.vbirdnis 时, 就不会有错误讯息啰! ^_^ |
 |
如此一来,系统将会针对不同的数据库来与 master 服务器进行比对,若发现 master 的数据较新时,则会进行更新!很方便吧!当然啦,您也可以直接透过系统管理员执行 ypinit -s master.vbirdnis 来处理就是了。此外,直接利用 master 机器上的 yppush 也是个不错的思考方向!
- 启动 ypbind ,让 slave 也可以查询账号/密码
如果你的 slave 并没有启动 ypbind 的话,那么 slave 将无法以 master 所提供的账号来登入的! 所以接下来,
妳必须要启动 ypbind 这个查询的功能,好让我们的 slave 服务器也可以针对我们自己的 NIS 网域 (vbirdnis) 进行查询。 至于 ypbind的启动方式则请参考下一小节的 NIS client 设定方式吧!
至此为止,你就已经具有一部 NIS master 及多部 NIS slave 的服务器啰!接下来就来玩玩 NIS client 吧!