NIS服务的应用结构分为NIS服务器和NIS客户机两种角色,NIS服务器集中维护用户的帐号信息(数据库)供NIS客户机进行查询,用户登录任何一台NIS客户机都会从NIS服务器进行登录认证,可实现用户帐号的集中管理。其架构有Master—-client 和 Master — Slave —- client 两种。后一种架构主要用于解决前一种可能出现的单点故障导致用户无法正常登录。

一、软件包及配置文件

相关软件包

yp-tools :提供 NIS 相关的查寻指令功能
ypbind :提供 NIS Client 端的设定软件
ypserv :提供 NIS Server 端的设定软件
rpcbind :RPC通信使用

相关配置文件与指令

配置文件
/etc/ypserv.conf 这是最主要的 ypserv 软件所提供的配置文件,可以规范 NIS 客户端是否可登入的权限。
/etc/hosts 由于 NIS server/client 会用到网络主机名与 IP 的对应,因此这个主机名对应档就显的相当重要!每一部主机名与 IP 都需要记录才行!
/etc/netgroup 提供组数据及GID的对应。
/etc/sysconfig/network 可以在这个档案内指定 NIS 的网域 (nisdomainname)。
/var/yp/Makefile 这就是与建立数据库有关的动作配置文件;
主要服务方面
/usr/sbin/ypserv 就是 NIS 服务器的主要提供服务
/ust/sbin/rpc.ypxfrd 用于Master/Slave主机之间的传输数据库的服务。
/usr/sbin/rpc.yppasswdd 提供额外的 NIS 客户端之用户密码修改服务, 透过这个服务, NIS 客户端可以直接修改在 NIS 服务器上的密码。相关的使用程序则是 yppasswd 指令;
数据库相关指令
/usr/lib64/yp/ypinit 建立数据库的指令,非常常用 (在 32 位的系统下,文件名则是 /usr/lib/yp/ypinit,不过自rhel7/centos7不再提供32位系统 );
/usr/bin/yppasswd 与 NIS 客户端有关,主要在让用户修改服务器上的密码。
/usr/sbin/yppush master 主机将数据库直接送至 slave 的指令;
/usr/lib/yp/ypxfr 传送数据库的指令,在该目录下尚有 ypxfr_1perday, ypxfr_1perhour, ypxfr_2perday 等等。

服务端相关文件:

服务器端文件名 档案内容
/etc/passwd 提供用户账号、UID、GID、家目录所在、Shell 等等
/etc/group 提供群组数据以及 GID 的对应,还有该群组的加入人员
/etc/hosts 主机名与 IP 的对应,常用于 private IP 的主机名对应
/etc/services 每一种服务 (daemons) 所对应的端口号 (port number)
/etc/protocols 基础的 TCP/IP 封包协定,如 TCP, UDP, ICMP 等
/etc/rpc 每种 RPC 服务器所对应的程序号码
/var/yp/ypservers NIS 服务器所提供的数据库

客户端相关文件及指令:

客户端相关文档:
/etc/sysconfig/network NIS 的领域名
/etc/hosts 至少需要有各个 NIS 服务器的 IP 与主机名对应;
/etc/yp.conf 这个则是 ypbind 的主要配置文件,里面主要设定 NIS 服务器所在
/etc/sysconfig/authconfig 规范账号登入时的允许认证机制
/etc/pam.d/system-auth 这个最容易忘记!因为账号通常由 PAM 模块所管理, 所以你必须要在 PAM 模块内加入 NIS 的支持才行!
/etc/nsswitch.conf 这个档案可以规范账号密码与相关信息的查询顺序,默认是先找 /etc/passwd 再找 NIS 数据库
客户端相关指令:
/usr/bin/yppasswd 更改你在 NIS database (NIS Server 所制作的数据库) 的密码
/usr/bin/ypchsh 同上,但是是更改 shell
/usr/bin/ypchfn 同上,但是是更改一些用户的讯息!

