1、SSHD服务

1.1 openssh服务

openssh服务:用来实现加密的远程连接/数据传输

openssh-server服务端:sshd服务、配置文件:/etc/ssh/sshd_config

openssh-clients客户端:scp、ssh命令,客户端配置文件:/etc/ssh/ssh_config

openssh服务端软件包名为:openssh-server,客户端软件包名:openssh-clients

sshd服务的重启:

systemctl restart sshd
或者
systemctl reload sshd

sshd服务的日志保存在:/var/log/secure文件中

1.2 telnet与openssh

服务共同点区别应用场景
openssh服务远程连接数据加密,端口:22默认使用openssh
telnet-server服务远程连接数据未加密,端口:23升级openssh服务的时候,启动telnet服务即可

telnet服务:

telnet服务端口:23

m01主机:ip:192.168.10.61、172.16.1.61

#1、安装telnet服务
[root@m01 ~]#yum install -y telnet-server
#2、启动telnet服务
[root@m01 ~]#systemctl disable telnet.socket
[root@m01 ~]#systemctl start  telnet.socket

在Windows命令行连接:

输入用户、密码即可登录,注意:默认禁止root用户登录。

在Linux中连接登录:

[root@nfs01 ~]#telnet 192.168.10.61 23
Trying 192.168.10.61...
Connected to 192.168.10.61.
Escape character is '^]'.

Kernel 3.10.0-1160.el7.x86_64 on an x86_64
m01 login: test
Password: 
Last login: Tue Jun 13 00:04:41 from ::ffff:192.168.10.1
[test@m01 ~]$

1.3 抓包

使用Wireshark抓包查看telnet。

由于虚拟机使用vnet8模式,所以双击vnet8:

输入telnet,过滤telnet数据包:

登录后,看包的信息:

找一个有Password的包,再往下找(密码有多长,就从Password的包开始往下按顺序连续找多个,连起来就是密码了),就是登录的密码,由于不加密,所以是明文显示。

1.4 openssh-server配置文件

核心配置文件:/etc/ssh/sshd_config

参数详解:

连接加速的参数说明
UseDNS no是否开启反向解析:ip–>域名或主机名,默认是yes,开启,要设为no
GSSAPIAuthentication no关闭GSS认证功能,默认是:yes,开启
安全优化项目
Port端口,默认是22。端口范围:1-65535,一般修改为10000以上的数字
PermitRootLogin是否运行使用root进行远程登录(默认是yes),Ubuntu中默认为no。设置禁止root远程登录前,要确保系统中有普通用户,否则无法远程连接。
ListenAddress监听的地址(后面需指定本地网卡的ip地址),可以控制用户只能通过内网访问。应用建议:一般配合堡垒机、vpn使用

修改配置文件前要备份,例如:

[root@m01 ~]#sed -ri.bak '/^(UseDNS|GSSAPIAuthentication|Port|PermitRootLogin)/s@^@#@g' /etc/ssh/sshd_config
[root@m01 ~]#cat >> /etc/ssh/sshd_config <<EOF
UseDNS no
GSSAPIAuthentication  no
PermitRootLogin yes
Port 22
EOF

1.5 openssh-client客户端命令

客户端命令有:

scp:远程传输文件
ssh:远程连接
sftp:远程传输文件(一般开发通过图形化界面,使用ftp工具)
1)scp

scp命令格式:scp 选项 文件或目录 用户名@ip:目录

选项:
-r:递归传输,传输目录
-p:保持属性不变
-P:大写p,指定端口
例如:
scp  -rp  -P  22  1.txt  root@192.168.10.41:/tmp/
2)ssh

功能:

1、远程连接
2、远程连接并执行命令或脚本(不要执行交互式命令)

案例01:使用root用户远程连接到192.168.10.31的22端口

[root@m01 ~]#ssh -p 22 root@192.168.10.31

案例02:使用root用户远程连接到92.168.10.31的22端口并执行whoami命令

[root@m01 ~]#ssh -p 22 root@192.168.10.31  whoami

案例03:使用root用户远程连接到92.168.10.31的22端口并执行whoami、ls、ip a命令

[root@m01 ~]#ssh -p 22 root@192.168.10.31 “whoami; hostname”
[root@m01 ~]#ssh -p 22 root@192.168.10.31 “whoami && hostname”

&&:并且,命令行中表示前一个命令执行成功再执行后面的命令

;分号,用于分隔命令,相当于是1行的结束

从上面可以看到,ssh远程连接的时候,需要输入密码验证

3)sftp

sftp是Linux中ftp的客户端,和lrzsz类似,缺点:传输大文件慢

ftp文件传输协议,服务端端口是21(命令端口,用于接受客户端发出的相关ftp命令和参数)和20(数据端口,用于传输数据)
openssh(sshd)也提供了ftp功能,端口是22
ftp客户端:sftp命令,xftp软件,winscp...

如果上传大文件,建议使用ftp或scp

2、远程连接安全优化

安全优化:修改默认端口,进制root用户远程登录,指定可以远程登录的ip

