首页 > 代码库 > Linux服务器集群架构部署搭建(三)NFS文件系统、SSH通道建立、批量分发管理(1)
Linux服务器集群架构部署搭建(三)NFS文件系统、SSH通道建立、批量分发管理(1)
命运是大海,当你能够畅游时,你就要纵情游向你的所爱,因为你不知道狂流什么会到来,卷走一切希望与梦想。
作者:燁未央_Estelle
声明:测试学习,不足之处,欢迎指正。
第一章 NFS共享服务器的企业应用
1.1 NFS服务--静态数据存储
NFS是(Network File System)主要功能是通过网络让不同的设备端之间可以彼此共享文件或目录。NFS客户端(一般为应用服务器,如WEB)可以通过挂载(mount)方式,将NFS客户端本地系统中(就是一个挂载点)从NFS服务器端共享的数据文件目录挂载到NFS客户端本地系统中(某一个挂载点下)。在本地NFS客户端的机器看来,NFS服务器端共享的目录就好像是自己的磁盘分区或者目录一样。NFS一般用来存储共享视频、图片等静态数据,是当前互联网系统架构中最常用的服务之一。
1.2 NFS服务的实现
①搭建环境:NFS-C服务器为服务端,WEB服务器Apache_web-01,Nginx_web-02,数据库服务器mysql-01、mysql-02,备份服务器Backup为客户端,服务端和客户端实现存储目录共享。同时NFS服务工项目录和备份服务器Backup,实现实时同步。
②创建配置共享目录,实现RPC和NFS服务的开机启动。
③挂载测试共享目录,并设置开机自动挂载。
④创建SSH密钥认证并。实现NFS-C服务端能够批量分发管理到客户端WEB服务器Apache_web-01,Nginx_web-02,数据库服务器mysql-01、mysql-02,备份服务器Backup。
⑤实现服务端NFS-C服务器能够无密码远程登录客户端,并且实现远程拷贝,拉取以及sftp上传下载。
第二章 搭建部署NFS共享的实现
2.1 NFS文件共享系统的搭建部署操作步骤
一、文件爱系统共享存储
服务端NFS置步骤:
①检查系统版本。
②安装RPC服务并检查。
③启动RPC服务并检查。
④设置开机启动并检查。
⑤配置共享目录。
⑥创建共享目录并保证目录及共享文件授权。
⑦平滑加载NFS服务并检查服务。
注意,根据需要有时候需要建立用户:
groupadd nfsnobody
useradd nfsnobody -g nfsnobody -M -s /sbin/nologin
一般情况下系统会默认存在用户 id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
客户端WEB服务器Apache_web-01,Nginx_web-02,数据库服务器mysql-01、mysql-02,备份服务器Backup设置步骤:
①打印系统版本。
②检查并安装NFS、RPC服务。
③启动RPC及NFS服务并检查。
④设置开机自启动并检查。
⑤检查服务端的NFS是否畅通。
⑥挂载并测试。设置开机启动自动挂载。
二、服务器NFS服务器批量分发管理实现
服务器NFS服务器作为服务端,服务器WEB服务器Apache_web-01,Nginx_web-02,数据库服务器mysql-01、mysql-02,备份服务器Backup作为客户端设置步骤(以Rsync-举例)
①查看服务端和客户端内核版本信息、软件安装及版本信息。(需要统一建立用户及配置密码)
②服务端,创建1024字节的密钥柜,生成公钥、私钥。
③使用SHH命令从服务端拷贝公钥文件至客户端。
④通过SSH链接使得服务端NFS服务器和客户端实现无密码验证远程链接。
⑤通过SCP指令实现对客户端的无密码远程登录管理。
⑥服务端创建测试文件,进行批量分发操作。客户端创建测试文件进行拉取操作。同时客户端WEB服务器Apache_web-01,数据库服务器mysql-01、mysql-02,备份服务器root@Backup创建测试文件能够狗推送至服务端NFS-C.
⑦通过SFTP指令实现服务端和客户端文件的远程上传、下载。
注意事项:
①scp是加密的远程拷贝,走的ssh的通道,过程是加密的。可以推送出本地,也可以拉回到本地。但是每一次都是全量的拷贝,所以效率不高。适用与一段没有数据,全部拷贝。
②远程推送命令scp注意@前为推送客户端用户名,@后为IP以及紧接着的客户端存放路径。
③注意命令格式(拉取)命令+端口+拉去目标主机名及IP:文件路径 本地存放路径(注意IP之后冒号直接接文件路径,没有空格)
④有一种增量拷贝,rsync就是说只改变有变化的地方。
⑤注意命令的输入格式,路径的指定以及参数的使用。
⑥远程操作的实现一般都是在客户端进行操作的。注意权限的授予。
SCP重要参数的使用:
-P 端口;
-p 表示保持文件权限;
-r 表示递归复制;可以拉取或者拷贝目录的参数 ------------------------------ ------------------#=====》对目录文件进行操作 拉取和拷贝
-v 和大多数 linux 命令中的 -v 意思一样,用来显示进度,可以用来查看连接、认证或是配置错误;
-C 使能压缩选项;
①首先根据服务端和客户端信息,确认远程登录SSH通道畅通,能够进行文件的传输。
②两种方式传输文件:推送及拉取,-P,指定端口号,小写-p保持传输文件的默认属性。
③远程拷贝两种命令格式:
推送:scp -P端口号 推送文件路径 目标用户名@IP地址:推送存放路径
拉取:scp -P端口号 目标用户名@IP地址:拉取文件路径 本地存放路径
所要拷贝的目录受对方服务器对目录权限的控制
举例:
推送:scp -P52113 -p tslove@192.168.109.129:/home/tslove/tmp/tslove.txt tmp
拉取:scp -P52113 -p tslove.txt tslove@192.168.109.129:/tmp
注意:SCP 命令 \ (find命令总结)
svn 删除所有的 .svn文件
find . -name .svn -type d -exec rm -fr {} \;
2.2 NFS文件共享系统的部署实践
服务端:NFS客户端:WEB服务器Apache_web-01,Nginx_web-02,数据库服务器mysql-01、mysql-02,备份服务器Backup一、服务端Nginx_web-02部署操作Last login: Sat Dec 20 10:47:02 2014 from 192.168.109.1Where we love is home, home that our feet may leave, but not our hearts.[tslove@NFS ~]$ sudo su -[root@NFS ~]# cat /etc/redhat-release CentOS release 6.5 (Final)[root@NFS ~]# uname -rm2.6.32-431.el6.x86_64 x86_64[root@NFS ~]# yum install nfs-utils rpcbind -y[root@NFS ~]# rpm -qa nfs-utils rpcbindrpcbind-0.2.0-11.el6.x86_64nfs-utils-1.2.3-54.el6.x86_64[root@NFS ~]# /etc/init.d/rpcbind startStarting rpcbind: [ OK ][root@NFS ~]# ps -ef | grep rpcrpc 1215 1 0 14:11 ? 00:00:00 rpcbindroot 1219 1073 0 14:11 pts/0 00:00:00 grep rpc[root@NFS ~]# /etc/init.d/rpcbind statusrpcbind (pid 1215) is running...[root@NFS ~]# rpcinfo -p localhost program vers proto port service 100000 4 tcp 111 portmapper 100000 3 tcp 111 portmapper 100000 2 tcp 111 portmapper 100000 4 udp 111 portmapper 100000 3 udp 111 portmapper 100000 2 udp 111 portmapper[root@NFS ~]# /etc/init.d/nfs startStarting NFS services: [ OK ]Starting NFS quotas: [ OK ]Starting NFS mountd: [ OK ]Starting NFS daemon: [ OK ]Starting RPC idmapd: [ OK ][root@NFS ~]# chkconfig nfs on[root@NFS ~]# chkconfig rpcbind on[root@NFS ~]# chkconfig --list|grep nfs nfs 0:off 1:off 2:on 3:on 4:on 5:on 6:offnfslock 0:off 1:off 2:off 3:on 4:on 5:on 6:off[root@NFS ~]# chkconfig --list|grep rpcbindrpcbind 0:off 1:off 2:on 3:on 4:on 5:on 6:off[root@NFS ~]# cat /etc/exports [root@NFS ~]# cat >>/etc/exports<<EOF> #shared data for bbs by tslove at 2014-12-17> /data/html 1192.168.109.0/24(rw,sync)> EOF[root@NFS ~]# cat /etc/exports #shared data for bbs by tslove at 2014-12-17/data/html 192.168.109.0/24(rw,sync)[root@NFS ~]# mkdir /data/html ###作为未来WEB站点的文件存储目录[root@NFS ~]# ll /data/html/total 16drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 bbsdrwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 blogdrwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 wikidrwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 www[root@NFS ~]# chown -R nfsnobody.nfsnobody /data/html/ (注意此处如果没有授权,那么客户端就不能进行写入,也就是说不能新建目录文件。)[root@NFS ~]# /etc/init.d/nfs reload[root@NFS ~]# showmount -e localhostExport list for localhost:/data/html 192.168.10.0/24二、客户端Apache_web-01为例部署操作Last login: Fri Dec 19 17:38:41 2014 from 192.168.109.1Where we love is home, home that our feet may leave, but not our hearts.[tslove@Apache_web-01 ~]$ sudo su -[root@Apache_web-01 ~]# cat /etc/redhat-release CentOS release 6.5 (Final)[root@Apache_web-01 ~]# uname -rm2.6.32-431.el6.x86_64 x86_64[root@Apache_web-01 ~]# yum install nfs-utils rpcbind -y[root@Apache_web-01 ~]# rpm -qa rpcbindrpcbind-0.2.0-11.el6.x86_64[root@Apache_web-01 ~]# /etc/init.d/rpcbind startStarting rpcbind: [ OK ][root@Apache_web-01 ~]# /etc/init.d/rpcbind statusrpcbind (pid 1120) is running...[root@Apache_web-01 ~]# chkconfig rpcbind on[root@Apache_web-01 ~]# showmount -e 192.168.109.162Export list for 192.168.109.162:/data/html 192.168.109.0/24[root@Apache_web-01 ~]# mount -t nfs 192.168.109.162:/data/html /mnt[root@Apache_web-01 ~]# mount -t nfs 192.168.109.162:/data/html /mnt[root@Apache_web-01 ~]# ll /mnt/total 0[root@Apache_web-01 ~]# ll /mnt/total 16drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 bbsdrwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 blogdrwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 wikidrwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 www#########配置完毕,创建测试文件进行测试。客户端:[root@Apache_web-01 mnt]# touch a.log[root@Apache_web-01 mnt]# lltotal 16-rw-r--r-- 1 nfsnobody nfsnobody 0 Dec 20 11:22 a.logdrwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 bbsdrwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 blogdrwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 wikidrwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 www[root@Apache_web-01 mnt]# echo "123456 ">> a.log [root@Apache_web-01 mnt]# cat a.log 123456[root@Apache_web-01 mnt]# df -hFilesystem Size Used Avail Use% Mounted on/dev/sda3 6.7G 1.6G 4.9G 25% /tmpfs 116M 0 116M 0% /dev/shm/dev/sda1 194M 29M 155M 16% /boot192.168.109.162:/data/html 6.7G 1.6G 4.9G 25% /mnt服务端:[root@NFS ~]# ll /data/html/total 20-rw-r--r-- 1 nfsnobody nfsnobody 8 Dec 20 11:22 a.logdrwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 bbsdrwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 blogdrwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 wikidrwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 www[root@NFS ~]# cat /data/html/a.log 123456 ########NFS常用共享权限设定参数ro 只读访问rw 读写访问sync 同步写入资料到内存与硬盘中async 资料会先暂存于内存中,而非直接写入硬盘secure NFS通过1024以下的安全TCP/IP端口发送insecure NFS通过1024以上的端口发送wdelay 如果多个用户要写入NFS目录,则归组写入(默认)no_wdelay 如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。hide 在NFS共享目录中不共享其子目录no_hide 共享NFS目录的子目录subtree_check 如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)no_subtree_check 和上面相对,不检查父目录权限all_squash 共享文件的UID和GID映射匿名用户anonymous,适合公用目录。只要有all_squash参数,root就会被压缩为匿名用户,无论是否设置了no_root_squashno_root_squash root用户具有根目录的完全管理访问权限no_all_squash 保留共享文件的UID和GID(默认)root_squash root用户的所有请求映射成如anonymous用户一样的权限(默认)anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UIDanongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID
2.3 NFS常见故障分析及解决
首先检查客户端和服务端的配置是否正确,以及服务是否开启
1.在第一步骤没有错误的时候,如果挂载的时候没反应需要检查telnet ip地址。
2.如果telnet不同,那么需要解决防火墙问题。
3.可以本地先挂载,如果本地能挂载,那么服务器端的设置就没有问题。
命令:mount -t nfs ip地址/域名/主机名:挂在地址(提供的共享目录) ntf客户端要挂载的共享目录地址
4.虚拟机克隆,网络故障相关问题does not seem to be present解决方案:
第一种:报找不到这个设备,最大的可能MAC地址的问题。这时可以查看dmesg,找到eth的相关,有两个MAC,一个已经在一块网卡上用了,那另外块自然就是我启不了的网卡了。然后手动更改网卡的配置文件,把MAC地址改成正在用的,对的,重启虚拟机和服务。第二种:把/etc/udev/rules.d/70-persistent-net.rules文件 删除后重启机器,因为这个文件绑定了网卡和mac地址,所以换了网卡以后MAC地址变了,重启机器,让它再自动生成一个。
5.NFS的故障以原因分析:RPC启动顺序以及防火墙的开启造成的故障,挂在不到位的故障信息提示,端口没有注册的信息。
如果生产中出现“umount:/mnt:device is busy”
这时候需要退出挂载目录再进行卸载。也可能使NFS server宕机了,需要强制卸载mount -lf /mnt.
①优化建议:5.8X64位。要加上noatime,和nodiratime(大并发使用)nosuid,noexce,nodev,rw,softrsize=32768,wrize=32768(如果可以65535最好) 路径
②优化建议:notime nodiratime,nosuid,noexce(如果安全确定得到保证可以不用),nodev,rw,bg,hard,intr,srize=130172,wrize=131072 路径,(不加notime,就是要更新时间戳的使用)(要注意默认的挂载参数)非性能参数越多,从性能上来讲,响应时间越长。
③缺省设置:131071 /proc/sys/net/core/wmem_default 该文件指定了发送套接字缓冲区大小的缺省值(以字节为单位)。
④缺省设置:110592 /proc/sys/net/core/wmem_max 该文件指定了发送套接字缓冲区大小的最大值(以字节为单位)。
⑤命令设置
cat >>/etc/sysctl.conf<<EOF
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
EOF
sysctl -p 生效
例如:命令行:
[root@nfsclient01 /]# echo 8388608 > /proc/sys/net/core/rmem_default
[root@nfsclient01 /]# echo 16777216 > /proc/sys/net/core/rmem_max
2.4 NFS的优缺点简单分析
学习过程注意方法的掌控:要注意各种错误信息。这样知道是什么问题,那里设置出错或者知道是那里的问题。(反推问题出在哪里)
优点:简单:容易上手,容易掌握,数据在文件系统之上方便:部署快速,维护简单,可靠:软件层面上讲,可靠性高经久耐用,数据在文件系统之上,稳定。
缺点(局限):
1.存在单点故障,如果NFS宕机,那么所有的客户端都不能访问目录,这个后期可以通过负载均衡及高可用的方案解决。
2.在高并发的场合,NF效率/性能优先,(千万以下PV不是瓶颈,除非网站架构太差2000万PV/日)工作中“狐假虎威”,不完全取决与机房的能力,还有购买的IDC、CDN服务,带宽。这样可能只要2%的成本和抵抗力。
3.客户端认证时基于IP和主机名的安全性一般(用于内网则问题不大)。权限根据ID来识别的。安全性一般
4.NFS的数据是明文的,NFS对数据完整性没有校验。
5.多台服务器,挂载NFS服务器时候,连接管理维护麻烦,尤其是NFS的服务端出现问题之后所有的NFS客户端都挂点状态。耦合度太高==》解耦。(测试环境可使用autofs,当用户访问的时候再帮你挂在,没人访问(如60秒内)的时候再自动卸载。缺点是如果大并发,那么可能会瞬间访问的时候,引起挂载不上。解决NFS服务器和客户端紧密耦合的问题,)
6.耦合度太高==》架构师职责,解耦,网站扩展性才好。
第三章 批量分发管理的搭建部署
3.1 简单基础知识介绍
3.1.1 认识SSH相关释义
全称Secure Shell,非常安全的shell的意思,SSH协议是IETF的Network Working Group所制定的一种协议。SSH的主要目的是用来取代传统的telnet和R系列命令(rlogin,rsh,rexec等)远程登陆和远程执行命令的工具,实现对远程登陆和远程执行命令加密。防止由于网络监听而出现的密码泄漏,对系统构成威胁。在数据传输之前,SSH先对链接的数据包通过技术加密处理,然后进行数据传输,确保了传输的数据安全。Linux运维工作,首先第一位就是安全的重视。SSH可以防止数据在传输过程中被窃取,主要是两个功能:一是远程联telnet机服务,另一种类似FTP服务,借助ssh协议,来传输数据,提供更安全的SFTP(加密的)服务。
①sshd:SSH服务端程序
②sftp-server:SFTP服务端程序(类似FTP但提供数据加密的一种协议)
③scp:非交互式sftp-server的客户端,用来向服务器上传/下载文件
④sftp:交互式sftp-server客户端,用法和ftp命令一样
⑤slogin:ssh的别名
⑥ssh:SSH协议的客户端程序,用来登入远程系统或远程执行命令
⑦ssh-add:SSH代理相关程序,用来向SSH代理添加dsa key
⑧ssh-agent:ssh代理程序
⑨ssh-keyscan:ssh public key 生成器
SSH服务基础知识小结:
①ssh协议目前有SSH1和SSH2,SSH2协议兼容SSH1。目前实现SSH1和SSH2协议的主要软件有OpenSSH和SSH Communications软件。
②SSH服务是安全的加密协议,用于远程连接服务器。
③SSH默认端口是22,安全协议版本是SSH2,
④服务端包含两个服务功能:ssh远程连接/sftp服务
⑤客户端包含SSH链接命令以及远程拷贝scp命令。sftp命令。
⑥SSH是一种加密协议,不仅在登陆过程中对密码进行加密传送,而且对登陆后执行的命令的数据也进行加密,这样即使别人在网络上监听并截获了你的数据包,他也看不到其中的内容。⑦OpenSSH已经是目前大多数linux和BSD操作系统(甚至cygwin)的标准组件。
3.1.2 SSH服务的认证类型及认证过程
##SSH认证类型:
①第一种方式:基于口令的认证方式
不同机器通过SSH连接。确认账号和口令,当然也包括确认IP开放的SSH端口,Linux默认为22。
[tslove@NFS ~]# ssh -p52113 tslove@10.0.0.52
The authenticity of host ‘[10.0.0.52]:52113 ([10.0.0.52]:52113)‘ can‘t be established.
RSA key fingerprint is 8d:12:30:69:48:5e:1d:82:29:c7:d4:22:22:8c:17:27.
Are you sure you want to continue connecting (yes/no)? yes -------------------------------------- #=====》每次链接的第一次,均需要输入。
Warning: Permanently added ‘[10.0.0.52]:52113‘ (RSA) to the list of known hosts.
tslove@10.0.0.52‘s password: ----------------------------- #=====》建立连接的第一次需要输入密码以确认远程链接。密钥认证之后,抑或不要密码确认验证
Last login: Fri Sep 5 11:44:29 2014 from 10.0.0.102
Where we love is home, home that our feet may leave, but not our hearts.
[tslove@Apche_web-01 ~]$ w -------------------------------------- #=====》建立远程链接之后,可以进入远程客户端界面,进行相关用户权限内的查询操作。
13:45:07 up 1:14, 2 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
tslove pts/0 10.0.0.102 11:44 1:15m 0.11s 0.06s sshd: tslove [priv]
tslove pts/1 10.0.0.51 13:44 0.00s 0.00s 0.00s w
②第二种方式:基于密钥的安全认证方式
基于密钥柜:公钥放在服务端,私钥放在客户端。只需要用户名和私钥就可以链接。
基于密钥认证的方式使用就是一边进行加密,另一边受到之后进行解密。
③SSH相关网络攻击类型:
数据包欺骗:某IP数据包不是你的,但是伪造成了你的。
IP或主机欺骗:IP或主机名呗中间人使用了。
口令截获:中间人从网络传输过程中截获了你的数据包。
网络嗅探:中间人从网上读取你的数据包,破解分析其内容,SSH通信是加密的,即时截获数据包,也不能将其解密。
插入攻击:这种攻击,可以客户端和服务器之间发送的正文数据流之间插入任意数据,SSH1版本专门设计来检测并防止这种攻击,这种检测加大了插入攻击的难度,但是并不能完全防止,ssh2使用强加密完整性检测数段来防止这个问题,可以用3DES算法来防止这种攻击。
##SSH认证过程:
服务端请求:
第一步:服务器端批量分发管理时,运行SSH服务,生成公钥、密钥的密钥柜(1024字节)。
第二步:客户端发送连接请求时,服务端接受请求将公钥发送至客户端。
第三步:客户端收到服务端的768字节公钥之后,创建1024字节自己的密钥对,然后发送给服务端。(公钥加密、私钥解密)
第四步:服务端收到客户端的密钥对,并且进行密钥验证。
第五步:服务端验证通过,安全的SSH通道建立。
客户端请求:
第一步:客户端请求远程链接时,运行SSH服务,生成自己的密钥对。
第二步:发送公钥到服务器端,服务端验证通过接收公钥。
第三步:客户端发送连接请求,服务端收到请求之后,公钥加密质询然后发送至客户端。(验证密钥)
第四步:客户端私钥解密质询,将解密后的质询发送至服务端。 (验证质询)
第五步:服务端验证通过,安全的SSH通道建立。
3.1.3 SSH服务密钥结构
①SSH服务是通过服务端软件OpenSSH和客户端OpenSSH软件的加密连接传输实现(常见的SSH linux版本,CRT等)
②Openssh同时支持SSH1和SSH2。客户端和服务端要对应协议。SSH服务端是一个守护进程。Linux系统ssh服务是开机自启动服务。
③ssh的工作机制:客户端发送一个请求给服务端,请求远程连接,服务端检查客户端发送的数据包和IP地址。确认合法,就会发送密钥给ssh客户端,客户端(用自己的密钥和服务端发来的密钥)整合密钥发挥给服务端,自此建立连接。这也就是识别的建立过程。
④⑤SSH加密技术,实际上SSH的加密技术就是将人类可以看得懂的数据,通过程序算法实现。由于SSH1,安全性不足,我们经常使用安全程度更好的SSH2加密服务。
⑤SSH2同时支持两种密钥RSA/DSA,公钥:Server Key,私钥:Private Key,公钥和私钥,是不同机器之间建立链接的认证关键。
⑥查看详细SSH信息需要,less /etc/ssh/sshd_configssh (服务端配置文件),ssh-agent ssh-agent是一种控制用来保存公钥身份验证所使用的私钥的程序。
⑦每一台服务器都可以使用RSA几米方式产生一个1024字节的RSAKey。这个加密方式就是用来产生公钥和私钥的算法之一。Cent OS5.x是768字节,CentOS6.x就是1024字节。
⑧当客户端请求连接的时候,服务端首先进行客户端(Client)进行公钥对比。看是否一致,判断标准是Client端链接用户目录下~/.ssh.bash。服务端发送768,客户端产生256,密钥整合以后,整个密钥柜再发送服务端。
⑨⑩当客户端发送完成以后,服务端与客户端的链接以后就用1024的密钥来进行连接。整合密钥柜。联机后通过密钥柜进行传输数据。
⑦SSH2x:为了改正SSH1x的不安全缺点,SSH2加了一个确认链接正确的的机制,在每次传输数据的时候都会以这个机制来检查数据的来源是否正确,这样避免联机过程中被插入恶意代码。也就是说SSH2是相对安全的。
⑧SSH安全性能了解:(SSH心脏出血漏洞)http://www.tuicool.com/articles/eiUJva
3.2搭建部署步骤流程
①统一hosts文件。
②服务端NFS服务器和客户端建立SSH通道,
③copy密钥文件中的公钥至客户端并实现无密码远程登录管理。(注意不进入远程界面的命令格式)
④远程管理命令scp格式:
远程推送命令:scp -P端口 -p(保持属性) 目标主机用户名@IP:客户端存放路径。(可改名)
远程拉取命令:scp -P端口 -p(保持属性) 目标主机主机名@IP:拉取的文件路径 本地存放路径 (可改名,注意IP之后冒号直接接文件路径,没有空格)
⑤远程上传下载命令sftp模式,注意指定端口的参数以及命令格式的使用。
3.2 搭建部署实际操作(推送、拉取、下载、上传)
注:我们使用普通用户进行验证操作,相关管理权限,注意sudo授权。一、服务端的设置NFS[root@NFS ~]# su - tslove[tslove@NFS ~]$ iduid=500(tslove) gid=500(tslove) groups=500(tslove)[tslove@NFS ~]$ rpm -qa openssl*openssl098e-0.9.8e-18.el6_5.2.x86_64openssl-devel-1.0.1e-30.el6_6.4.x86_64openssl-perl-1.0.1e-30.el6_6.4.x86_64openssl-1.0.1e-30.el6_6.4.x86_64openssl-static-1.0.1e-30.el6_6.4.x86_64###生产1024字节的密钥柜(公钥、私钥)[tslove@NFS ~]$ ssh-keygen -t dsaGenerating public/private dsa key pair.Enter file in which to save the key (/home/tslove/.ssh/id_dsa): Created directory ‘/home/tslove/.ssh‘.Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/tslove/.ssh/id_dsa.Your public key has been saved in /home/tslove/.ssh/id_dsa.pub.The key fingerprint is:5a:92:79:af:e6:d7:69:90:42:a4:6e:ce:ea:94:cb:73 tslove@NFSThe key‘s randomart image is:+--[ DSA 1024]----+| || . || o || .o. || .+.S . || .o=..o || o+. ..o . || o..E ... + || .=+ oo. . |+-----------------+##此时链接远程需要授权以及密码验证[tslove@NFS ~]$ ssh -p52113 tslove@192.168.109.158The authenticity of host ‘[192.168.109.158]:52113 ([192.168.109.158]:52113)‘ can‘t be established.RSA key fingerprint is 1b:08:84:d1:b1:ac:77:5d:60:d7:68:9e:b0:1f:50:16.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added ‘[192.168.109.158]:52113‘ (RSA) to the list of known hosts.Address 192.168.109.158 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!###注意这里的警告信息,客户端的host文件添加解析即可解决。tslove@192.168.109.158‘s password: Last login: Sat Dec 20 10:56:30 2014 from 192.168.109.1Where we love is home, home that our feet may leave, but not our hearts.[tslove@Apache_web-01 ~]$ ifconfig eth0|sed -nr ‘s#^.*addr:(.*) Bc.*st:(.*) Ma.*$#IP地址:\1 广播地址:\2#gp‘IP地址:192.168.109.158 广播地址:192.168.109.255##本地host解析(需要root权限):cat >>/etc/hosts<<EOF192.168.109.154 Memcache192.168.109.155 Nagios192.168.109.156 LVS-01192.168.109.157 LVS-02 192.168.109.158 Apache_web-01192.168.109.159 Nginx_web-02 192.168.109.162 NFS 192.168.109.164 Backup 192.168.109.165 MySQL-01192.168.109.166 MySQL-02EOF[root@Apache_web-01 ~]# cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain6192.168.109.154 Memcache192.168.109.155 Nagios192.168.109.156 LVS-01192.168.109.157 LVS-02 192.168.109.158 Apache_web-01192.168.109.159 Nginx_web-02 192.168.109.162 NFS 192.168.109.164 Backup 192.168.109.165 MySQL-01192.168.109.166 MySQL-02###copy公钥文件分别至远程客户端##提示:第一链接均需要输入yes,以及客户端的密码验证。[tslove@NFS ~]$ ssh-copy-id -i .ssh/id_dsa.pub "-p52113 tslove@192.168.109.158"tslove@192.168.109.158‘s password: Now try logging into the machine, with "ssh ‘-p52113 tslove@192.168.109.158‘", and check in: .ssh/authorized_keysto make sure we haven‘t added extra keys that you weren‘t expecting.##无密码远程登录管理实现[tslove@NFS ~]$ ssh -p52113 tslove@192.168.109.158Last login: Sat Dec 20 11:45:12 2014 from 192.168.109.162Where we love is home, home that our feet may leave, but not our hearts.[tslove@Apache_web-01 ~]$ ifconfig eth0|sed -nr ‘s#^.*addr:(.*) Bc.*st:(.*) Ma.*$#IP地址:\1 广播地址:\2#gp‘IP地址:192.168.109.158 广播地址:192.168.109.255[tslove@Apache_web-01 ~]$ df -hFilesystem Size Used Avail Use% Mounted on/dev/sda3 6.7G 1.6G 4.9G 25% /tmpfs 116M 0 116M 0% /dev/shm/dev/sda1 194M 29M 155M 16% /boot192.168.109.162:/data/html 6.7G 1.6G 4.8G 25% /mnt##不登陆远程客户端界面进行管理维护(全路径命令格式)[tslove@NFS ~]$ ssh -p52113 tslove@192.168.109.158 /sbin/ifconfig eth0|sed -n ‘2p‘ inet addr:192.168.109.158 Bcast:192.168.109.255 Mask:255.255.255.0二、客户端的操作设置#注意host文件统一1、################################ 命令:scp 模式 ####################################第一步:创建测试文件:服务端文件a.log,内容123456.客户端文件b.log,内容abcdef#默认文件存放目录为用户家目录#服务端:[tslove@NFS ~]$ mkdir tmp[tslove@NFS ~]$ cd tmp/[tslove@NFS tmp]$ echo "123456" >a.log[tslove@NFS tmp]$ cat a.log 123456#客户端:[tslove@Apache_web-01 ~]$ lltotal 4drwxr-xr-x. 2 root root 4096 Dec 19 19:49 toos[tslove@Apache_web-01 ~]$ echo "abcdef" >b.log[tslove@Apache_web-01 ~]$ cat b.log abcdef#第二步:远程推送及拉取scp命令实现推送:[tslove@NFS tmp]$ scp -P52113 -p a.log tslove@192.168.109.158:/home/tslove/a.log 100% 7 0.0KB/s 00:00 [tslove@Apache_web-01 ~]$ lltotal 8-rw-rw-r-- 1 tslove tslove 7 Dec 20 12:43 b.logdrwxr-xr-x. 2 root root 4096 Dec 19 19:49 toos[tslove@Apache_web-01 ~]$ lltotal 12-rw-rw-r-- 1 tslove tslove 7 Dec 20 12:36 a.log-rw-rw-r-- 1 tslove tslove 7 Dec 20 12:43 b.logdrwxr-xr-x. 2 root root 4096 Dec 19 19:49 toos[tslove@Apache_web-01 ~]$ cat a.log 123456拉取:[tslove@NFS tmp]$ scp -P52113 -p tslove@192.168.109.158:/home/tslove/b.log /home/tslove/tmp/c.logb.log 100% 7 0.0KB/s 00:00 [tslove@NFS tmp]$ lltotal 12-rw-rw-r-- 1 tslove tslove 7 Dec 20 12:36 a.log-rw-rw-r-- 1 tslove tslove 7 Dec 20 12:43 b.log-rw-rw-r-- 1 tslove tslove 7 Dec 20 12:43 c.log[tslove@NFS tmp]$ cat b.log abcdef[tslove@NFS tmp]$ cat c.log abcdef#SCP重要参数的使用:-P 端口;-p 表示保持文件权限;-r 表示递归复制;可以拉取或者拷贝目录的参数 ------------------------------ ------------------#=====》对目录文件进行操作 拉取和拷贝-v 和大多数 linux 命令中的 -v 意思一样,用来显示进度,可以用来查看连接、认证或是配置错误;-C 使能压缩选项;注意事宜:#①scp是加密的远程拷贝,走的ssh的通道,过程是加密的。可以推送出本地,也可以拉回到本地。但是每一次都是全量的拷贝,所以效率不高。适用与一段没有数据,全部拷贝。#②远程推送命令scp注意@前为推送客户端用户名,@后为IP以及紧接着的客户端存放路径。#③注意命令格式(拉取)命令+端口+拉去目标主机名及IP:文件路径 本地存放路径(注意IP之后冒号直接接文件路径,没有空格)#④scp适用于文件的全量拷贝。效用不高,另一种增量拷贝rsync可以实现增量拷贝。#⑤注意命令的输入格式,路径的指定以及参数的使用。2、################################ 命令:sftp 模式 ###################################实现步骤:(默认存放目录为用户家目录)①在服务器端和客户端创建分别测试文本文件。②使用sftp命令链接远程终端。注意端口的指定使用-o参数。③在sftp模式下使用put 【本地目录文件】【远程存放目录路径】上传文件至远程客户端。④在sftp模式下使用get 【远程客户端目录文件】【本地存放目录路径】下载文件至本地服务端。⑤执行上传下载命令注意命令格式、存放路径,以及连接用户对源文件的操作权限。⑥操作完毕,执行exit退出sftp上传下载模式。[tslove@NFS tmp]$ sftp -oPort=52113 tslove@192.168.109.158Connecting to 192.168.109.158...sftp> put a.logUploading a.log to /home/tslove/a.loga.log 100% 7 0.0KB/s 00:00 sftp> get /home/tslove/b.logFetching /home/tslove/b.log to b.log/home/tslove/b.log 100% 7 0.0KB/s 00:00 sftp> exit####注意同样可以进行改名的相关操作[tslove@NFS tmp]$ sftp -oPort=52113 tslove@192.168.109.158Connecting to 192.168.109.158...sftp> get /home/tslove/b.log /home/tslove/tmp/d.logFetching /home/tslove/b.log to /home/tslove/tmp/d.log/home/tslove/b.log 100% 7 0.0KB/s 00:00 sftp> exit[tslove@NFS tmp]$ lltotal 16-rw-rw-r-- 1 tslove tslove 7 Dec 20 12:36 a.log-rw-rw-r-- 1 tslove tslove 7 Dec 20 13:07 b.log-rw-rw-r-- 1 tslove tslove 7 Dec 20 12:43 c.log-rw-rw-r-- 1 tslove tslove 7 Dec 20 13:08 d.log[tslove@NFS tmp]$ cat d.log abcdef提示:①sftp 是一个交互式文件传输程式。它类似于 ftp, 但它进行加密传输,比FTP有更高的安全性。②sftp主要实现的就是文件的全量下载和上传。⑤1.sftp -oPort=52113 user@IP上传put客户端本地路径(默认家目录)也可以指定路径上上传。get 服务端的内容下载到本地的当前目录。需要注意的是路径需要加上双引号。否则可能造成识别不出来。⑥上传下载不能是目录,只能是文件。如果对象是目录,可以使用打包命令。⑦如果链接本地windows服务端的文件操作,首先在CRT中文件选项,选择链接sftp标签。可以现拷贝windows的文件路径,注意put 后面路径的内容要使用双引号引起来,不然可能不识别。路径要看CRT中SFTP中目录路径的设置。如果修改目录路径,需要退出重新登录。##其他相关:如使用到定时任务需要注意定任务的相关规范①cron文件语法:“*”代表取值范围内的数字,“/”代表”每”,“-”代表从某个数字到某个数字,“,”分开几个离散的数字一般一行对应一个任务)分 小时 日 月 星期 命令0-59 0-23 1-31 1-12 0-7 command (取值范围,0表示周日,7也表示周日,② tar [-cxtzjvfpPN] 文件与目录参数:-c :建立一个压缩文件的参数指令(create 的意思);-x :解开一个压缩文件的参数指令!-t :查看 tarfile 里面的文件!特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!因为不可能同时压缩与解压缩。-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?-v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!-f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成『 tar -zcvPf tfile sfile』才对!在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar.gz 来作为辨识。-p :使用原文件的原来属性(属性不会依据使用者而变)③如果设置定时任务之后,想要马上生效的话,需要进入root账户重启init.d/cron restart进程。④一定要确认定时任务前的正确系统时间同步更新。★⑤一定要确认定时任务的书写规范,与目录路径的正确指定。★⑥一定要熟练掌握crontab、tar、scp命令的使用。★⑦ntpdate time-a.nist.gov 直接更新系统时间。
3.3 批量分发管理简单脚本学习参考
[binzai@ssh-server scripts]$ cat fenfa_host.sh ---------------------------------------#→实现把脚本当前目录下的文件拷贝到所有服务器的任意目录 #!/bin/sh . /etc/init.d/functionsfile="$1" -------------------------------------------------------------------------------- #→传参文件 remote_dir="$2" --------------------------------------------------------------------#→远程服务器目录 if [ $# -ne 2 ];then --------------------------------------------------------#→如果传的参数不等于2个,那么就打印如下报错信息。 --------------------------------------------------------------------#→ $#:获取当前shell命令行中的参数的总个数 --------------------------------------------------------------------#→ -ne:不等于 echo "usage:$0 argv1 argv2" -----------------------------------------------------------#→$0:首个参数(fenfa_host.sh) echo "must have two argvs."exitfifor ip in $(cat /home/binzai/scripts/all_iplist.txt) ---------------------------------------#→$():在脚本里引用全局变量,for循环执行 doscp -P22 -r -p $file binzai@$ip:~ >/dev/null 2>&1 &&\ ---------------------------#→#→将hosts文件传到binzai家目录下,如果没有传递过去,将丢弃到/dev/null ssh -p 22 -t binzai@$ip sudo rsync -avz -P $file $remote_dir >/dev/null 2>&1 ----#→通过ssh通道执行sudo命令将hosts文件拷贝到/etc目录下if [ $? -eq 0 ];then -------------------------------------------------------------------------#→如果上次执行结果返回值等于0,则执行OK。如果不等于0,则执行NO -------------------------------------------------------------------------#→$?:上次执行结果的返回值 -------------------------------------------------------------------------#→-eq:等于的判断式action "$ip is successful." /bin/trueelseaction "$ip is failure." /bin/falsefidone第二个案例学习#!/bin/bash ------------------------------------------------------#→ 声明这个脚本使用shell名称# this scripts comes from oldboy trainning‘s student. --------------------------------------#→ 这个脚本的声明来源# e_mail:70271111@qq.com # qqinfo:49000448 # function: remote dis ssh key. -----------------------------------------------------------------#→脚本的功能SSH密钥分发# version:1.1 -------------------------------------------------------------------------------#→版本信息. /etc/init.d/functions -------------------------------------------------------------------------------#→脚本文件file="$1" ---------------------------------------------------------------------------------------#→定义传参的文件,就是目标文件定义为$1remote_dir="$2" -----------------------------------------------------------------------------------#→ 定义远程服务器目录$2if [[ $# -ne 2 ]];then ----------------------------------------------------------------------#→ if then 条件判断式 (符合条件判断的时候,进行某项工作)echo "usage:$0 argv2" --------------------------------------------------------------------#→ $#获取当前命令中参数总个数,-ne 2:不等于2,echo "must have one argvs" -------------------------------------------------------------#→ $0首个参数(脚本)exit ---------------------------------------------------------------------#→fi ----------------------------------------------------------------------#→ fi意思是结束if之意。判断式的规范function KNOWN_HOST_REBUILD() --------------------------------------------------------#→定义脚本中的函数{ #确保本机存在known_hosts列表 [ ! -e ~/.ssh/known_hosts ] && mkdir -p ~/.ssh/ && touch ~/.ssh/known_hosts local i=$1 sed -i "/^${i} /d" ~/.ssh/known_hostsexpect -c " spawn /usr/bin/ssh oldboy@${i} echo ok; expect \"*yes/no)?\"; --------------------------------------------------------#→自动应答命令的执行(交互)send \"yes\r\"; expect eof " >/dev/null 2>&1 return 0 --------------------------------------------------------#→定义返回值[[ $? -ne 0 ]] && echo "$i know host rebuild fail,maybe the server connect error" ---------#→如果失败,提示错误信息} function PASS_PASSWD() --------------------------------------------------------#→定义函数{ ip=$1 expect -c " set timeout -1 spawn ssh-copy-id -i id_dsa oldboy@$ipexpect \"*password:\" send \"oldboy123\r\" expect eof" >/dev/null 2>&1 } function FENFA_id_dsa() { for ip in `awk ‘/^[^#]/{print $1}‘ all_client.txt` --------------------------------------------------#→取客户端IP地址do KNOWN_HOST_REBUILD $ip PASS_PASSWD $ip if [[ $? -eq 0 ]];then -------------------------------------------------------#→ 通过命令执行返回值,判断拷贝密钥文件是否成功action "$ip send id_dsa is successful" /bin/trueelse -------------------------------------------------------#→ 当条件不成立时可进行命令工作内容action "$ip send id_dsa is failed copied" /bin/falsefi -------------------------------------------------------#→ if 结束done } function FENFA_config() -------------------------------------------------------#→定义函数{ for ip in `awk ‘/^[^#]/{print $1}‘ all_client.txt` --------------------------------------------------#→取相关IP列表do port=$(grep $ip all_client.txt|awk ‘{print $2}‘) -------------------------------------------------------#→端口取值scp -P${port} -r -p ${file} oldboy@${ip}:~ >/dev/null 2>&1 && \ -----------------------------------#→批量推送文件ssh -p${port} -t oldboy@$ip sudo rsync ~/`basename ${file}` $remote_dir >/dev/null 2>&1 ---------#→通过ssh通道推送文件if [[ $? -eq 0 ]];then -------------------------------------------------------#→判断命令执行的返回值action "$ip send $file is successful!!" /bin/true- else action "$ip send $file is failed!!" /bin/false -------------------------------------------------------#→ 判断结果fi done } FENFA_id_dsa -------------------------------------------------------#→调用函数执行FENFA_config
3.4 注意事项及小结
命令小结:
①注意远程管理的hosts文件的统一。
②注意scp命令的格式以及可以进行操作文件改名的设置。
③注意sftp命令上传下载的使用格式和参数的应用。
④脚本执行的时候,确保文件目录存在以及自动交互的实现。
3.5 增删改差记录(待补充)
《本节结束》
注:本人水平有限,如有需改进之处,望不吝指导建议,谢谢!
①②③④⑤⑥⑦⑧⑨⑩
参考文章:
linux运维老男孩培训老师博客博客
http://oldboy.blog.51cto.com/all/2561410
Linux服务器集群架构部署搭建(三)NFS文件系统、SSH通道建立、批量分发管理(1)