二、Master–client架构

nis

规划:

NIS服务器IP: 192.168.0.109
client ip: 192.168.0.111
NIS服务器主机名:www.361way.com
NIS域名称:nis.361way.com

注:NIS域名称我们可以拿windows下的AD域去理解,不一定非得写成域名格式,也可以直接取名为abc ,只不过便于识别,我们取名为nis.域名 。

服务器端配置:

 1-设置主机名
 2# hostname www.361way.com
 3# echo 'www.361way.com' >/etc/hostname
 4# vim /etc/hosts
 5增加以下行
 6127.0.0.1  www.361way.com
 7-安装服务包
 8# yum -y install ypserv rpcbind
 9-设置nis域名称,直接执行ypdomainname是取得当前域名称
10# ypdomainname nis.361way.com
11-将相关参数写入network文件,ypserv的参数可以参看man ypserv ,需要注意的是ypserv服务同时使用该tcp端口和udp端口
12# echo "NISDOMAIN=nis.361way.com" >> /etc/sysconfig/network
13# echo 'YPSERV_ARGS="-p 658"' >> /etc/sysconfig/network
14- 将yppasswd服务的端口也配置为固定端口
15# vim /etc/sysconfig/yppasswdd
16将YPPASSWDD_ARGS= 行,后面增加端口设置
17YPPASSWDD_ARGS='--port 828'
18-增加用户
19# useradd test
20# echo 'password' | passwd --stdin test
21- 启动服务,并设置开机自启动
22需要注意的是,还有一个ypxfrd服务用于主备同步数据库文件,这里不涉及主备架构,未启用。默认启动ypserv服务时,会自动启动rpcbind服务。
23# systemctl start rpcbind ypserv yppasswdd
24# systemctl enable rpcbind ypserv yppasswdd
25-初始化数据库
26# /usr/lib64/yp/ypinit -m
27At this point, we have to construct a list of the hosts which will run NIS
28servers.  www.361way.com is in the list of NIS server hosts.  Please continue to add
29the names for the other hosts, one per line.  When you are done with the
30list, type a <control D>.
31        next host to add:  www.361way.com
32        next host to add:  #按ctrl + D
33The current list of NIS servers looks like this:
34www.361way.com
35Is this correct?  [y/n: y]  y
36We need a few minutes to build the databases...
37Building /var/yp/nis.361way.com/ypservers...
38省略
39-查看启动的端口是否和上面设置的匹配
40# netstat -ntlpu
41-防火墙对以上使用的服务放行
42# firewall-cmd --permanent --add-service=rpc-bind
43# firewall-cmd --permanent --add-port=658/tcp
44# firewall-cmd --permanent --add-port=658/udp
45# firewall-cmd --permanent --add-port=828/udp  //yppasswdd服务只使用UDP端口
46# systemctl restart firewalld.service

服务端的主配置文件是/etc/ypserv.conf,其中相关的配置项以下内容,具体可以man 5 ypserv.conf 查看相关帮助。

1Files:30  #默认会有30个数据库被读入内存中
2Slp:no
3Slp_timeout:3600   #与SLP服务有关
4Xfr_check_port:yes  #与Master/Slave有关,用于同步更新的数据库比对所使用的端口,放置于 <1024内。

在实际使用,还会涉及到允许某些客户端安全访问的问题,除可以在firewall 里进行相关设置外,还可以在另外两处配置文件--/etc/ypserv.conf和/var/yp/securenets中进行设置。

ypserv.conf的配置格式如下:

1# [主机名/IP] : [NIS域名] : [可用数据库名称] : [安全限制]
2127.0.0.0/255.255.255.0  : *     : *           : none
3192.168.100.0/255.255.255.0  : *      : *        : none
4*                     : *       : *         : deny

/var/yp/securenets文件,默认该文件不存在,创建该文件后,只允许该文件中指定的网段访问,具体可以查看man ypserv ,其具体的配置格式如下:

