码迷,mamicode.com
首页 > 系统相关 > 详细

Linux服务器集群架构部署搭建(三)NFS文件系统、SSH通道建立、批量分发管理(1)

时间:2014-12-21 01:51:09      阅读:577      评论:0      收藏:0      [点我收藏+]

标签:

命运是大海,当你能够畅游时,你就要纵情游向你的所爱,因为你不知道狂流什么会到来,卷走一切希望与梦想。
 
作者:燁未央_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-01mysql-02,备份服务器Backup为客户端,服务端和客户端实现存储目录共享。同时NFS服务工项目录和备份服务器Backup,实现实时同步。

 

②创建配置共享目录,实现RPCNFS服务的开机启动。

 

③挂载测试共享目录,并设置开机自动挂载。

 

④创建SSH密钥认证并。实现NFS-C服务端能够批量分发管理到客户端WEB服务器Apache_web-01Nginx_web-02,数据库服务器mysql-01mysql-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-01Nginx_web-02,数据库服务器mysql-01mysql-02,备份服务器Backup设置步骤:

 

①打印系统版本。

 

②检查并安装NFSRPC服务。

 

③启动RPCNFS服务并检查。

 

④设置开机自启动并检查。

 

⑤检查服务端的NFS是否畅通。

 

⑥挂载并测试。设置开机启动自动挂载。

 

二、服务器NFS服务器批量分发管理实现

 

服务器NFS服务器作为服务端,服务器WEB服务器Apache_web-01Nginx_web-02,数据库服务器mysql-01mysql-02,备份服务器Backup作为客户端设置步骤(以Rsync-举例)

 

①查看服务端和客户端内核版本信息、软件安装及版本信息。(需要统一建立用户及配置密码)

 

②服务端,创建1024字节的密钥柜,生成公钥、私钥。

 

③使用SHH命令从服务端拷贝公钥文件至客户端。

 

④通过SSH链接使得服务端NFS服务器和客户端实现无密码验证远程链接。

 

⑤通过SCP指令实现对客户端的无密码远程登录管理。

 

⑥服务端创建测试文件,进行批量分发操作。客户端创建测试文件进行拉取操作。同时客户端WEB服务器Apache_web-01,数据库服务器mysql-01mysql-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.1
Where 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 -rm
2.6.32-431.el6.x86_64 x86_64
[root@NFS ~]# yum install nfs-utils rpcbind -y
[root@NFS ~]# rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-11.el6.x86_64
nfs-utils-1.2.3-54.el6.x86_64
[root@NFS ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]
[root@NFS ~]# ps -ef | grep rpc
rpc       1215     1  0 14:11 ?        00:00:00 rpcbind
root      1219  1073  0 14:11 pts/0    00:00:00 grep rpc
[root@NFS ~]# /etc/init.d/rpcbind status
rpcbind (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 start
Starting 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:off
nfslock         0:off   1:off   2:off   3:on    4:on    5:on    6:off
[root@NFS ~]# chkconfig --list|grep rpcbind
rpcbind         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 16
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 bbs
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 blog
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 wiki
drwxr-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 localhost
Export 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.1
Where 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 -rm
2.6.32-431.el6.x86_64 x86_64
[root@Apache_web-01 ~]# yum install nfs-utils rpcbind -y
[root@Apache_web-01 ~]# rpm -qa rpcbind
rpcbind-0.2.0-11.el6.x86_64
[root@Apache_web-01 ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]
[root@Apache_web-01 ~]# /etc/init.d/rpcbind status
rpcbind (pid  1120) is running...
[root@Apache_web-01 ~]# chkconfig rpcbind on
[root@Apache_web-01 ~]# showmount -e 192.168.109.162
Export 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 16
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 bbs
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 blog
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 wiki
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 www
#########配置完毕,创建测试文件进行测试。
客户端:
[root@Apache_web-01 mnt]# touch a.log
[root@Apache_web-01 mnt]# ll
total 16
-rw-r--r-- 1 nfsnobody nfsnobody    0 Dec 20 11:22 a.log
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 bbs
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 blog
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 wiki
drwxr-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 -h
Filesystem                  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% /boot
192.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.log
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 bbs
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 blog
drwxr-xr-x 2 nfsnobody nfsnobody 4096 Dec 20 11:19 wiki
drwxr-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_squash
no_root_squash  root用户具有根目录的完全管理访问权限
no_all_squash  保留共享文件的UID和GID(默认)
root_squash  root用户的所有请求映射成如anonymous用户一样的权限(默认)
anonuid=xxx  指定NFS服务器/etc/passwd文件中匿名用户的UID
anongid=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/mntdevice is busy

 

这时候需要退出挂载目录再进行卸载。也可能使NFS server宕机了,需要强制卸载mount -lf  /mnt.

 

①优化建议:5.8X64位。要加上noatime,和nodiratime(大并发使用)nosuidnoexcenodevrwsoftrsize=32768wrize=32768(如果可以65535最好)  路径

 

②优化建议:notime nodiratimenosuidnoexce(如果安全确定得到保证可以不用),nodevrwbghardintrsrize=130172wrize=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不是瓶颈,除非网站架构太差2000PV/日)工作中“狐假虎威”,不完全取决与机房的能力,还有购买的IDCCDN服务,带宽。这样可能只要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协议是IETFNetwork Working Group所制定的一种协议。SSH的主要目的是用来取代传统的telnetR系列命令(rlogin,rsh,rexec等)远程登陆和远程执行命令的工具,实现对远程登陆和远程执行命令加密。防止由于网络监听而出现的密码泄漏,对系统构成威胁。在数据传输之前,SSH先对链接的数据包通过技术加密处理,然后进行数据传输,确保了传输的数据安全。Linux运维工作,首先第一位就是安全的重视。SSH可以防止数据在传输过程中被窃取,主要是两个功能:一是远程联telnet机服务,另一种类似FTP服务,借助ssh协议,来传输数据,提供更安全的SFTP(加密的)服务。

 

