SSH协议
SSH(Secure Shell)主要有三部分组成:
- 传输协议
传输层提供算法协商和密钥交换。 密钥交换包括服务器身份验证,并产生加密保护的连接:它提供完整性,机密性和可选的压缩。
- TCP三次握手,Client和Server建立数据连接
- SSH版本协商,SSH-1.0和SSH-2.0,本次抓包中为SSH-2.0
- 加密算法协商,Client和Server分别发送给对方自己支持的加密算法,包括以下几类:
● hex_algorithms:密钥交换算法,如:ecdh-sha2-nistp256、,diffie-hellman-group-exchange-sha256……
● host_key_algorithms:公钥加密算法,如:ssh-rsa、ssh-dss、ecdsa-sha2-nistp256……
● encryption_algorithms:对称密钥算法,如:aes128-ctr、aes128-cbc、3des-cbc……
● mac_algorithms:哈希运算消息认证码,如:hmac-sha1、hmac-md5、hmac-ripemd16……
● copression_algorithms:压缩算法 - ECDH协商,交换公钥,根据DH算法协商出共享密钥,根据加密算法派生对称密钥
DH算法介绍
- 认证协议
用户认证层使用已建立的连接,并依赖于传输层提供的服务。 它提供了几种用于用户身份验证的机制。 这些包括传统的密码身份验证以及公共密钥或基于主机的身份验证机制。
全程基于SSH会话协商出的共享密码下加密完成。
-
口令验证
1、client请求登陆 “ssh user@host”
2、server返回自己的公钥
3、client使用server的公钥加密密码
4、client发送密文
5、server返回登陆结果 -
密钥验证
1、client生成公私钥 “ssh-keygen -t rsa”
2、client复制密钥到server “ssh-copy-id -i ~/.ssh/id_rsa.pub user@host”
3、client请求登陆 “ssh user@host”
4、server使用client的公钥加密随机字符串返回
5、client使用私钥解密字符串
6、client发送字符串
7、server认证该字符串
8、server返回登陆结果
- 连接协议
连接层在经过身份验证的连接上多路复用许多不同的并发通道,并允许登录会话的隧道和TCP转发。 它为这些通道提供流控制服务。 此外,可以协商各种特定于通道的选项。
OpenSSH
OpenSSH是用于使用SSH协议进行远程登录的主要连接工具。 它对所有流量进行加密,以消除窃听,连接劫持和其他攻击。 此外,OpenSSH还提供了一整套安全的隧道功能,多种身份验证方法以及复杂的配置选项。
OpenSSH套件包含以下工具:
- 远程操作使用ssh,scp和sftp完成。
- 使用ssh-add,ssh-keysign,ssh-keyscan和ssh-keygen进行密钥管理。
- 服务端由sshd,sftp-server和ssh-agent组成。
ssh
server:10.10.10.10
client:10.10.10.11
版本信息
[root@server .ssh]# ssh -V
OpenSSH_7.8p1, OpenSSL 1.1.1 FIPS 11 Sep 2018
调试信息
[root@server ~]# ssh -v root@10.10.10.11 #会产生大量交互信息
远程登陆
- 口令登陆
[root@server ~]# ssh root@10.10.10.10
root@10.10.10.10's password:
Last login: Thu Feb 13 00:48:25 2020 from 10.10.10.1
- 密钥登陆
[root@client ~]# ssh-keygen -t rsa -N "" -f .ssh/id_rsa
[root@neiwang ~]# ssh-copy-id -f -i ~/.ssh/id_rsa.pub root@10.10.10.11 -p 22
[root@server ~]# ssh -i .ssh/id_rsa root@10.10.10.11 -p 22
Last login: Thu Feb 13 00:53:22 2020 from 10.10.10.10
ssh:
-p:端口,默认22端口
-i:私钥
ssh-keygen:
-t:密钥类型
-N:密码
-f:密钥保存文件
ssh-copy-id:
-f:强制
-i:私钥
-p:端口
远程命令
[root@neiwang ~]# ssh root@10.10.10.11 ls ~/
anaconda-ks.cfg
反向代理
- 编辑配置文件:/etc/ssh/sshd_config:公网主机
GatewayPorts yes #如果为no则只能绑定在loopback地址上
X11Forwarding yes #允许桌面转发
AllowTcpForwarding yes #允许tcp转发
- 配置端口转发:内网主机
[root@neiwang ~]# ssh -CqTfNng -R 9260:10.10.10.10:22 root@49.233.190.182 -p 9261
root@49.233.190.182's password:
C #传输压缩
q #安静模式
T #禁止远程分配终端
f #后台运行
N #仅做端口转发,不执行远程命令
n #关闭标准输入
g #允许远端主机连接本地转发的端口
R [bind_address:]port:host:hostport #[公网主机:]公网主机端口:内网主机:内网主机端口
- 检查端口是否监听:公网主机
[root@gongwang ~]# lsof -i:9260 #检查9260端口已监听
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 23572 root 8u IPv4 969150 0t0 TCP *:9260 (LISTEN)
- 连接测试:内网主机
[C:\~]$ ssh root@49.233.190.182:9260
Connecting to 49.233.190.182:9260...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
[root@neiwang ~]# ip addr show | grep ens33
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
inet 10.10.10.10/24 brd 10.10.10.255 scope global noprefixroute ens33
正向代理
- 编辑配置文件:/etc/ssh/sshd_config:内网主机
GatewayPorts yes #如果为no则只能绑定在loopback地址上
X11Forwarding yes #允许桌面转发
AllowTcpForwarding yes #允许tcp转发
- 配置端口转发:内网主机
[root@neiwang ~]# ssh -CfNgL 9260:49.233.190.182:9261 root@49.233.190.182 -p 9261
root@49.233.190.182's password:
L [bind_address:]port:host:hostport #[内网主机:]内网主机端口:公网主机:公网主机端口
- 检查端口是否监听:内网主机
[root@neiwang ~]# netstat -tnl | grep 9260
tcp 0 0 0.0.0.0:9260 0.0.0.0:* LISTEN
tcp6 0 0 :::9260 :::* LISTEN
- 连接测试:内网主机
[C:\~]$ ssh root@10.10.10.10:9260
Connecting to 10.10.10.10:9260...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
[root@gongwang ~]# ip addr show | grep eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 172.21.0.11/20 brd 172.21.15.255 scope global eth0
动态代理
- 编辑配置文件:/etc/ssh/ssh_config:内网主机
添加:
IPQoS lowdelay throughput
- 配置端口转发:内网主机
[root@neiwang ~]# [root@neiwang ~]# ssh -CfNg -D 9260 root@49.233.190.182 -p 9261
root@49.233.190.182's password:
D [bind_address:]port #[内网主机:]内网主机端口
- 检查端口是否监听:内网主机
[root@neiwang ~]# ss -tnlp | grep -P ssh\"
LISTEN 0 128 0.0.0.0:9260 0.0.0.0:* users:(("ssh",pid=17836,fd=7))
LISTEN 0 128 [::]:9260 [::]:* users:(("ssh",pid=17836,fd=8))
- 连接测试:内网主机
配置文件
Host * #匹配到字串的主机有效,“*”表示所有的主机
PasswordAuthentication yes #启用基于口令认证
BatchMode no #批处理模式,不会显示交互式口令输入,
#而是直接失败,从而避免批处理的时候卡住
CheckHostIP yes #检查主机地址,防止dns欺骗
AddressFamily any #ipv4 ipv6 any
ConnectTimeout 0 #连接超时,0不超时
StrictHostKeyChecking ask #~/.ssh/known_hosts
#有两种功能,一是是否会自动地将远程主机的公钥记录到known_hosts中,二是当远程主机的公钥变化了,是否允许本地主机进行登录。
#当StrictHostKeyChecking=no时,表示在连接远程主机时,会主动把对方的公钥加到known_hosts中,而不会提示用户是否要记录
#这样的信息,且当远程主机的公钥变化了,仍然会连接上,不会出现因为公钥不对连接失败。
#同时 UserKnownHostsFile /dev/null 选项指向null
UserKnownHostsFile ~/.ssh/known_hosts #known_hosts文件
IdentityFile ~/.ssh/id_rsa #私钥文件
Port 22 #监听端口
Protocol 2 #ssh v2
Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc #公钥算法
MACs hmac-md5,hmac-sha1,umac-64@openssh.com #hmac算法
IPQoS lowdelay throughput #qos低延时、高吞吐量,用于Qos检测命令
#不被对端支持,导致连接丢失
#指定连接的IPv4服务类型或DSCP类。可接受的值为af11、af12、af13、af21、af22、af23、af31、af32、af33、af41、af42、
#af43、cs0、cs1、cs2、cs3、cs4、cs5、cs6、cs7、ef、低延迟、吞吐量、可靠性、数值或无以使用操作系统默认值。此选项可
#以采用一个或两个由空格分隔的参数。如果指定了一个参数,则无条件地将其用作数据包类。
#如果指定了两个值,则会自动为交互式会话选择第一个值,为非交互式会话选择第二个值。交互会话的默认值是af21(低延迟数据),
#非交互会话的默认值是cs1(较低的工作量)。
scp
NAME
scp — secure copy (remote file copy program)
SYNOPSIS
scp [-346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file] [-l limit] [-o ssh_option]
[-P port] [-S program] source ... target
OPTIONS
-C #压缩传输
-p #保留原文件的修改时间,访问时间和访问权限
-q #不显示传输进度条
-r #递归复制整个目录
-v #详细方式显示输出
-i identity_file #指定私钥
-l limit #限定用户所能使用的带宽,以Kbit/s为单位
-P port #端口
主机:10.10.10.10
[root@neiwang ~]# scp -rpC ~/test/ root@10.10.10.11:~/
1 100% 0 0.0KB/s 00:00
2 100% 0 0.0KB/s 00:00
3 100% 0 0.0KB/s 00:00
4 100% 0 0.0KB/s 00:00
5 100% 0 0.0KB/s 00:00
主机:10.10.10.11
[root@client ~]# tree
.
└── test
├── 1
├── 2
├── 3
├── 4
└── 5
sftp
服务端就不研究了,感觉没撒用
交互命令
cd 更改到远程目录的路径
lcd 更改到本地目录的路径
exit 退出 sftp
help 显示这个帮助文本
get 远程路径 下载文件
ls 显示远程目录列表
lls 显示本地目录列表
mkdir 创建远程目录
lmkdir 创建本地目录
mv 移动远程文件
put 上传文件
pwd 显示远程工作目录
lpwd 打印本地工作目录
quit 退出 sftp
rmdir 移除远程目录
lrmdir 移除本地目录
rm 删除远程文件
lrm 删除本地文件
sshd
配置文件
Port 22 #sshd服务监听端口
AddressFamily any #any"(默认)、"inet"(仅IPv4)、"inet6"(仅IPv6)
ListenAddress 0.0.0.0 #监听IPv4地址
ListenAddress :: #监听IPv6地址
#Ciphers and keying
HostKey /etc/ssh/ssh_host_rsa_key #主机私钥文件
#Logging
SyslogFacility AUTHPRIV #日志Facility,/etc/rsyslog.conf中定义
LogLevel INFO #日志级别
#Authentication
LoginGraceTime 2m #限制用户在规定时间内认证成功,默认120秒,0表示不限制
PermitRootLogin yes #允许root用户登陆
StrictModes yes #client的host key改变,server就不接受登陆
MaxAuthTries 6 #最大认证尝试次数,如果失败超过该数值一半,连接被强制断开
MaxSessions 10 #单个连接最大会话数
PubkeyAuthentication yes #启用公钥认证
AuthorizedKeysFile .ssh/authorized_keys #公钥认证检查的公钥保存文件
PasswordAuthentication yes #启用口令认证
PermitEmptyPasswords no #不允许空密码
UsePAM yes #使用pam
AllowTcpForwarding yes #是否允许tcp转发
GatewayPorts no #GatewayPorts指令可以让 sshd 将远程端口转发绑定到非loopback地址,
#这样就可以允许远程主机连接了
#"no"表示仅允许本地连接
#"yes"表示强制将远程端口转发绑定到统配地址(wildcard address),
#"clientspecified"表示允许客户端选择将远程端口转发绑定到哪个地址
X11Forwarding yes #允许X11转发
X11DisplayOffset 10 #指定X11转发的第一个可用的显示区(display)数字
X11UseLocalhost yes #是否应当将X11转发服务器绑定到本地loopback地址
PermitTTY yes #允许模拟终端分配
PrintMotd no #不打印/etc/motd文件内容
PrintLastLog yes #在每一次交互式登录时打印最后一位用户的登录时间
TCPKeepAlive yes #向客户端发送 TCP keepalive 消息,检测tcp连接是否存活
Compression delayed #"yes"允许,"no"进制,"delayed"延迟到认证成功之后再对通信数据压缩
ClientAliveInterval 0 #向客户端发送alive消息,探测客户端是否存活,0表示不发送
ClientAliveCountMax 3 #连续向客户端发送3个alive消息,客户端仍未回复,会话将被强制断开
ShowPatchLevel no #不显示ssh的补丁信息
UseDNS no #不对远程主机名进行反向解析
PidFile /var/run/sshd.pid #ssh的pid文件