1# allow connections from local host -- necessary
2host 127.0.0.1   等价于下面的写法
3255.255.255.255 127.0.0.1
4# allow connections from any host on the 131.234.223.0 network
5255.255.255.0   131.234.223.0

客户端配置:

 1-安装相关软件包
 2# yum -y install ypbind rpcbind
 3-设置NIS域名
 4# ypdomainname nis.361way.com
 5# echo "NISDOMAIN=nis.361way.com" >> /etc/sysconfig/network
 6-hosts中配置
 7#增加如下行:
 8192.168.0.109  www.361way.com
 9-开启相关服务
10# systemctl start ypbind.service
11# systemctl enable ypbind.service
12-authconfig认证配置,也可以使用authconfig-tui 或 authconfig-gtk
13# authconfig \
14> --enablenis \
15> --nisdomain=nis.361way.com \
16> --nisserver=www.361way.com \
17> --enablemkhomedir \
18> --update
19-登录测试
20# su - test
21Creating directory '/home/test'.

这里有以下几点需要注意:

1、nisserver后面也可以指定IP,但个人感觉使用主机名更好。因为nisserver对应会配置在多个配置文件中,通过主机名配置时,无论NIS主机IP或主机更换时,只需要在/etc/hosts中修改下对应关系即可;

2、网上很多教程中都提到NIS client主机需要nfs 挂载NIS服务器的home目录到本机,不然su – 用户名切换时会出现找不到家目录的情况。实际上NIS是支持本地家目录和远程家目录两种情况的,上面的enablemkhomedir 参数的作用,即是在未使用远程挂载的家目录时,会自动在本机的/home目录创建用户的家目录(家目录也不一定是/home/用户名,具体要看NIS server上增加用户时的设置,一般是在/home下)。在机器数量较多时,逐台挂载家目录感觉有点不现实,也会对服务端的nfs服务造成压力和考验;但通过NFS挂载家目录,也可以通所有主机的家目录进行集中管理;两种配置文件各有优劣,具体根据具体场景而定。

3、新增用户,需要ypinit重新制作数据库,无需重启相关服务;但如果老用的密码在服务端修改后,除需要ypinit重制数据库;客户端也可以通过yppasswd直接修改用户密码

三、Master — Slave —- client架构

nis-slave

规划:

NIS Master IP: 192.168.0.109
NIS Slave IP: 192.168.0.110
client ip: 192.168.0.111
NIS Master主机名:www.361way.com
NIS Slave主机名:slave.361way.com
NIS域名称:nis.361way.com

NIS Master配置:

服务器端除了上面Master — Client中架构中的服务端配置外,还要做如下部分的配置:

 1- hosts 文件配置,增加slave主机名与IP的对应关系
 2192.168.0.109   www.361way.com
 3192.168.0.110   slave.361way.com
 4-除了上面提到的三个服务外,再增加ypxfrd服务,启动该服务可以让slave主机主动连接更新数据文件
 5# systemctl start rpcbind ypserv ypxfrd yppasswdd
 6# systemctl enable rpcbind ypserv ypxfrd yppasswdd
 7-为ypxfrd设置固定端口
 8# echo 'YPXFRD_ARGS="-p 659"' >> /etc/sysconfig/network
 9-修改/var/yp/Makefile文件
10将NOPUSH=true 更改为
11NOPUSH=false
12-更新NIS数据库文件
13# /usr/lib64/yp/ypinit -m
14At this point, we have to construct a list of the hosts which will run NIS
15servers.  dlp.server.world is in the list of NIS server hosts.  Please continue to add
16the names for the other hosts, one per line.  When you are done with the
17list, type a.
18        next host to add:  www.361way.com
19        next host to add:  slave.361way.com  #需手工输出该主机名,这点很重要 ,很多教程也会给出的方法是手工将salve的主机名加入/var/yp/ypservers文件中。
20        next host to add: # Ctrl + D key
21The current list of NIS servers looks like this:
22www.361way.com
23slave.361way.com
24Is this correct? [y/n: y] y
25We need a few minutes to build the databases...
26Building /var/yp/server.world/ypservers...
27-防火墙开启ypxfrd使用的端口,修改后重新firewalld服务生效
28# firewall-cmd --permanent --add-port=659/tcp
29# firewall-cmd --permanent --add-port=659/udp