sshdSSH服务端程序

 

sftp-serverSFTP服务端程序(类似FTP但提供数据加密的一种协议)

 

scp:非交互式sftp-server的客户端,用来向服务器上传/下载文件

 

sftp:交互式sftp-server客户端,用法和ftp命令一样

 

sloginssh的别名

 

sshSSH协议的客户端程序,用来登入远程系统或远程执行命令

 

ssh-addSSH代理相关程序,用来向SSH代理添加dsa key

 

ssh-agentssh代理程序

 

ssh-keyscanssh public key 生成器

 

SSH服务基础知识小结:

 

ssh协议目前有SSH1SSH2SSH2协议兼容SSH1。目前实现SSH1SSH2协议的主要软件有OpenSSHSSH Communications软件。

 

SSH服务是安全的加密协议,用于远程连接服务器。

 

SSH默认端口是22,安全协议版本是SSH2

 

④服务端包含两个服务功能:ssh远程连接/sftp服务

 

⑤客户端包含SSH链接命令以及远程拷贝scp命令。sftp命令。

 

SSH是一种加密协议,不仅在登陆过程中对密码进行加密传送,而且对登陆后执行的命令的数据也进行加密,这样即使别人在网络上监听并截获了你的数据包,他也看不到其中的内容。⑦OpenSSH已经是目前大多数linuxBSD操作系统(甚至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同时支持SSH1SSH2。客户端和服务端要对应协议。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.x768字节,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 ~]$ id
uid=500(tslove) gid=500(tslove) groups=500(tslove)
[tslove@NFS ~]$ rpm -qa openssl*
openssl098e-0.9.8e-18.el6_5.2.x86_64
openssl-devel-1.0.1e-30.el6_6.4.x86_64
openssl-perl-1.0.1e-30.el6_6.4.x86_64
openssl-1.0.1e-30.el6_6.4.x86_64
openssl-static-1.0.1e-30.el6_6.4.x86_64
###生产1024字节的密钥柜(公钥、私钥)
[tslove@NFS ~]$ ssh-keygen -t dsa
Generating 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@NFS
The keys randomart image is:
+--[ DSA 1024]----+
|                 |
|        .        |
|       o         |
|      .o.        |
|     .+.S  .     |
|     .o=..o      |
|    o+.  ..o .   |
|   o..E ... +    |
|   .=+ oo. .     |
+-----------------+
##此时链接远程需要授权以及密码验证
[tslove@NFS ~]$ ssh -p52113 tslove@192.168.109.158
The authenticity of host [192.168.109.158]:52113 ([192.168.109.158]:52113) cant 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)? yes
Warning: 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.158s password: 
Last login: Sat Dec 20 10:56:30 2014 from 192.168.109.1
Where 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<<EOF
192.168.109.154  Memcache
192.168.109.155  Nagios
192.168.109.156  LVS-01
192.168.109.157  LVS-02  
192.168.109.158  Apache_web-01
192.168.109.159  Nginx_web-02  
192.168.109.162  NFS 
192.168.109.164  Backup  
192.168.109.165  MySQL-01
192.168.109.166  MySQL-02
EOF
[root@Apache_web-01 ~]# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.109.154  Memcache
192.168.109.155  Nagios
192.168.109.156  LVS-01
192.168.109.157  LVS-02  
192.168.109.158  Apache_web-01
192.168.109.159  Nginx_web-02  
192.168.109.162  NFS 
192.168.109.164  Backup  
192.168.109.165  MySQL-01
192.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.158s password: 
Now try logging into the machine, with "ssh ‘-p52113 tslove@192.168.109.158‘", and check in:

  .ssh/authorized_keys

