OpenSSH

SSH协议

SSH(Secure Shell)主要有三部分组成:
在这里插入图片描述

  • 传输协议
    传输层提供算法协商和密钥交换。 密钥交换包括服务器身份验证,并产生加密保护的连接:它提供完整性,机密性和可选的压缩。
    在这里插入图片描述
  1. TCP三次握手,Client和Server建立数据连接
  2. SSH版本协商,SSH-1.0和SSH-2.0,本次抓包中为SSH-2.0
  3. 加密算法协商,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:压缩算法
  4. ECDH协商,交换公钥,根据DH算法协商出共享密钥,根据加密算法派生对称密钥
    DH算法介绍
  • 认证协议
    用户认证层使用已建立的连接,并依赖于传输层提供的服务。 它提供了几种用于用户身份验证的机制。 这些包括传统的密码身份验证以及公共密钥或基于主机的身份验证机制。

全程基于SSH会话协商出的共享密码下加密完成。

  1. 口令验证
    1、client请求登陆 “ssh user@host”
    2、server返回自己的公钥
    3、client使用server的公钥加密密码
    4、client发送密文
    5、server返回登陆结果

  2. 密钥验证
    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套件包含以下工具:

  1. 远程操作使用ssh,scp和sftp完成。
  2. 使用ssh-add,ssh-keysign,ssh-keyscan和ssh-keygen进行密钥管理。
  3. 服务端由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

反向代理

  1. 编辑配置文件:/etc/ssh/sshd_config:公网主机
GatewayPorts yes  #如果为no则只能绑定在loopback地址上
X11Forwarding yes  #允许桌面转发
AllowTcpForwarding yes  #允许tcp转发
  1. 配置端口转发:内网主机
[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 #[公网主机:]公网主机端口:内网主机:内网主机端口
  1. 检查端口是否监听:公网主机
[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)
  1. 连接测试:内网主机
[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

正向代理

  1. 编辑配置文件:/etc/ssh/sshd_config:内网主机
GatewayPorts yes  #如果为no则只能绑定在loopback地址上
X11Forwarding yes  #允许桌面转发
AllowTcpForwarding yes  #允许tcp转发
  1. 配置端口转发:内网主机
[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  #[内网主机:]内网主机端口:公网主机:公网主机端口
  1. 检查端口是否监听:内网主机
[root@neiwang ~]# netstat -tnl | grep 9260
tcp        0      0 0.0.0.0:9260            0.0.0.0:*               LISTEN     
tcp6       0      0 :::9260                 :::*                    LISTEN 
  1. 连接测试:内网主机
[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

动态代理

  1. 编辑配置文件:/etc/ssh/ssh_config:内网主机
添加:
IPQoS lowdelay throughput
  1. 配置端口转发:内网主机
[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  #[内网主机:]内网主机端口
  1. 检查端口是否监听:内网主机
[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))
  1. 连接测试:内网主机
    在这里插入图片描述
    在这里插入图片描述

配置文件

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文件

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值