SSH服务基础知识
1.基本介绍
SSH是远程连接Linux,管理Linux的服务。
Secure Shell Protocol:简写 SSH,即安全的Shell协议,默认端口22。
ssh协议属于tcp/ip协议族
2.网络服务对应端口介绍
873---rsync
22----ssh
25----smtp 邮件发送服务
110---pop3 邮件接收服务
80----web 网页服务
23----telnet
111---rpcbind
21----ftp
3389--windows远程桌面
3.远程连接服务
telnet 数据是明文的 连交换机和路由器,配置。
telnet ip port 监测端口以及服务是否好的。
服务端和客户端,称之为c/s架构,client/server
浏览器/服务器,称之为b/s架构,browser/server 大趋势。
4.ssh服务端软件
rpm -qa openssh openssl #<==查询
openssh-7.4p1-16.el7.x86_64 #<==ssh服务。
openssl-1.0.2k-16.el7.x86_64 #<==加密用的ssl。
yum install openssl openssh -y #<==安装
配置文件: /etc/ssh/sshd_config
/etc/ 服务的配置目录
5.ssh客户端工具介绍
windows:
xshell 个人免费
SecureCRT 收费
putty
linux:
ssh
6.Linux ssh客户端里含有的命令
[root@m01 ~]# rpm -ql openssh-clients
/usr/bin/scp #远程拷贝文件(加密)。
/usr/bin/sftp #ftp服务,加密的传输文件。
/usr/bin/ssh #远程连接。
/usr/bin/ssh-copy-id #拷贝密钥中的公钥文件的。
7.ssh客户端命令介绍与实践
7.1 ssh命令:远程连接linux
ssh -p 22 root@10.0.0.31
命令 -p 端口 用户@IP
上述命令相当于ssh 10.0.0.31
7.2 ssh命令:远程执行命令
ssh 10.0.0.31 ifconfig
7.3 scp命令:远程拷贝
secure copy,加密的拷贝
SCP命令参数:
-P 端口
-r 递归
-p 保持属性
-l 限制速度
推:
scp -P 22 -rp /data root@172.16.1.7:/tmp/
类似rsync远程shell的推送模式:
rsync -avz /data root@172.16.1.7:/opt
rsync -avz /data -e "ssh -p 22" root@172.16.1.7:/opt
拉:
scp -P 22 -rp root@172.16.1.7:/tmp/data /tmp/
类似rsync远程shell的拉取模式:
rsync -avz root@172.16.1.7:/opt/data /data
简单拉的写法(默认):
scp -rp 172.16.1.7:/tmp/etc /tmp
===============================
对比下scp和rsync
scp每一次都全量拷贝,加密拷贝
rsync第一次全量,以后增量拷贝,远程shell也是加密拷贝。
7.4 sftp
(了解即可)
sftp命令:加密的ftp服务,默认缺点不能锁定固定目录。
ftp:vsftp服务。RHCE课程里讲。
sftp -oPort=22 root@172.16.1.7
(exit退出)
pwd 查看当前目录
sftp> put "/etc/hosts" #上传远端家目录。
sftp> put /etc/hosts /tmp #上传远端指定目录/tmp。
sftp> get /etc/yum.conf #下载到本地家目录。
sftp> get oldboy.txt /etc #下载到本地指定目录/etc
sftp:/root> put "e:\vm\oldgirl.txt"
#上传win10文件
unzip oldboy.zip #解压zip压缩包
sftp服务也支持windows ftp客户端:
winscp,flashftp,xshell也支持
常规和服务器交互数据文件:
rz/sz 属于lrzsz
8.xshell ssh连不上服务器 如何排查?
1.ping IP(查看网络通不通):
不通:检查物理网络网线,电脑IP设置。
通:表示物理链路通的。
2.telnet ip port(查看服务端有没有开服务)
不通:查服务器端防火墙(firewalld)和SSH服务(ps -ef|grep sshd,netstat -lntup|grep sshd)
3.检查本地xshell 连接的IP 端口 协议 密码 用户
9.ssh服务端
[root@m01 ~]# ll /etc/ssh/ssh*
/etc/ssh/ssh_config #ssh配置文件。
/etc/ssh/sshd_config #sshd配置文件。
10.ssh服务配置优化
####Start by oldboy#2018-04-26###
Port 52113 #使用大于10000的端口
#跳板机、vpn没有,也没有做限制内网访问,这时候需要调端口,不是必须的
PermitRootLogin no #禁止root远程登录,可以su - root,C7需要改yes为no
PermitEmptyPasswords no #禁止空密码登录,C7默认就是
UseDNS no #不使用dns解析,yes改为no
GSSAPIAuthentication no #禁止连接慢的解决配置
ListenAddress 172.16.1.61:52113 #只允许内网IP连接SSH(172.16.1.0)
####End by oldboy#2018-04-26###
ps:#号注释的是默认设置
集群架构实际配置:
PermitEmptyPasswords no #禁止无密码登录
UseDNS no #解析域名慢
GSSAPIAuthentication no
#ListenAddress 172.16.1.61:22 #将来配置VPN安全服务之后再加此行。本机IP。
11.SSH服务通信原理
SSH协议:SSH协议有两个版本:
SSH 1.X 有漏洞,不用了
SSH 2.X 主流。
查看C6
Protocol 2
查看7:连参数都没了。
客户端秘钥位置: ~/.ssh/known_hosts
通信原理:
12.SSH两种认证方式
12.1 密码认证 pam
用户名、密码登录
12.2 秘钥认证
不需要密码了,使用秘钥文件就可以连接服务器了。
自学:如何使用xshell秘钥的方式连接Linux。
13.秘钥认证实践
实践秘钥认证:
项目实践:批量管理、批量分发内容项目
m01对web01、02批量管理,不用密码
![](https://img-blog.csdnimg.cn/20200905121135879.png)
项目经验:实现SSH批量分发文件、批量管理服务方案
借助:秘钥文件,登录的时候不用使用密码。
m01: 10.0.0.61 管理机(放钥匙)
web01:10.0.0.7 被管理机(放锁)
web02:10.0.0.8 被管理机(放锁)
普通用户oldboy(sudo提权 很麻烦),所以用root
13.1 在61(管理机)上生成密钥对(方便)。
[root@m01 ~]# ssh-keygen
ssh-keygen 连续回车
自学:如何一键生成秘钥对(不需要按回车)。
13.2 把锁放到7/8(web服务器)上
/usr/bin/ssh-copy-id #专业拷贝密钥中的公钥文件的。
ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.7
ssh-copy-id -i ~/.ssh/id_rsa.pub 172.16.1.8
# -i指定~/.ssh/id_rsa.pub文件
13.3ssh-copy-id:原理
scp -rp ~/.ssh/id_rsa.pub 172.16.1.7:~/.ssh/authorized_keys
特别注意此处权限,改了连接不上:
[root@web02 ~]# ls ~/.ssh/ -ld
drwx------ 2 root root 29 4月 22 12:18 /root/.ssh/ #700
[root@web02 ~]# ls ~/.ssh/ -l
总用量 4
-rw------- 1 root root 390 4月 22 12:18 authorized_keys #600
13.4 测试远程执行命令:
远端查询ip,此处用172,因为使用172拷贝的
ssh 172.16.1.7 ifconfig
ssh 172.16.1.8 ifconfig
13.5 用脚本批量执行命令
查询ip地址
[root@m01 ~]# cat /server/scripts/cmd.sh
ssh 172.16.1.7 ifconfig
ssh 172.16.1.8 ifconfig
[root@m01 ~]# cat /server/scripts/cmd.sh
for n in 7 8
do
ssh 172.16.1.$n ifconfig
done
执行脚本:
sh /server/scripts/cmd.sh
脚本对远程服务器执行任意命令:
[root@m01 ~]#cat /server/scripts/cmd.sh
#批量查询IP地址
for n in 7 8
do
echo "======172.16.1.$n======="
#"$1"=命令
ssh 172.16.1.$n "$1"
done
例如:
#查看
[root@m01 ~]#sh /server/scripts/cmd.sh "ls"
======172.16.1.7=======
anaconda-ks.cfg
======172.16.1.8=======
anaconda-ks.cfg
[root@m01 ~]#sh /server/scripts/cmd.sh "cat /etc/redhat-release"
======172.16.1.7=======
CentOS Linux release 7.8.2003 (Core)
======172.16.1.8=======
CentOS Linux release 7.8.2003 (Core)
#删除:
[root@m01 /data]#sh /server/scripts/cmd.sh "rm -fr /opt/*"
======172.16.1.7=======
======172.16.1.8=======
[root@web01 /mnt]#ls /opt/
#m01管理机复制文件到远端web:
[root@m01 /data]#cat /fenfa1.sh
#!/bin/sh
. /etc/init.d/functions
if [ $# -ne 2 ]
#命令行的传参个数
then
#$0:脚本名字和路径
echo "usage:/bin/sh $0 localfile remotedir"
exit 1
fi
for n in 7 8
do
scp -P 22 -rp $1 root@172.16.1.$n:$2 &>/dev/null
#判断上一条命令是否执行成功
if [ $? -eq 0 ]
then
action "172.16.1.$n successful" /bin/true
else
action "172.16.1.$n failure" /bin/false
fi
done
[root@m01 /]#mkdir /data -p
[root@m01 /]#ls /data/
[root@m01 /]#cd /data/
[root@m01 /data]#ls
[root@m01 /data]#touch {1..5}.txt
[root@m01 /data]#sh /fenfa1.sh /data /opt/
172.16.1.7 successful [ 确定 ]
172.16.1.8 successful [ 确定 ]
#web端查看
[root@web01 /mnt]#ls /opt/
data
[root@web01 /mnt]#ls /opt/data/
1.txt 2.txt 3.txt 4.txt 5.tx