NIS Slave配置:

Slave的配置步骤基本和Master - Client中配置Master的操作一样:

 1-设置主机名
 2# hostname slave.361way.com
 3# echo 'slave.361way.com' >/etc/hostname
 4# vim /etc/hosts
 5增加以下行
 6192.168.0.109  www.361way.com
 7192.168.0.110  slave.361way.com
 8-安装服务包
 9# yum -y install ypserv rpcbind
10-设置nis域名称
11# ypdomainname nis.361way.com
12-将相关参数写入配置文件,并设置固定端口
13# echo "NISDOMAIN=nis.361way.com" >> /etc/sysconfig/network
14# echo 'YPSERV_ARGS="-p 658"' >> /etc/sysconfig/network
15- 将yppasswd服务的端口也配置为固定端口
16# vim /etc/sysconfig/yppasswdd
17将YPPASSWDD_ARGS= 行,后面增加端口设置
18YPPASSWDD_ARGS='--port 828'
19- 启动服务,并设置开机自启动
20# systemctl start rpcbind ypserv yppasswdd
21# systemctl enable rpcbind ypserv yppasswdd
22-从Master同步数据库
23# /usr/lib64/yp/ypinit -s  www.361way.com
24We will need a few minutes to copy the data from www.361way.com.
25Transferring mail.aliases...
26Trying ypxfrd ... success
27Transferring protocols.byname...
28Trying ypxfrd ... success
29Transferring protocols.bynumber...
30Trying ypxfrd ... success
31Transferring netid.byname...
32Trying ypxfrd ... success
33Transferring services.byservicename...
34Trying ypxfrd ... success
35Transferring services.byname...
36Trying ypxfrd ... success
37省略…………
38-查看启动的端口是否和上面设置的匹配
39# netstat -ntlpu
40-防火墙对以上使用的服务放行
41# firewall-cmd --permanent --add-service=rpc-bind
42# firewall-cmd --permanent --add-port=658/tcp
43# firewall-cmd --permanent --add-port=658/udp
44# firewall-cmd --permanent --add-port=828/udp  //yppasswdd服务只使用UDP端口
45# systemctl restart firewalld.service

Client配置:

client主机的配置比较简单,只在/etc/yp.conf中增加如下一行并在/etc/hosts中增加slave主机名和IP对应关系:

1# vim /etc/yp.conf
2domain nis.361way.com server www.361way.com   #原有行
3domain nis.361way.com server slave.361way.com    #新增行

/etc/hosts中的配置为:

1192.168.0.109   www.361way.com       #原有行
2192.168.0.110   slave.361way.com     #新增行

为了便于观察效果,配置完成后,我们在Client站上不要使用systemctl 启动ypbind服务,使用如下命令将服务开启在debug模式下:

1# ypbind  -n -d

启动服务后,我们分别将主机或备机轮流关机或停服务模拟故障发生,会在debug模式下进行nis用户登录时,会发现类似如下日志:

 12720: Trying entry: domain nis.361way.com server www.361way.com
 22720: parsed domain 'nis.361way.com' server 'www.361way.com'
 32720: add_server() domain: nis.361way.com, host: www.361way.com, slot: 0
 42720: Trying entry: domain nis.361way.com server slave.361way.com
 52720: parsed domain 'nis.361way.com' server 'slave.361way.com'
 62720: add_server() domain: nis.361way.com, host: slave.361way.com, slot: 1
 72720: [Welcome to ypbind-mt, version 1.37.1]
 82722: ping host 'www.361way.com', domain 'nis.361way.com'
 92722: ping host 'slave.361way.com', domain 'nis.361way.com'