Port:端口,默认是22。端口范围:1-65535,一般修改为10000以上的数字
PermitRootLogin:是否运行使用root进行远程登录(默认是yes),Ubuntu中默认为no。设置禁止root远程登录前,要确保系统中有普通用户,否则无法远程连接。 ListenAddress:监听的地址(后面需指定本地网卡的ip地址),可以控制用户只能通过内网访问。应用建议:一般配合堡垒机、vpn使用

3、密钥认证

1、概述

Linux中连接主机的时候需要输入用户名、密码。对于一些批量操作,每次都输入密码,这样操作不太方便。此时,需要有一种新的方法,每次连接不需要输入密码。这个方法叫:密钥认证(免密码登录,双机互信)

2、密钥认证实践

第1步:创建密钥对

第2步:把公钥发送给对应的节点

#1、创建密钥对
[root@m01 ~]#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:                   #直接回车
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:tuD/bbroKSG3gIaHIFgU7qbZlfRG1jUz6SdZD08FMAs root@m01
The key's randomart image is:
+---[RSA 2048]----+
| .o.      E.o..o.|
| ..    . ..=oo.  |
|... . o .. o.=   |
|+. . =    + . o  |
|ooo.o + S  o     |
|o=+.oooo .       |
|oo.  +.o.        |
|      o. o ..    |
|       o=.++.    |
+----[SHA256]-----+
[root@m01 ~]#ll -a /root/.ssh/
total 12
-rw-------  1 root root 1679 Jun 13 21:57 id_rsa      #私钥
-rw-r--r--  1 root root  390 Jun 13 21:57 id_rsa.pub  #公钥
-rw-r--r--  1 root root  175 Jun 13 21:24 known_hosts #记录连接过多少主机的文件
[root@m01 ~]#

#2、把公钥发生给对应节点,比如,发送给192.168.10.31主机
[root@m01 ~]#ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.10.31
[root@m01 ~]#
#-i:指定公钥文件,默认情况下,创建密钥的时候没有修改默认的存放位置的话,则可以省略-i,比如:
[root@m01 ~]#ssh-copy-id  root@192.168.10.31

3、如何自动分发公钥

上面分发公钥的时候,需要输入yes、输入密码,很不方便,怎么可以做到不需要手动输入yes、密码?

输入密码:

#安装sshpass
[root@m01 ~]#yum install -y sshpass
#sshpass使用:sshpass -p密码  ssh|ssh-copy-id  主机
[root@m01 ~]#sshpass -p12345 ssh-copy-id  192.168.10.7
#但是,不安全,密码暴露了
#如果是第1次连接,则需要输入yes或no,因此会执行失败

解决yes/no的问题

1、彻底关闭yes/no提示,修改配置文件的Host  key  check参数,但不推荐
2、仅仅在使用ssh-copy-id的时候关闭,ssh-copy-id命令使用-o选项,把 StrictHostKeyChecking设为no,例如:
[root@m01 ~]#sshpass -p12345 ssh-copy-id -o  StrictHostKeyChecking=no 192.168.10.7
-o选项,本质是ssh命令的选项

4、批量分发

使用脚本(for循环)

for循环格式:

for  变量名   in  列表
do
     命令
done

例如:

[root@m01 ~]#for n in {1..3}; do  echo $n; done
1
2
3
[root@m01 ~]#for n in 1 2 3; do  echo $n; done
1
2
3
[root@m01 ~]#

使用脚本:

[root@m01 ~]#vim /server/script/fenfa_pub.sh
#!/bin/bash
#author:xzm
#desc:批量分发公钥

#1、vars
##给这3台机子:172.16.1.31、172.16.1.41、172.16.1.7,密码均为:12345
ips="31 41 7"
passwd=12345
#2、for
for ip in $ips
do
    echo "ip addr:172.16.1.$ip"
    sshpass -p$passwd ssh-copy-id -o  StrictHostKeyChecking=no  172.16.1.$ip
done

执行脚本:

[root@m01 ~]#sh /server/script/fenfa_pub.sh

5、一键创建密钥对

[root@m01 ~]#ssh-keygen -f /root/.ssh/id_rsa -P ''

修改脚本:

[root@m01 ~]#vim /server/script/fenfa_pub.sh
#!/bin/bash
#author:xzm
#desc:批量分发公钥

#1、vars
##给这3台机子:172.16.1.31、172.16.1.41、172.16.1.7,密码均为:12345
ips="31 41 7"
passwd=12345
#一键创建密钥对,如果密码文件不存在的话,则创建
[ ! -e /root/.ssh/id_rsa ] && ssh-keygen -f /root/.ssh/id_rsa -P ''
#2、for
for ip in $ips
do
    echo "ip addr:172.16.1.$ip"
    sshpass -p$passwd ssh-copy-id -o  StrictHostKeyChecking=no  172.16.1.$ip
done

选项参数:

ssh-keygen -f /root/.ssh/id_rsa -P ''
-f:指定密钥文件位置和文件名
-P:指定密码短语,用""或''表示设置为空