OpenSSH服务
说明:ssh 客户端(后面简称 ssh)、ssh 服务端(后面简称 sshd)
SSH 认证过程

Client 10.0.0.8 ssh 远程连接 Server 10.0.0.7:
1 | [root@centos8 ~]$ssh 10.0.0.7 |
no.6、no.8:协商版本号,可以看到 Client 的 OpenSSH 版本更高,则以 Server 为准
no.10、no.11:相互交换各自支持的算法,协商各种算法,以 Client 优先
no.12 - 14:使用 DH 算法交换密钥,之后的通信都使用会话密钥加密,具体参考笔记[13.2 DH.md](./13.2 DH.md),
认证:SSH 支持多种认证,最常用的是口令认证和密钥认证,这个过程已经加密了,用 Wireshark 抓包看不出任何信息
相关文件
一台主机,既可以是 ssh Client,也可以是 ssh Server
ssh Client 相关文件
文件 | 说明 |
---|---|
/etc/ssh/ssh_config | 客户端全局配置文件 |
~/.ssh/config | 客户端的用户配置文件,默认不存在,权限只能是 644 |
~/.ssh/known_hosts | 保存服务端的公钥 |
~/.ssh/id_rsa | 客户端私钥,由 ssh-keygen 生成,权限只能是 600 |
~/.ssh/id_rsa.pub | 客户端公钥,由 ssh-keygen 生成 |
/etc/ssh/ssh_config:
需要说明的是,客户端配置文件有很多配置项和服务端配置项名称相同,但它们一个是在连接时采取的配置(客户端配置文件),一个是 sshd 启动时开关性的设置(服务端配置文件)。例如,两配置文件都有 GSSAPIAuthentication 项,在客户端将其设置为 no,表示连接时将直接跳过该身份验证机制,而在服务端设置为 no 则表示 sshd 启动时不开启 GSSAPI 身份验证的机制。即使客户端使用了 GSSAPI 认证机制,只要服务端没有开启,就绝对不可能认证通过。
选项 | 默认值 | 说明 |
---|---|---|
PasswordAuthentication | yes | 是否启用基于密码的身份认证机制 |
HostbasedAuthentication | no | 是否启用基于主机的身份认证机制 |
GSSAPIAuthentication | no | 是否启用基于 GSSAPI 的身份认证机制 |
BatchMode | no | yes:将禁止 passphrase/password 询问 |
StrictHostKeyChecking | ask | yes:拒绝连接那些未知的主机,它将强制用户手动添加 host key 到~/.ssh/known_hosts 中; ask:询问是否保存到~/.ssh/known_hosts 文件; no:自动添加到~/.ssh/known_hosts 文件 |
Port | 22 | 当命令行中不指定端口时,默认连接的远程主机上的端口 |
ssh Server 相关文件
文件 | 说明 |
---|---|
/etc/ssh/sshd_config | 服务端全局配置文件 |
/etc/ssh/sshhost* | sshd 启动时生成的服务端公钥和私钥文件,其中私钥文件权限只能是 600 |
~/.ssh/authorized_keys | 保存客户端的公钥,用于 key 验证,免密登录 |
/etc/ssh/sshd_config:
1 | #Port 22 # 服务端SSH端口,可以指定多条表示监听在多个端口上 |
一般来说,如非有特殊需求,只需修改下监听端口和 UseDNS 为 no 以加快主机验证阶段的速度即可。
ssh 客户端工具
ssh
1 | ssh [options] [user@]remote_host [command] |
ssh-keygen
在客户端生成密钥对,默认存放在~/.ssh 目录下
1 | ssh-keygen -t rsa # 提示保存位置,输入密码 |
ssh-copy-id
使用 SSH 协议,将公钥追加到服务器的 ~/.ssh/authorized_keys 文件中
1 | ssh-copy-id -i ~/.ssh/id_rsa.pub remote_host |
scp
scp 命令用于 Linux 之间复制文件和目录,基于 SSH 协议。
1 | scp [options] SRC... DEST/ |
范例:
1 | # 从本地复制到远程: |
rsync
rsync 工具基于 SSH 和 RSYNC 协议实现高效率的远程系统之间复制文件,比 scp 更快,基于增量数据同步,此工具来自于 rsync 包
注意:通信双方都需要安装 rsync 软件
1 | rsync -av /etc server1:/tmp #复制目录和目录下文件 |
范例:
1 | [root@centos8 ~]#rsync -auv --delete /data/test 10.0.0.7:/data |
sftp
交互式文件传输工具,利用 ssh 服务实现安全的文件上传和下载,使用 ls cd mkdir rmdir pwd get put 等指令,详细说明可以使用 help 查看
范例:
1 | [lujinkai@ubuntu1804 data]$sftp root@10.0.0.7 |
高级应用
SSH 端口转发能够提供两大功能:
- 加密 SSH Client 端至 SSH Server 端之间的通讯数据
- 突破防火墙的限制完成一些之前无法建立的 TCP 连接
SSH 本地端口转发
三台主机:
host1:家用电脑,公网中
host2:业务服务器,内网中
host3:中转服务器,内网中
host1 不能直接连接 host2,但是可以通过 host3 中转,在 host1 上执行下面命令:
1 | ssh -fNL 1234:host2_ip:80 [host3_user@]host3_ip |
1 | # host1:CentOS6 10.0.0.6 |
绑定本地端口,指定数据传送的目标主机,们把这种情况称为”本地端口转发”(Local forwarding)。
因为 host1 和 host3 通信使用 SSH 加密,仿佛形成一个数据传输的秘密隧道,因此又被称为”SSH 隧道”。
SSH 远程端口转发
三台主机:
host1:家用电脑,公网中
host2:业务服务器,内网中
host3:中转服务器,内网中
host1 不能直接连接 host2,也不能直接连接 host3,但是 host3 既可以连接 host1,又可以连接 host2,所有使用 host3 做中转。
远程端口转发 和 本地端口转发 逻辑上刚好相反:
- 本地端口转发是 host1 主动监听本机的 1234 端口(因为主动,所以是 ssh 监听 1234),要求 host3 帮忙转发;
- 远程端口转发是 host3 通知 host1,让其监听自身的 1234 端口(因为被动,所以是 sshd 监听 1234),host3 主动拿帮 host1 转发。
1 | ssh -fNR 1234:host2_ip:80 [host1_user@]host1_ip |
1 | # host1:CentOS6 10.0.0.6 |
SSH 动态端口转发
1 | ssh -D 1080 root@10.0.0.8 |
SSH 创建 SOCKS 代理服务,去监听本地的 1080 端口。一旦有数据传向那个端口,就自动把它转移到 SSH 连接上面,发往远程主机 10.0.0.8。可以想象,如果 1080 端口原来是一个不加密端口,现在将变成一个加密端口。
目前 SOCKS4 和 SOCKS5 协议支持端口转发:
1 | # CentOS6 配置 SOCKS代理 |