102722: host 'slave.361way.com' doesn't answer.
112722: Answer for domain 'nis.361way.com' from server 'www.361way.com'
122722: interface: org.freedesktop.DBus, object path: /org/freedesktop/DBus, method: NameAcquired
132723: ping host 'www.361way.com', domain 'nis.361way.com'
142723: ping host 'slave.361way.com', domain 'nis.361way.com'
152723: host 'slave.361way.com' doesn't answer.
162723: Entry for nis.361way.com unchanged, skipping writeout
172723: Answer for domain 'nis.361way.com' from server 'www.361way.com'
182723: Pinging all active servers.
192723: ping host 'www.361way.com', domain 'nis.361way.com'
202723: host 'www.361way.com' doesn't answer.
212723: ping host 'slave.361way.com', domain 'nis.361way.com'
222723: Answer for domain 'nis.361way.com' from server 'slave.361way.com'
232720: ypbindproc_domain_2_svc (nis.361way.com)
242720: Pinging all active servers.
252720: YPBINDPROC_DOMAIN: server '192.168.0.110', port 658
262720: Status: YPBIND_SUCC_VAL
272723: Pinging all active servers.
282723: Pinging all active servers.
292723: Checking for new fastest server.
302723: ping host 'www.361way.com', domain 'nis.361way.com'
312723: ping host 'slave.361way.com', domain 'nis.361way.com'
322723: Answer for domain 'nis.361way.com' from server 'www.361way.com'
332723: Pinging all active servers.

从上面的日志可以看出,客户端登录时通过ping包检测结果中会进行轮换。并根据fastest随机选取最快的应答主机。

Master/Slave数据文件同步:

两者之间进行数据文件同步,可以主动推,也可以被动拉。master是可以执行yppush将数据库推送到slave上,如这里推passwd相关的库,可以使用:

1# yppush --port 836 -h slave.361way.com passwd.*

但是更常用的方法是,Master端开启ypxfrd服务后,让slave主机连接上ypxfrd服务,取得master的最新数据内容:

1# /usr/lib64/yp/ypinit -s www.361way.com

可以让两者之间的数据及时同步,可以在slave上配置crontab计划任务每五份钟执行一次同步:

1*/5 * * * *  /usr/lib64/yp/ypinit -s www.361way.com

四、NIS的运作流程及工具

NIS的运作流程如下:

Nis Server(Master/Slave)

1.Nis Master先将帐号密码相关文件制作成数据库文件;
2.Nis Master可以主动告诉Nis Slave来更新;
3.Nis Slave亦可以主动前往Nis Master取得更新;
4.若有帐号密码变动时,需要重新制作数据库文件并重新同步Master/Slave。

Nis Client

1.NIS client 若有登入需求时,会先查询其本机的 /etc/passwd, /etc/shadow 等档案;
2.若在 NIS Client 本机找不到相关的账号数据,才开始向整个 NIS 网域的主机广播查询;
3.每部 NIS server (不论 master/slave) 都可以响应,基本上是『先响应者优先』。

常用工具:

NIS有一个包叫yp-tools ,里面包含了很多工具,如下:

 1# rpm -ql yp-tools
 2/usr/bin/ypcat
 3/usr/bin/ypchfn
 4/usr/bin/ypchsh
 5/usr/bin/ypmatch
 6/usr/bin/yppasswd
 7/usr/bin/ypwhich
 8/usr/sbin/yppoll
 9/usr/sbin/ypset
10/usr/sbin/yptest

