文章目录
SSH远程管理服务简介
SSH中的常用命令
SSH和其他远程链接工具对比
SSH安全登录
编写跳板机脚本
一、SSH远程管理服务的简介
SSH是一个安全协议,在进行数据传输时,会对传输的数据包进行加密处理,对加密后的数据再进行传输,确保了数据传输安全。
#那SSH服务主要功能有哪些呢?
1.提供远程连接服务器的服务
linux默认远程连接协议: ssh 22
telnet 23
windows默认远程连接协议:RDP(remote desktop)3389
2.对传输进行加密
二、常用协议的默认端口
ssh 22
telnet 23
http 80
https 443
ftp 20 21
RDP 3389
mysql 3306
dns 53
zabbix 10051 10050
elasticsearch 9200 9300
pop3 110
rpcbind 111
rsync 873
redis 6379
1.测试ssh和telnet服务
#1.安装telnet
[root@web01 ~]# yum install -y telnet-server
#2.启动telnet
[root@web01~]#systemctl start telnet.socket
telnet 默认端口是:23
SYNOPSYS
telnet [user@]host [port]
#3.创建普通用户
[root@nfs ~]# useradd test
[root@nfs ~]# echo 123 | passwd --stdin test
Changing password for user test.
passwd: all authentication tokens updated successfully.
#4.验证登录
[d:\~]$ telnet 10.0.0.31 23
Connecting to 10.0.0.31:23...
Connection established.
To escape to local shell, press Ctrl+Alt+].
Kernel 3.10.0-957.el7.x86_64 on an x86_64
nfs login: lhd
Password:
Last login: Tue Feb 18 09:56:30 from ::ffff:10.0.0.1
[lhd@nfs ~]$
2.ssh和telnet对比
telnet: 默认端口是:23
1.不支持root直接登录,只能用普通用户
2.明文传输数据,安全性不高。
ssh: 默认端口是:22
1.支持root直接登录
2.所有数据传递都是加密的传输
三、SSH中的常用命令
ssh
scp
sftp
ssh-copy-id
ssh-keygen
1.ssh 简单使用
#主要用来远程登录和执行命令,ssh默认使用当前用户登录。
[root@web01 ~]# ssh -p 22 root@10.0.0.31
ssh #命令
-p #指定端口(在终端无法使用)
22 #指定ssh协议端口
root #连接时使用的用户(如果不写用户,默认使用当前服务器当前用户)
@ #分隔符
10.0.0.31 #远端服务器IP
-o StrictHostKeyChecking=no #登录时跳过验证身份
# 远程登录
ssh [user@]IP
# 远程执行命令
ssh [user@]IP [commond]
2.scp远程文件传输
#常用参数:
-P 指定端口,默认是22
-p 保持传输文件属性不变
-r 表示递归拷贝目录
-l 限速
#-l 限速 单位是 kb
[root@nfs ~]# dd if=/dev/zero of=./1.txt bs=1M count=500
[root@nfs tmp]# scp file root@172.16.1.41:/backup/
root@172.16.1.41's password:
file 46% 234MB 14.5MB/s 00:18
#设置速度为10M 10*1024*8=81920
[root@nfs tmp]# scp -l 81920 file root@172.16.1.41:/backup/
#远程传输scp的简单使用
[root@nfs ~]# scp inotify.sh 172.16.1.8:/opt
inotify.sh 100% 196 26.2KB/s 00:00
[root@nfs ~]#
#scp客户端命令:
远程拷贝
#scp类似于rsync:
scp全量
rsync增量
#scp的推和拉:
#推:将本地的/etc目录推送到backup服务器的/opt目录下
[root@nfs ~]# scp -r /etc/ root@172.16.1.41:/opt/
#推:将本地的/etc目录下的文件推送到backup服务器的/opt目录下
[root@nfs ~]# scp -r /etc/* root@172.16.1.41:/opt/
#拉:将远端172.16.1.41服务器的/etc目录拉取到本地的/opt目录下
[root@nfs ~]# scp -r root@172.16.1.41:/etc /opt/
3.sftp命令的传输
#sftp与rz的对比
sftp:
1.能上传文件夹
2.能支持断点续传
3.支持上传大于4G的文件
rz:
1.不能上传文件夹
2.不支持断点续传
3.只能上传小于4G的文件
#文件传输命令:
[root@web01 ~]# sftp root@10.0.0.31
#查看连接后服务器
sftp> ls
#查看本地服务器
sftp> lls
#两种操作格式:
拉取到:
#命令 远程服务器文件 本地服务器位置
sftp> get 1_nfs.gif ./
放置于:
#命令 本地服务器文件 远程服务器位置
sftp> put /data/1_nfs.gif /tmp/
#支持图形界面的传输:
Xftp FileZilla FlashFXP
4.ssh-copy-id的使用
ssh-copy-id复制公钥至目标服务器。ssh链接需要密码或公钥,每次链接太麻烦,所以可以通过ssh-copy-id进行免密登录
[root@m01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.16.1.31
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub"
The authenticity of host '172.16.1.31 (172.16.1.31)' can't be established.
ECDSA key fingerprint is SHA256:UPOOIxMjGD7QyAGVJAVNX+3Jf65ef33D1aDmML1DBcY.
ECDSA key fingerprint is MD5:5d:7d:49:94:1d:a3:9c:2f:3c:66:db:64:3d:26:ea:90.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@172.16.1.31's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@172.16.1.31'"
and check to make sure that only the key(s) you wanted were added.
[root@m01 ~]#
#修改配置文件传输公钥于指定文件
[root@backup .ssh]# vim /etc/ssh/sshd_config
AuthorizedKeysFile .ssh/authorized_keys
#注:指示只给当前用户传输公钥
5.ssh-keygen命令的使用
[root@nfs ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:nBdSldxbnEHgOrVdaWPis90aj3ScYDWg+4zYl6PAyzk root@nfs
The key's randomart image is:
+---[RSA 2048]----+
| .o.=o+o|
| . = o.+|
| . .. + X.|
| . o .= O +|
| S .+ * . |
| ..o * *.o|
| + o Boo+|
| .E+ o..* |
| +.. o .|
+----[SHA256]-----+
[root@nfs ~]# cd .ssh/
[root@nfs .ssh]# ll
total 8
-rw------- 1 root root 1675 Apr 23 15:49 id_rsa
-rw-r--r-- 1 root root 390 Apr 23 15:49 id_rsa.pub
四、SSH远程登录验证
1.基于账户密码的方式远程登录
#需要知道服务器的IP,端口,账户,密码,才可以通过ssh客户端连接远程主机
[root@web01 ~]# ssh -p 22 root@172.16.1.31
root@172.16.1.31's password:
Last login: Tue Feb 18 11:01:54 2020 from 10.0.0.7
[root@nfs ~]#
#密码设置条件
1.复杂的密码:yonghu_12@31_sysnum(密码复杂,不易记)
2.简单的密码:1、 123、234、(简单容易被破解)
3.每台服务器密码不一样
4.密码三个月更换一次
5.输入密码错误三次自动锁死
6.密码有key,30秒一变或者1分钟一变
2.基于秘钥的方式实现远程登录
#常用的参数:
-t 指定秘钥类型 rsa dsa
-C 指定用户邮箱
1)生成秘钥
[root@nfs ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:nBdSldxbnEHgOrVdaWPis90aj3ScYDWg+4zYl6PAyzk root@nfs
The key's randomart image is:
+---[RSA 2048]----+
| .o.=o+o|
| . = o.+|
| . .. + X.|
| . o .= O +|
| S .+ * . |
| ..o * *.o|
| + o Boo+|
| .E+ o..* |
| +.. o .|
+----[SHA256]-----+
[root@nfs ~]# cd .ssh/
[root@nfs .ssh]# ll
total 8
-rw------- 1 root root 1675 Apr 23 15:49 id_rsa
-rw-r--r-- 1 root root 390 Apr 23 15:49 id_rsa.pub
2)推送秘钥到服务器
#1.命令推送:
[root@nfs ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.16.1.31
------
---
[root@nfs ~]# ssh 172.16.1.31
Last login: Tue Feb 18 12:14:27 2020 from 172.16.1.7
[root@nfs ~]#
# 手动复制公钥
#查看公钥并复制
[root@nfs ~]# cat id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvokaPfSni0HC+tppFKrKuYrSH41D1Y35wetrhtjyrjeyjh3hK7iBhiCCMRc34oBgMh1aMZQekUf8CgUlSwtR3RdgKzKP68L5R/ggmZzGYZ5UOstJd0Vw1I14kZEaBHIF734tdNYbEcv8CXFku1iQzKrwkIs4FX7k3TxogI4XcE+/ root@backup
#把公钥复制到要连接的服
[root@backup ~]# mkdir .ssh/
[root@backup ~]# vim .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCvokaPfSni0HC+tppFKrKuYrSH41D1Y3fgnFCZEGR5Xj2y1yil0s3hK7iBhiCCMRc34oBgMh1aMZQekUf8CgUlSwtR3RdgKzKP68L5R/ggmZzGYZ5UOstJd0Vw1I14kZEaBHIF734tdNYbEcv8CXFku1iQzKrwkIs4FX7k3TxogI4XcE+/ root@backup
#检查文件修改权限属性
[root@backup ~]# chmod 700 .ssh/
[root@backup ~]# chmod 600 .ssh/authorized_keys
3)免密登录检查免密ip用户
[root@nfs ~]# cat xunjian.sh
#!/bin/bash
[ $# -ne 1 ] && echo "请输入执行的命令" && exit 1
for i in 31 41 7
do
echo "######172.16.1.$i#######"
ssh root@172.16.1.$i "$1"
done
[root@m01 ~]#
3.免交互sshpass的使用
1)#安装sshpass软件包
[root@nfs .ssh]# yum install -y sshpass
2)#sshpass命令的使用
[root@nfs .ssh]# sshpass -p 1 ssh root@172.16.1.7
sshpass 命令
-p 指定密码
1 密码
ssh 连接命令
root 用户
@ 分隔符
172.16.1.7 主机
3)#sshpass的脚本的编写
[root@nfs .ssh]# vim ssh.sh
#!/bin/bash
for num in 41 31 7;do
echo ------ 10.0.0.$num -------
sshpass -p 1 ssh -o StrictHostKeyChecking=no
root@10.0.0.$num df -h
done
4.免交互expect的使用
1)#安装expect
[root@nfs ~]# yum install -y expect
2)#expect的脚本的编写
[root@nfs ~]# cat expect.exp
#!/usr/bin/expect
set ip 10.0.0.7
set pass 1
set timeout 30
spawn ssh root@$ip
expect {
"(yes/no)" {send "yes\r"; exp_continue} "password:" {send "$pass\r"}
}
expect "root@*" {send "df -h\r"}
expect "root@*" {send "exit\r"}
expect
eof
五、ssh安全优化
1.ssh的基础安全优化
SSH作为远程连接服务,通常我们需要考虑到服务的安全,所以需要对服务进⾏安全⽅⾯的配置。
1、更改远程登陆的端⼝
[root@backup ~]# vim /etc/ssh/sshd_config
Port 2222
# 修改sshd服务的默认端口
2、禁⽌root管理员直接登录
[root@backup ~]# vim /etc/ssh/sshd_config
- PermitRootLogin no
# 禁止使用root登录服务器
3、密码认证⽅式改为秘钥认证
[root@backup ~]# vim /etc/ssh/sshd_config
PasswordAuthentication no
# 禁止使用密码登录
4、重要服务不适⽤公⽹IP地址
[root@web2 ~]# vim /etc/ssh/sshd_config
UseDNS no
[root@web2 ~]# vim /etc/ssh/sshd_config
GSSAPIAuthentication no
# 禁止ssh进行dns反向解析,影响ssh连接效率参数
5、使⽤防⽕墙限制来源IP地址
GSSAPIAuthentication no
# 禁止GSS认证,减少连接时产生的延迟
2.案例
编写一个跳板机脚本
对内网所有的机器进行免密
# 创建密钥
[root@m01 ~]# ssh-keygen -t rsa
# 免密登录
[root@m01 ~]# for i in 7 8 31 41 ;do ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.1.$i; done
跳板机脚本实现
#!/bin/bash
###########################################
# 欢迎登录
# Linux 12 高级项目:跳板机
# Date: 2021.04.23
# Anther: hzl
###########################################
# 欢迎界面
echo -e "\033[36m ########################################### \033[0m"
echo -e "\033[36m # 欢迎登录 \033[0m"
echo -e "\033[36m # Linux 12 高级项目:跳板机 \033[0m"
echo -e "\033[36m # Date: 2021.04.23 \033[0m"
echo -e "\033[36m # Anther: hzl \033[0m"
echo -e "\033[36m ########################################### \033[0m"
while true;
do
echo -e "\033[36m \
1> web1 172.16.1.7 \n \
2> web2 172.16.1.8 \n \
3> nfs 172.16.1.31 \n \
4> backup 172.16.1.41 \n \
q> exit 退出登录 \n \
\033[0m"
read -p "请输入需要链接的主机:" num
echo $num
case $num in
1)
ssh 172.16.1.7
;;
2)
ssh 172.16.1.8
;;
3)
ssh 172.16.1.31
;;
4)
ssh 172.16.1.41
;;
q)
exit;
;;
*)
echo -e "\033[31m 输入错误!!! \033[0m"
;;
esac
done