to make sure we havent added extra keys that you werent expecting.
##无密码远程登录管理实现
[tslove@NFS ~]$ ssh -p52113 tslove@192.168.109.158
Last login: Sat Dec 20 11:45:12 2014 from 192.168.109.162
Where 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 -h
Filesystem                  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% /boot
192.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 ~]$ ll
total 4
drwxr-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 ~]$ ll
total 8
-rw-rw-r--  1 tslove tslove    7 Dec 20 12:43 b.log
drwxr-xr-x. 2 root   root   4096 Dec 19 19:49 toos
[tslove@Apache_web-01 ~]$ ll
total 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
drwxr-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.log
b.log                                                   100%    7     0.0KB/s   00:00    
[tslove@NFS tmp]$ ll
total 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.158
Connecting to 192.168.109.158...
sftp> put a.log
Uploading a.log to /home/tslove/a.log
a.log                                                   100%    7     0.0KB/s   00:00    
sftp> get /home/tslove/b.log
Fetching /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.158
Connecting to 192.168.109.158...
sftp> get /home/tslove/b.log /home/tslove/tmp/d.log
Fetching /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]$ ll
total 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/functions
file="$1"   -------------------------------------------------------------------------------- #→传参文件 
remote_dir="$2"       --------------------------------------------------------------------#→远程服务器目录 
if [ $# -ne 2 ];then                --------------------------------------------------------#→如果传的参数不等于2个,那么就打印如下报错信息。 
                       --------------------------------------------------------------------#→ $#:获取当前shell命令行中的参数的总个数 
                       --------------------------------------------------------------------#→ -ne:不等于 
echo "usage:$0 argv1 argv2"    -----------------------------------------------------------#→$0:首个参数(fenfa_host.shecho "must have two argvs."
exit
fi
for ip in $(cat /home/binzai/scripts/all_iplist.txt)    ---------------------------------------#→$():在脚本里引用全局变量,for循环执行 
do
scp -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/true
else
action "$ip is failure." /bin/false
fi
done
第二个案例学习
#!/bin/bash                                   ------------------------------------------------------#→ 声明这个脚本使用shell名称
# this scripts comes from oldboy trainnings student.         --------------------------------------#→ 这个脚本的声明来源
# e_mail:70271111@qq.com 
# qqinfo:49000448 
# function: remote dis ssh key.       -----------------------------------------------------------------#→脚本的功能SSH密钥分发
# version:1.1            -------------------------------------------------------------------------------#→版本信息
. /etc/init.d/functions    -------------------------------------------------------------------------------#→脚本文件
file="$1"         ---------------------------------------------------------------------------------------#→定义传参的文件,就是目标文件定义为$1
remote_dir="$2"     -----------------------------------------------------------------------------------#→ 定义远程服务器目录$2
if [[ $# -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_hosts
expect -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@$ip
expect \"*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/true
else                                     -------------------------------------------------------#→ 当条件不成立时可进行命令工作内容
action "$ip send id_dsa is failed copied" /bin/false
fi                                        -------------------------------------------------------#→ 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)

标签:

原文地址:http://www.cnblogs.com/t-slove/p/4176102.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!