SSH基本概述
SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输。确保了数据传输安全。那SSH服务主要功能有哪些呢?
1.提供远程连接服务器的服务
2.对传输的数据进行加密
那么除了SSH协议能提供远程连接服务,Telnet也能提供远程连接服务, 那么分别的区别是什么呢?
ssh服务会对传输数据进行加密, 监听在本地22/tcp端口, ssh服务默认支持root用户登录
telnet服务不对数据进行加密, 监听在本地23/tcp端口, Telnet默认不支持root用户登录
服务连接方式服务数据传输服务监听端口服务登陆用户ssh加密22/tcp默认支持root用户登陆telnet明文23/tcp不支持root用户登陆
企业面试题:
下列服务,分别使用的那个端口?
ftp DNS ssh telnet MySQL http https
案例: 使用wireshark验证telnet明文传输与ssh加密传输
1.安装telnet服务并运行
[root@m01 ~]# yum install telnet-server -y [root@m01 ~]# systemctl start telnet.socket
2.使用wireshark检测vmnet8网卡上telnet的流量

3.telnet是无法使用root用户登录linux系统,需要创建普通用户
[root@m01 ~]# useradd zls [root@m01 ~]# echo "1"| passwd --stdin zls
4.使用普通用户进行telnet登录

5.搜索wireshark包含telnet相关的流量



6.使用wireshark分析ssh流量





SSH相关命令
SSH有客户端与服务端,我们将这种模式称为C/S架构,ssh客户端支持windows、Linux、mac等平台。
在ssh客户端中包含 ssh|slogin远程登陆、scp远程拷贝、sftp文件传输、ssh-copy-id秘钥分发等应用程序。
ssh远程登录服务器命令示例
ssh -p22 root@10.0.0.61 # -p指定连接远程主机端口,默认22端口可省略 # root@remotehost # "@"前面为用户名,如果用当前用户连接,可以不指定用户 # "@"后面为要连接的服务器的IP
scp复制数据至远程主机命令(全量复制)
# -P 指定端口,默认22端口可不写 # -r 表示递归拷贝目录 # -p 表示在拷贝文件前后保持文件或目录属性不变 # -l 限制传输使用带宽(默认kb) #推:将本地/tmp/oldboy推送至远端服务器10.0.0.61的/tmp目录,使用对端的root用户 [root@m01 ~]# scp -P22 -rp /tmp/oldboy oldboy@10.0.0.61:/tmp #拉:将远程10.0.0.61服务器/tmp/oldboy文件拉取到本地/opt/目录下 [root@m01 ~]# scp -P22 -rp root@10.0.0.61:/tmp/oldboy /opt/ #限速 [root@m01 ~]# scp /opt/1.txt root@172.16.1.31:/tmp root@172.16.1.31 password: test 100% 656MB '83.9MB/s' 00:07 #限速为8096kb,换算为MB,要除以 8096/8=1024KB=1MB [root@m01 ~]# scp -rp -l 8096 /opt/1.txt root@172.16.1.31:/tmp root@172.16.1.31s password: test 7% 48MB '1.0MB/s' 09:45
结论:
1.scp通过ssh协议加密方式进行文件或目录拷贝。
2.scp连接时的用户作为为拷贝文件或目录的权限。
3.scp支持数据推送和拉取,每次都是全量拷贝,效率较低。
Sftp远程数据传输命令
#默认可以通过sftp命令连接sftp服务 sftp root@10.0.0.61 sftp -oPort=52113 root@10.0.0.61 #sftp的特殊端口连接 # sftp使用get下载文件至于本地服务器 sftp> get conf.txt /tmp/ # sftp使用put上传本地服务器文件至远程服务器 sftp> put /root/t1.txt /root/
SSH验证方式
1.基于账户密码远程登录
知道服务器的IP端口,账号密码,即可通过ssh客户端命令登陆远程主机。
➜ ~ ssh -p22 root@10.0.0.61 root@10.0.0.61 password: [root@m01 ~]#
2.基于秘钥远程登录
默认情况下,通过ssh客户端命令登陆远程服务器,需要提供远程系统上的帐号与密码,但为了降低密码泄露的机率和提高登陆的方便性,建议使用密钥验证方式。

