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:指定密码短语,用""或''表示设置为空