作业13:SSH服务综合项目实战(Centos6/7)
文章目录
- 作业13:SSH服务综合项目实战(Centos6/7)
- 13.1 某企业要对两台服务器做双机互信,编写脚本解决
- 13.2 SSH连接速度慢的原因有哪些
- 13.3 SSH如何实现访问控制
- 13.4 如何使用SecureCRT或Xshell实现代理转发连接SSH服务器
- 13.5 使用跳板机一键登录目标服务器
13.1 某企业要对两台服务器做双机互信,编写脚本解决
- 实验环境
服务器 | IP | 系统 |
主动方(客户端) | 192.168.6.146/24 | Centos 6.9 |
被动方(服务器端) | 192.168.6.128/24 | Centos 7 |
#客户端
[root@lin ~]# expect
-bash: expect: command not found
[root@lin ~]# yum -y install expect
[root@lin ~]# ll ~/.ssh
total 0
#服务器端
[root@ / 04:20:21]#ll ~/.ssh
total 4
-rw-r--r--. 1 root root 965 Sep 15 15:50 known_hosts
- 客户端脚本编写
[root@lin ~]# vim ssh_mul_trust.exp
#!/usr/bin/expect
set username [ lindex $argv 0 ] # 脚本首个参数,被动方服务器用户名
set ip [ lindex $argv 1 ] # 被动方服务器IP
set passwd [lindex $argv 2 ] # 被动方服务器用户名的密码
spawn ssh-keygen # 运行并监控ssh密钥生成指令
expect "(/root/.ssh/id_rsa):" # 捕获相关问题并做输出
send "\r"
expect {
"Overwrite (y/n)?" { # 回答特殊问题:用户已经生成密钥情况
send "y\r"
exp_continue
# 当问题不存在(即还没生成密钥对),继续回答其他问题
}
"empty for no passphrase):" {
send "\r"
exp_continue
}
"again:" {
send "\r"
}
}
spawn /usr/bin/ssh-copy-id $username@$ip # 执行公钥传输命令并监控
expect {
"(yes/no)?" {
send "yes\r"
exp_continue
}
"password:" {
send "$passwd\r"
}
}
interact # 问题回答完毕留在交互界面
- 测试
# 主动方
[root@lin ~]# chmod +x /root/ssh_mul_trust.exp #权限修改
[root@lin ~]# ./ssh_mul_trust.exp root 192.168.6.128 **pw***
spawn ssh-keygen #捕获
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again: spawn /usr/bin/ssh-copy-id root@192.168.6.128
root@192.168.6.128's password:
Now try logging into the machine, with "ssh 'root@192.168.6.128'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
[root@lin ~]# ll ~/.ssh/ #已经生成密钥对文件
total 12
-rw-------. 1 root root 1675 Aug 15 17:32 id_rsa #私钥文件
-rw-r--r--. 1 root root 390 Aug 15 17:32 id_rsa.pub #公钥文件
-rw-r--r--. 1 root root 395 Aug 15 16:27 known_hosts
[root@lin ~]# ssh root@192.168.6.128 #自动ssh登陆且不需要输入密码
Last login: Sun Sep 20 21:33:07 2020 from 192.168.6.1
#被动方
[root@ / 05:46:08]#ll ~/.ssh/
total 8
-rw------- 1 root root 390 Sep 20 17:46 authorized_keys #密钥文件
-rw-r--r--. 1 root root 965 Sep 15 15:50 known_hosts
13.2 SSH连接速度慢的原因有哪些
#1.在服务器端,即被动方修改
vim /etc/ssh/sshd_config
# UseDNS yes
UseDNS no
# GSSAPIAuthentication yes
GSSAPIAuthentication no
#2. 修改后重启服务
systemctl restart sshd
- UseDNS no,取消服务端根据ip地址查找主机名(反向解析)从而取消与客户端请求的正向记录进行比较的过程,减少主机验证阶段花费的时间。
- GSSAPIAuthentication no,不允许基于GSSAPI(通用安全服务应用程序接口)的用户认证
13.3 SSH如何实现访问控制
- 方法一:修改/etc/ssh/sshd_config配置文件示例如下:
allowuser user0
allowuser user1 user2
allowuser user3 user4@192.168.1.1
#允许 user3 和从 192.168.1.1 登录的 user4 帐户通过 SSH 登录系统
allowuser user5@192.168.1.1 user6@192.168.1.2
allowuser *@192.168.1.2
#允许从 192.168.1.2 登录的 任何 帐户通过 SSH 登录系统
denyuser user0
denyuser user1 user2
denyuser user3 user4@192.168.1.1
#不允许 user3 和从 192.168.1.1 登录的 user4 帐户通过 SSH 登录系统
denyuser user5@192.168.1.1 user6@192.168.1.2
denyuserr *@192.168.1.2
#不允许从 192.168.1.2 登录的 任何 帐户通过 SSH 登录系统
- 服务器端
[root@ ~ 11:30:24]#vim /etc/ssh/sshd_config
allowusers *@192.168.6.146*
#允许地址为192.168.6.146主机通过任何用户登陆到服务器端
denyusers *@192.168.6.145*
#禁止地址为192.168.6.146主机通过任何用户登陆到服务器端
[root@ ~ 11:35:17]#systemctl restart sshd
- 客户端
[root@lin ~]# ip ad sh|grep 146 #尝试合法地址
inet 192.168.6.146/24 brd 192.168.6.255 scope global eth0
[root@lin ~]# ssh root@192.168.6.128
Last login: Sun Sep 20 23:39:42 2020 from 192.168.6.146
[root@ ~ 11:40:06]#
[root@lin ~]# ip ad sh|grep 145 #尝试不合法地址
inet 192.168.6.145/24 brd 192.168.6.255 scope global eth0
[root@lin ~]# ssh root@192.168.6.128
root@192.168.6.128's password:
Permission denied, please try again.
- 方法二:设置/etc/hosts.allow和/etc/hosts.deny两个系统配置文件,限制指定某个/段ip进行SSH登陆,示例如下:
vim /etc/hosts.allow
sshd:192.168.6.146:allow #允许192.168.6.146 ssh登录
//sshd:192.168.6.1/24:allow #允许192.168.0.1/24段 IP地址用户登录
//sshd:192.168.6.*:allow #允许192.168.0.1/24段 IP地址用户登录
vim /etc/hosts.deny
sshd:ALL:deny #拒绝了所有sshd远程连接,':deny'字段可以省略
#当hosts.allow和 host.deny相冲突时,以hosts.allow设置为准
- 方法三:iptables/tcpwrapper设置(立即生效)
#白名单测试
#服务器端
[root@ ~ 10:36:10]#iptables -A INPUT -p tcp --dport 22 -s 192.168.6.146 -j ACCEPT #允许来自192.168.6.146用户的ssh连接
#客户端
[root@lin ~]# ssh root@192.168.6.128
Last login: Mon Sep 21 10:35:10 2020 from 192.168.6.1
#黑名单测试
#服务器端
[root@ ~ 10:36:10]#iptables -A INPUT -p tcp --dport 22 -s 192.168.6.146 -j ACCEPT #不允许来自192.168.6.1网段用户的ssh连接
#客户端
[root@lin ~]# ssh root@192.168.6.128
ssh: connect to host 192.168.6.128 port 22: Connection timed out
13.4 如何使用SecureCRT或Xshell实现代理转发连接SSH服务器
名称(实验:虚拟机主机) | IP |
跳板机(Centos 6.9) | 192.168.6.146 |
目标服务器(Centos 7) | 192.168.6.128 |
- 拓扑图
ssh(PC登陆到跳板机)提供两种认证方式:口令(密码)认证方式和密钥认证方式;口令(密码)认证方式是我们最常用的一种,这里介绍密钥认证方式登录到linux/unix的方法
目的:出于安全,本地电脑是与目标服务器是网关不通的,为了能访问远程服务器数据必须做端口转发:本地运维同学主机进行SSH连接并进行公钥认证登陆的对象为跳板机(Jump-server),然后运维同学,通过跳板机与目标服务器的之间的公钥认证登陆,间接地登陆目标服务器,明白?。
- Xshell新建SSH连接(附图贴错了,连接的是跳板机ip:192.168.6.146)
- 生成密钥公钥(Public key)与私钥(Private Key)
- 在“密钥类型”项选择“RSA”公钥加密算法,“密钥长度”选择为“2048”位密钥长度,如下图:
- 在“密钥名称”中输入id_rsa_2048的文件名称,我这里为“id_rsa_2048”;在“密码”处输入一个密码用于加密私钥,并再次输入密码确认,如下图:
- 点击“下一步”,密钥生成完毕,这里显示的是公钥,我们可以复制公钥然后再保存,也可以直接保存公钥到文件,点击“保存为文件”按钮,将公钥(Public key)保存到磁盘(我放到c盘下的download目录),文件名为“id_rsa_2048.pub”
- 继续做SSH连接配置(附图信息写错了,修正:图中密码为:给刚刚生成的密钥对加密的密码)
- 设置文件传输(这里指公钥文件)的本地路径,
- 本地主机先口令登陆到跳板机,用于:下载公钥文件id_rsa_2048.pub到跳板机,并修改跳板机ssh配置文件(等到用公钥认证登陆跳板机后,方可以修改相关配置文件取消密码登陆)
#1.用于Linux同Windows进行文件传输的命令行工具传输速度比较慢,
#适用于小文件传输
[root@lin ~]# yum -y install lrzsz
#2.创建公钥文件
[root@lin ~]# cd ~/.ssh
[root@lin .ssh]# touch authorized_keys
#从3.Windows指定位置下载公钥文件
[root@lin .ssh]# rz
[root@lin .ssh]# ls #查看目录下是否下载成功,成功
authorized_keys id_rsa id_rsa_2048.pub id_rsa.pub known_hosts
#4.追加公钥到公钥文件里
[root@lin .ssh]# cat id_rsa_2048.pub >>authorized_keys #mv命令失效
#5.权限修改(必做)
[root@lin .ssh]# chmod 700 ~/.ssh
[root@lin .ssh]# chmod 600 ~/.ssh/authorized_keys
[root@lin .ssh]# ll
total 16
-rw-------. 1 root root 396 Sep 21 2020 authorized_keys
-rw-------. 1 root root 1675 Aug 15 17:32 id_rsa
-rw-r--r--. 1 root root 390 Aug 15 17:32 id_rsa.pub
-rw-r--r--. 1 root root 395 Aug 15 16:27 known_hosts
#6.修改ssh配置文件
[root@lin ~]# vim /etc/ssh/sshd_config
RSAAuthentication yes #允许RSA非对称加密算法认证
PubkeyAuthentication yes #允许公钥认证
AuthorizedKeysFile .ssh/authorized_keys
#7.#重启服务,并退出当前shell,准备进行公钥登陆
[root@lin ~]# service sshd restart
[root@lin ~]# exit
- 常见问题:xshell发起连接,报错:“所选用户密钥未在远程主机上注册”
#1.查看是否在跳板机~/.ssh目录下加载好xshell所在主机生成的RSA公钥文件
#2.是否修改好~/.ssh和~/.ssh/sshd_config的权限?(参考上述步骤)
#3./etc/ssh/sshd_config 的allowuser denyuser字段检查
#4.公钥文件是否损坏?重新生成并放跳板机到指定位置
- 公钥登陆
#1.Xshell公钥登陆
[C:\~]$
Connecting to 192.168.6.146:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Mon Aug 17 11:29:37 2020 from 192.168.6.1 #连接成功
[root@lin ~]#
#2.完成全部设置,并以密钥方式登录成功后,修改ssh配置文件
#/etc/ssh/sshd_config,禁用密码登陆,然后重启ssh服务
#PasswordAuthentication no
#说明:安全要紧
- 从跳板机登录到目标服务器
- 关于公钥分发,参考[13.1(ctrl+点击)](# 13.1 某企业要对两台服务器做双机互信,编写脚本解决)
[root@lin ~]# ssh root@192.168.6.128
Last login: Mon Sep 21 16:11:13 2020 from 192.168.6.1
13.5 使用跳板机一键登录目标服务器
主机类 | IP | 系统版本 |
本地主机 | 192.168.0.104(127.0.0.1) | Win 10 |
跳板机 | 192.168.6.146 | Centos 6.9 |
目标服务器 | 192.168.6.128 | Centos 7.0 |
- 方法一:代理方式一键登陆
- 在章节 [13.4(ctrl+点击)](# 13.4 如何使用SecureCRT或Xshell实现代理转发连接SSH服务器)基础上进行精简化,以下过程参考该章节,不再赘述:
1、本地运维同学的主机上,Xshell 生成密钥(公钥与私钥);
2、放置公钥(Public Key)到跳板机服务器~/.ssh/authorized_key文件中;
3、修改跳板机服务器ssh配置文件;
4、跳板机分发公钥(跳板机它自己的公钥不是本地主机运维同学的公钥)到目标服务器中;
- 新建连接
- 公钥登陆配置
- 指定连接后要运行的远程命令
- 连接,测试
[C:\~]$
Connecting to 192.168.6.146:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Mon Sep 21 20:40:11 2020 from 192.168.6.146
[root@ ~ 09:11:40]#ip ad sh|grep 128 #查看是否已经连接到目的服务器
inet6 ::1/128 scope host
inet 192.168.6.128/24 brd 192.168.6.255 scope global ens33
#相关防火墙配置我这里就不赘述
- 方法二:SSH端口转发方式(隧道)一键登录
- 目标服务器下载本地主机的公钥
#先通过xshell进行口令登陆目标服务器,然后在目标服务器做以下操作
#1.安装文件传输工具
[root@ ~ 12:41:36]#yum -y install lrzsz
[root@ ~ 12:43:43]#cd ~/.ssh #进入目录
[root@ ~/.ssh 12:43:49]#ll #公钥文件大小为390,权限没问题
total 8
-rw------- 1 root root 390 Sep 20 17:46 authorized_keys
...
#2.从本地主机指定路径下载公钥文件(可以直接将本地公钥文件拖动到xshell,连接到目标服务器的窗户口下,便会进行文件传输)
[root@ ~/.ssh 12:43:50]#rz
[root@ ~/.ssh 12:44:17]#ls #下载成功
authorized_keys id_rsa_2048.pub known_hosts
#3.追加新公钥到authorized_keys
[root@ ~/.ssh 12:44:26]#cat id_rsa_2048.pub >> authorized_keys
[root@ ~/.ssh 12:44:39]#ll #公钥文件大小为786,权限没问题
total 12
-rw------- 1 root root 786 Sep 22 00:44 authorized_keys
...
#4.重启ssh服务
[root@ ~/.ssh 12:45:27]#systemctl restart sshd
[root@ ~/.ssh 12:46:02]#exit #退出当前shell
logout
- 本地服务器新建两个连接
本地主机想访问目标服务器(192.168.6.128),但不能直接访问。本地主机可以访问跳板机(192.168.6.146),而跳板机可以访问目标服务器,此时就可以通过端口转发来实现,需要建立如下连接: 1.(连接1)跳板机连接设置:本地主机指定端口隧道跳转到目标服务器22号端口 2.(连接2)本地主机登录到目标服务器的隧道连接设置:负责本地主机指定端口隧道跳转到目标服务器22号端口 说白了:就是连接1负责做一个桥梁,在连接1启动之后的基础上,连接2发起,本地主机就可以通过连接1搭建的桥梁直接连接上目标服务器
- 新建连接1 (标注3:跳板机IP地址;标注4:跳板机上SSH服务器绑定的端口)
- 连接1:采用公钥认证登陆(前提:本地主机已经将本地主机的公钥分发到跳板机服务器中)
- 连接1,进行隧道搭建(标注4:设置端口转发要绑定的本地地址;标注:设置一个本地端口,不与本地端口冲突就可以了)
- 新建连接2(标注4:设置为127.0.0.1或者localhost;标注5:该端口大小与跳板机中端口转发设置(即连接1)的端口大小一致)
- 连接2采用公钥认证登陆(前提:步骤1.目标服务器下载本地主机公钥;标注5:密码是加密公钥的密码,运维同学知道)
- 连接2隧道搭建(标注6:目的服务器的ip地址;标注7:目标服务器SSH服务对应的端口)
- 测试
- 跳板机不连接,目标服务器无法正常连接到目标服务器
- 只有在跳板机连接成功连接上跳板机后,目的服务器连接才能够成功连接上目的服务器;