1.在服务器上生成非对称密钥,使用-t指定密钥类型, 使用-C指定用户邮箱
[root@m01 ~]# ssh-keygen -t rsa -C 133411023@qq.com ... #默认一路回车即可 ...
2.将A服务器上的公钥推送至B服务器
#命令示例: ssh-copy-id [-i [identity_file]] [user@]machine ssh-copy-id #命令 -i #指定下发公钥的路径 [user@] #以什么用户身份进行公钥分发(root),如果不输入,表示以当前系统用户身份分发公钥 machine #下发公钥至那台服务器, 填写远程主机IP地址 #分发秘钥,[将A服务器的公钥写入B服务器~/.ssh/authorized_keys文件中] [root@m01 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.41
3.A服务器连接B服务器是无需密码的,如果能直接连接无需密码则表示秘钥已配置成功
#远程登录对端主机方式 [root@m01 ~]# ssh root@172.16.1.41 [root@nfs ~]# #不登陆远程主机bash,但可在对端主机执行命令 [root@m01 ~]# ssh root@172.16.1.41 "hostname -i" 172.16.1.41
SSH场景实践
实践场景,用户通过Windows/MAC/Linux客户端连接跳板机免密码登录,跳板机连接后端无外网的Linux主机实现免密登录,架构图如下。
实践多用户登陆一台服务器无密码
实践单用户登陆多台服务器免密码

1.windows客户端使用Xshell生成秘钥对,并下发公钥至跳板机
1) Xshell-->选择工具->新建密钥生成工具

2) 生成公钥对,选择下一步

3) 填写秘钥名称。秘钥增加密码则不建议配置

4) Windows会提示密码,继续即可

5) 生成秘钥后,点击Xshell->工具->用户秘钥管理者->选择对应秘钥的属性

6) 选择对应秘钥的公钥,将其复制

7) 将从WIndows下复制好的公钥粘贴至跳板机~/.ssh/authorized_keys中,然后测试
[root@m01 ~]# cd ; umask 077; mkdir -p .ssh ;cd .ssh [root@m01 .ssh]# vim authorized_keys #添加windows公钥
2.跳板机下发公钥至后端主机
1) 在跳板机上生成秘钥对
[root@m01 ~]# ssh-keygen -t rsa -C manager@qq.com
2) 拷贝跳板机上的密钥至后端主机,如果SSH不是使用默认22端口, 使用-p指定对应端口
[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub "-p22 root@172.16.1.31" [root@m01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub "-p22 root@172.16.1.41"
3) 在m01管理机上测试是否成功登陆两台服务器
[root@m01 ~]# ssh root@172.16.1.41 [root@nfs01 ~]# exit [root@m01 ~]# ssh root@1172.16.1.31 [root@backup ~]# exit
3.通过跳板机能实现scp拷贝文件免密码
[root@m01 ~]# scp zls.txt root@172.16.1.31:/tmp zls.txt 100% 0 0.0KB/s 00:00 [root@m01 ~]# scp zls.txt root@172.16.1.41:/tmp zls.txt 100% 0 0.0KB/s 00:00
4.通过跳板机获取所有机器的load,CPU,Memory等信息(思考:如果服务器数量多,如何并发查看和分发数据)
[root@m01 ~]# cat all.sh #!/usr/bin/bash [ $# -ne 1 ] && echo "请输入执行的命令" && exit 1 for i in 31 41 do echo "#########172.16.1.$i#####" ssh root@172.16.1.$i "$1" done
5.脚本实现(跳板机)
#!/bin/bash #jumpserver lb01=10.0.0.5 lb02=10.0.0.6 web01=10.0.0.7 web02=10.0.0.8 web03=10.0.0.9 nfs=10.0.0.31 backup=10.0.0.41 db01=10.0.0.51 m01=10.0.0.61 zabbix=10.0.0.71 menu(){ cat <<-EOF +-------------------------+ | 1) lb01 | | 2) lb02 | | 3) web01 | | 4) web02 | | 5) web03 | | 6) nfs | | 7) backup | | 8) db01 | | 9) m01 | | 10) zabbix | | h) help | +-------------------------+ EOF } #菜单函数 menu #连接函数 connect(){ ping -c 1 -w 1 $1 &>/dev/null if [ $? -eq 0 ];then ssh root@$1 else echo -e "