yptest 这是在cleint端最常用的工具,也是比较全面的一个测试工具,直接运行该命令其会测试到服务端之间的做九项测试:domainname、ypserver、yp_match、第一个用户、后面的用户信息、ypmaster、yp_order、yp_maplist、yp_all。输出较多,具体可以自行测试下。

 1[root@localhost ~]# yptest
 2Test 1: domainname
 3Configured domainname is "nis.361way.com"
 4Test 2: ypbind
 5Used NIS server: slave.361way.com
 6Test 3: yp_match
 7WARNING: No such key in map (Map passwd.byname, key nobody)
 8Test 4: yp_first
 9haha haha:$6$vSS9TP33$YUkFkmKTWK.CWTG/HcVfcQIWU7RdC5gJjPVw9fPCcbpfgou9W3Z5pWA2PAJ9vMJ4eAqgQiwEPyWyopN/ONiBi1:1002:1002::/home/haha:/bin/bash
10………………省略

ypwhich 可以显示当前使用的NIS是哪台(不带参数执行)?map库有哪些(带-x参数)?

 1[root@localhost ~]# ypwhich
 2slave.361way.com
 3[root@localhost ~]# ypwhich  -x
 4Use "ethers"    for map "ethers.byname"
 5Use "aliases"   for map "mail.aliases"
 6Use "services"  for map "services.byname"
 7Use "protocols" for map "protocols.bynumber"
 8Use "hosts"     for map "hosts.byname"
 9Use "networks"  for map "networks.byaddr"
10Use "group"     for map "group.byname"
11Use "passwd"    for map "passwd.byname"

ypcat 主要用于读取map库的信息,后面在故障排错时也会提到

1# ypcat passwd.byname
2也可以使用-h指定使用的主机
3# ypcat -h www.361way.com passwd.byname

yppasswd, ypchfn, ypchsh 用于更改用户密码shell类型等。

yppasswd :与 passwd 指令相同功能;
ypchfn :与 chfn 相同功能;
ypchsh :与 chsh 相同功能。

五、常见报错

报错1:yppasswd: yppasswdd not running on NIS master host (“localhost”)

按我们上面的示例进行配置时,如果出现此配置,一般是client的配置有问题,这里可以借助ypcat命令排查,ypcat 有一个很好用的方法:

1# ypcat -k ypservers
2slave.361way.com slave.361way.com
3www.361way.com www.361way.com

使用上面的命令执行时,发现其正常的输出应该是Master和Slave的主机名,而如果上面报的名称是localhost,显然是client配置时有问题,可以尝试通过authconfig 再进行update配置后重试。

报错2:yppasswd: yppasswdd daemon running on illegal port

出现此报错,一般有两个地方可以查问题:

1、YPPASSWDD_ARGS参数配置的文件是否有误,正确的应该在配置在master的/etc/sysconfig/yppassword配置文件中,而往往很多人不小心配到了/etc/sysconfig/network文件中;

2、防火墙中是否允许了端口通行,其是运行在udp端口上的 。可以尝试先关闭防火墙是否通正常使用。

上面两个是典型报错,也有可能会碰到类似如下的报错:

1[root@www ~]# yppush -h slave.361way.com passwd.*
2YPPUSH: Cannot open /var/yp/nis.361way.com/passwd.*
3YPPUSH: consider rebuilding maps using ypinit

这个报错一般也是由于防火墙引起的,关闭访火墙依旧有该问题的话,可以通过新增用户通过ypinit -m 更新数据库后,再执行yppush测试,一般都会正常。

六、NIS + NFS + autofs

上面也提到过,在默认使用图形化界面配置时,家目录会要求使用远程主机的家目录,不会自动创建家目录。这种配法可以通过master 主机提供NFS服务提供家目录,再通client自身的autofs服务自动按需挂载所需目录。当然也可以考虑使用authconfig 在配置NIS服务时,通过–enablemkhomedir参数,让client登录时,可以在自已的home目录为远程用户创建本地目录。由于NFS 和 autofs 在后面也会提到,界时也可以依葫芦画瓢使用该配置方法。