SSH基础知识
- SSH
- 对称加密
- 非对称加密
- 如何生成秘钥
- 如何管理秘钥
- 不同版本
- ssh命令
- 安装ssh
- 启动ssh服务
- 登录ssh
- 退出ssh登录
- 远程登录执行命令
- ssh参数
- 端口转发
- 本地转发
- 远程转发
- 动态转发
最近有用到SFTP协议完成一些功能开发,这玩意和FTP比较像,当时以为是升级版,搜索了下,两者并不一样。做个笔记浅记一下。
在了解SFTP前,先了解下SSH。
SSH
SSH 安全外壳协议(Secure Shell),它是通过在不安全的网络中创建一个加密的安全隧道,以保证安全的传输环境。
一些基本概念:
- 明文:是指客户端和服务器交互时的可读信息,密文解密后可获得
- 密文:是指对明文加密后的信息
- 秘钥:用于明文加密、密文解密和完整性校验等所使用的的信息
- 私钥:私有秘钥
- 公钥:公有秘钥
对称加密
加密解密使用同一套秘钥,常见算法(AES
、DES
)。优点效率高、速度快;缺点多个客户端就会导致秘钥数目多,且容易泄密,不便管理
非对称加密
在非对称加密中,需要有四个秘钥(服务器公钥、服务器私钥、客户端公钥、客户端私钥)。公钥是对外公开的,秘钥是自己私有的。主要算法RSA
.
- 一个客户端和服务器之间通信产生一对用于加解密的公钥和私钥
- 服务器的私钥保密,公钥告诉客户端;客户端的私钥保密,公钥告诉服务器
- 服务器要给客户端发送信息时,服务器用客户端的公钥加密信息,再将加密后的密文发送给客户端
- 客户端收到这个密文后,用自己的私钥解密该密文。其他所有收到这个报文的人都无法解密,因为只有当前客户端才有自己的私钥
- 客户端给服务器发消息和上面流程一样
公钥只能用做数据加密。公钥加密的数据,只能用对应的私钥才能解密。这是非对称加密的核心概念。
如何生成秘钥
可以使用ssh-keygen
工具生成秘钥
使用ssh-keygen
命令可以生成一对秘钥(公钥、私钥)。一般保存在~/.ssh
目录下。
命令常用选项:
-t:指定要创建的密钥类型(rsa、dsa),默认是rsa
-f:指定保存生成的秘钥文件的文件名
-C:添加注释,在公钥文件的末尾;
-b:指定密钥长度,默认2048位
-N password: 指定使用秘钥的密码
执行命令后在~/.ssh目录先会有两个文件(已rsa为例):
id_rsa 是私钥文件
id_rsa.pub 是公钥文件
如何管理秘钥
ssh-agent
和 ssh-add
是用于管理私钥的
使用命令如下:
# 启动代理
eval `ssh-agent`
# 关闭代理
ssh-agent -k
# 查看代理中的私钥
ssh-add -l
# 查看代理中私钥对应的公钥
ssh-add -L
# 移除指定的私钥
ssh-add -d pub_key_path(私钥路径)
# 移除所有的私钥
ssh-add -D
不同版本
SSH主要有两大版本SSH1
和SSH2
,两个版本互不兼容。
ssh命令
安装ssh
ssh
(SSH 客户端) 用于登录远程主机,并且在远程主机上执行命令.。
要使用ssh
,首先要安装客户端(openssh-client
)和服务器(openssh-server
).
apt-get install openssh-client
apt-get install openssh-server
ssh
服务器的配置文件位于/etc/ssh/sshd_config
启动ssh服务
- 方法一
/etc/init.d/ssh restart
- 方法二
service ssh restart
查看服务状态:
service ssh status
登录ssh
在linux
上启动ssh
服务后,可以在其他主机上使用ssh
远程登录了。
命令格式如下:
ssh username@remote_ip -p port
退出ssh登录
使用exit
即可退出ssh
登录
远程登录执行命令
在ssh
命令后面添加需要执行的cmd
命令,如下所示:
ssh参数
- -1、-2:指定SSH1/SSH2协议
- -4、-6:指定IPV4/IPV6协议
- -p:指定SSH客户端连接服务器端口
- -q :安静模式,不向用户输出告警信息
- -R:指定远程端口转发
$ ssh -R port:host_sshserver:hostport local
监听本地port
端口,将发向该端口的请求转向服务端的hostport
端口 - -D:动态端口转发
ssh -D portsshserver
本地分配了一个 socket 侦听port
端口,该端口收到的请求,都将转发到远程的 SSH 主机。支持SOCKS4/5
协议 - -L:本地端口转发
- -N:表示建立的ssh链接只用于端口转发
- -l:指定远程登录的用户名
- -i:指定私钥,默认
~/.ssh/id_dsa
- -F:指定配置文件
- -f: SSH 连接在后台运行
- -C:数据压缩传输
- -c:指定加密算法
- -o:指定配置命令
- -v:显示过程信息,也可以-vv -vvv
- -V:显示版本信息
端口转发
本地转发
本地端口转发是指以SSH服务器作为中介建立本地计算机和目标服务器之间的加密连接。
命令格式:
ssh -L local_port:target_addr:target_port tunnel_addr
> -L:本地转发
> lacal_port:本地端口
> target_addr:目标地址
> target_port :目标端口
> tunnel_addr:跳板(隧道)服务器
如图所示:主机A和服务器B,服务器B和机器C之间可以互相通信,但是主机A无法直接与机器C通信。此时如果需要主机A和机器C通信,就可以使用本地端口转发,以服务器B为跳板访问C服务器。
例如命令如下:
ssh -L [localhost]1000:机器C_addr:8888 服务器B_addr
此处表示,到本地转发端口1000
的数据将通过服务器B_addr
转发至目标机器C
的8888
端口。此处默认绑定到本地回环地址127.0.0.1
。如果需要允许远端主机连接本地转发的端口,可以添加-g
选项。命令如下:
ssh -L -g 1000:机器C_addr:8888 服务器B_addr
该命令表示:监听本地端口1000
,当有主机连接本地端口1000
时,数据将通过服务器B_addr
转发至目标机器C
的8888
端口。
远程转发
如图所示:主机B
和主机C
可以互相通信,主机B
可以访问主机A
,但是主机A
不可以访问主机B
。此时如果想让主机A
访问主机C
就不能使用本地端口转发,因为主机A
无法访问主机B
,主机B
就不能作为跳板。
因此此时如果想让主机A
访问主机C
,可用一下方法:
在主机A
上启动sshd
服务,在主机B
上执行远程端口转发,将主机A
端口(1000
)的数据转发至主机C
的指定端口8888
,在主机B
上执行的命令如下:
ssh -R 1000:C_addr:8888 A_addr
也可以将数据转发至主机B
的指定端口:
ssh -R 1000:B_addr:6666 A_addr
上面指令就是将主机A
上端口1000
接收的数据通过远程端口转发至主机B
的6666
端口。
需要注意的是:默认配置情况下,sshd服务只允许本地开启的远程转发端口(1000
)绑定在环回地址(127.0.0.1
)上。可通过修改配置文件sshd_config
中的GatewayPorts
项开启指定地址。
动态转发
以上本地端口转发和远程端口转发,都是静态指定了端口映射的目标主机和目标端口。而ssh
也支持动态转发,其工作方式就是将本地端口绑定到ssh
服务器上,有服务器去转发,至于转发到哪,取决于原始消息。
主要注意: 动态转发采用了 SOCKS5 协议,其他请求协议需要转换为SOCKS5 协议。