ssh的密钥认证以及通道保持
密钥验证登录
以下讨论皆以密钥在本地主机、公钥在远程主机而展开
为什么要设置密钥认证?因为“密码认证”容易遭到“暴力破解”。
密钥对
# Ununtu
# "ssh-keygen" 是用来生成密钥的命令
# -t 参数指定密钥类型(type)
ssh-keygen -t rsa
接下来会提示输入 “passphrase” 密码短语(默认为空)。
假如设置密码短语的话,之后通过ssh连接远程主机时,若已经设置验证方式为“密钥验证”,将会既要求输入密钥文件又要求输入密码短语。
若留空则只需要输入密钥文件就能链接远程主机。
密钥对默认生成在: “~/.ssh/” 路径下。
# Ubuntu
# 以追加写入将公钥写入 "authorized_keys"
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
我们可以使用 scp 将私钥传输到本地:
# 本地执行
# 将指定文件传输到本地指定位置
scp root@your.host.com:~/.ssh/id_rsa ./
其实现在可以将远程服务器的相关密钥对删掉
配置
对于ssh链接,影响被链接端主机的相关配置一般在: “/etc/ssh/sshd_config”
我们修改配置文件,选择禁用“PasswordAuthentication”,并启用“PubkeyAuthentication”:
# /etc/ssh/sshd_config
PasswordAuthentication no
PubkeyAuthentication yes
当然如果不嫌麻烦,又缺乏安全感的话,我们可以同时启用两种认证方式,要求在每次建立链接前,依次进行两种认证方式:
# /etc/ssh/sshd_config
PasswordAuthentication yes
PubkeyAuthentication yes
AuthenticationMethods publickey,password
最后:
# Ubuntu
# 重新加载配置文件
systemctl reload sshd
测试
# 本地执行
ssh root@your.host.com # root@your.host.com: Permission denied (publickey)
ssh -i ./id_rsa root@your.host.com # 链接成功!
通道保持
配置
# /etc/ssh/sshd_config
TCPKeepAlive yes
ClientAliveInterval 60
ClientAliveCountMax 30
# Ubuntu
# 重新加载配置文件
systemctl reload sshd
解释
1. TCPKeepAlive yes
- 含义:启用 TCP 层的心跳检测机制
- 详细说明:
- 通过操作系统底层发送 TCP keepalive 数据包 检测连接状态
- 当客户端异常掉线(断网/死机/断电)时:
- 服务器能快速检测到连接中断(约 15-45 分钟,具体取决于系统内核参数)
- 自动清理僵尸连接,释放服务器资源
- ⚠️ 注意:某些防火墙/NAT 设备可能过滤 keepalive 包导致误判
2. ClientAliveInterval 60
- 含义:设置 SSH 应用层心跳检测间隔
- 单位:秒
- 详细说明:
- 服务器每 60 秒 通过 SSH 加密通道向客户端发送一次心跳请求
- 如果客户端正常在线,会自动返回响应维持连接
- 主要目的:防止中间设备(防火墙/NAT)切断空闲连接
- 举例:移动网络运营商通常 30 分钟切断空闲连接,此设置可避免 SSH 会话被意外断开
3. ClientAliveCountMax 30
- 含义:设置连续心跳失败的容忍次数
- 详细说明:
- 当客户端连续 60 次 未响应心跳请求时,服务器才会断开连接
- 总超时时间计算:
ClientAliveInterval × (ClientAliveCountMax + 1)本例:60 × (60 + 1) = 3660 秒 = 61 分钟 - 此配置让 SSH 会话能在网络波动时保持连接,仅当真中断时才断开
三者协作机制示意图
客户端正常时: 服务器每 60 秒[ClientAliveInterval] → 客户端响应 → 维持连接 客户端断线时: 第 1 次请求 超时 → 计数+1(当前 1/60) 第 2 次请求 超时 → 计数+1(当前 2/60) ... 第 60 次请求 超时 → 计数达到[ClientAliveCountMax] → 服务器断开连接 (总耗时 61 分钟)
对比项说明
| 配置项 | 检测层级 | 主要目的 | 超时控制 |
|---|---|---|---|
TCPKeepAlive | TCP 传输层 | 检测物理连接中断 | 依赖系统内核参数 |
ClientAliveInterval | SSH 应用层 | 维持加密会话活跃 | 精确控制检测频率 |
ClientAliveCountMax | SSH 应用层 | 控制容忍网络波动的时长 | 最终超时=间隔×(n+1) |
作者
3049874370@qq.com
