SSH笔记

安装SSH

需要关注ufw防火墙、fail2ban

更新系统

1
sudo apt update -y && sudo apt upgrade -y

安装SSH服务

安装OpenSSH服务器,允许远程访问:

1
sudo apt install openssh-server

确认SSH服务运行

1
sudo systemctl status ssh
1
sudo systemctl status sshd

SSH密钥创建 ssh-keygen

如下密钥生成方案中;~/.ssh/:存储密钥的路径,可以设置不同的路径 id_rsa:是生成的密钥文件名,可以设置不同的密钥文件名

如果密钥不需要设置密码。那么一直回车就可以;如果需要设置密码 密钥设置密码

RSA 4096位密钥(推荐兼容性方案)

1
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -C "your_email@example.com"

Ed25519密钥(推荐安全方案)

1
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "your_email@example.com"

ECDSA 521位密钥(平衡方案)

1
ssh-keygen -t ecdsa -b 521 -f ~/.ssh/id_ecdsa -C "your_email@example.com"

带密码保护的密钥(示例)

1
ssh-keygen -t ed25519 -f ~/.ssh/secure_key -N "your_strong_password"
  • -t:指定密钥类型(rsa/ed25519/ecdsa)
  • -b:定义密钥长度(RSA/ECDSA需指定)
  • -f:自定义密钥文件路径
  • -C:添加注释(通常为邮箱)
  • -N:设置密钥密码(空表示无密码)

SSH 密钥验证登录等

SSH 基础短参数(直接跟在 ssh 后,无需 -o

参数 支持填写值 作用说明 rsync / 脚本场景备注
-i 本地私钥绝对路径,如 /root/.ssh/backup.key 指定本次连接使用的私钥文件 跨机器同步必备,免密登录核心
-p 数字端口(默认 22),如 2222、36000 指定远端 SSH 服务端口 服务器修改 ssh 端口后必须加
-l 用户名(root/admin/backup) 指定登录远端服务器的用户 简写等价 user@ip
-4 无值,仅开关 仅使用 IPv4 建立连接 服务器双栈、只想走 IPv4 时使用
-6 无值,仅开关 仅使用 IPv6 建立连接 纯 IPv6 机房专用
-T 无值,仅开关 不分配交互式 TTY 终端 rsync、定时任务推荐,避免多余输出
-N 无值,仅开关 仅建立隧道,不执行远端命令 端口转发场景,同步不用
-A 无值,仅开关 转发本地 ssh-agent 私钥(跳板免密) 跳板机多层同步时开启
-F ssh 配置文件路径 加载自定义 ssh config 配置 批量多主机统一配置时简化命令
-q 无值,仅开关 静默 ssh 连接,关闭 ssh 自身输出 定时 cron 减少日志垃圾
-v 无值,可叠加 -vv/-vvv 输出 SSH 完整握手、密钥、认证调试日志
-v:简易日志
-vv:中等详情
-vvv:底层全量报文(排错最强)
密钥报错、端口不通、算法不匹配必加;定时脚本不建议长期开启,日志量大
-T 无值,仅开关 不分配交互式 TTY 终端 rsync 固定使用;手动登录加此参数无法输入命令
-F ssh 配置文件路径 加载自定义 ssh config 批量多主机简化命令

-o 配置项参数(-o 配置名=值,rsync 脚本高频)

参数名称 可选合法取值 作用说明 生产 / 定时场景使用建议
StrictHostKeyChecking ask(默认)no``accept-new``yes 控制远端主机公钥校验策略1. ask:弹窗询问(脚本阻塞)2. no:自动写入 known_hosts,主机密钥变更不拦截(低安全)3. accept-new:首次自动保存,密钥变更直接拒绝(平衡安全 & 自动化)4. yes:未知主机直接拒绝,必须手动录入 cron 定时、rsync 脚本优先 accept-new;临时测试可用 no;公网高危环境用 yes
UserKnownHostsFile 文件绝对路径 / /dev/null 指定主机公钥存储文件;设为 /dev/null 不保存不校验 一次性临时同步、多任务隔离场景使用
ExitOnForwardFailure yes / no 端口转发失败直接断开 ssh 连接 同步带隧道转发时设 yes,快速报错
ConnectTimeout 数字(单位秒) ssh 连接超时时间,超时直接失败 跨机房网络不稳定推荐设 10/15 秒,防止卡死
ServerAliveInterval 数字(单位秒) 客户端定时发保活包,防止连接被防火墙断开 长同步大文件设 30/60 秒
ServerAliveCountMax 数字 保活包无响应最大重试次数,超限断开 搭配 ServerAliveInterval,推荐 2-3
PreferredAuthentications publickey,password / publickey 限定 ssh 认证方式优先级 仅密钥免密同步:publickey,屏蔽密码弹窗
PasswordAuthentication yes / no 是否允许密码登录 脚本统一设 no,杜绝密码交互阻塞
GSSAPIAuthentication yes / no 域控 GSSAPI 认证开关 普通服务器固定 no,加速 ssh 握手
CheckHostIP yes / no 反向解析 IP 校验主机指纹 脚本设 no,减少 DNS 卡顿导致连接慢
Compression yes / no ssh 传输层开启压缩 跨机房带宽不足开启,本地内网关闭
ControlMaster yes / no 长连接复用主控通道 批量多文件同步加速,复用 ssh 连接
ControlPath 套接字文件路径 长连接复用 socket 存储路径 搭配 ControlMaster 实现多任务共享连接
ControlPersist 数字 (秒) /yes/no 主控连接后台保活时长 批量同步设 300,空闲 5 分钟自动关闭

登录服务器

1
ssh -i ~/.ssh/rsync_key -p 2222 test@10.0.0.2

测试登录服务器

1
ssh -i ~/.ssh/rsync_key -p 2222 -T test@10.0.0.2

sshd_config服务器参数含义

sshd_config 守护进程手册

核心安全参数完整对照表

参数 可选值 含义 运维 / 安全备注
ChallengeResponseAuthentication yes / no 挑战应答认证(密码登录底层依赖项);关闭后无法密码登录,也会阻断 SSH Agent 免密跳转 安全建议:no;开启会允许密码交互式验证,爆破风险高;关闭后仅密钥登录可用
AllowAgentForwarding yes / no 是否允许 SSH Agent 转发(跳板机免密跳转核心开关) 内网信任跳板机:yes;公网暴露服务器:no,防止劫持私钥
AllowTcpForwarding yes / no 是否允许 TCP 端口转发(本地端口映射、隧道代理) 不需要隧道功能:no;关闭可防止内网端口被外部代理访问
PermitRootLogin yes / no / prohibit-password / without-password 是否允许 root 账号登录1. yes:允许密码 / 密钥登录 root2. no:彻底禁止 root 登录3. prohibit-password:仅密钥登录 root,禁止密码 生产安全推荐:prohibit-password 或 no;禁止 root 直接公网登录
PasswordAuthentication yes / no 是否支持账号密码登录 SSH 安全最优:no;关闭后只能密钥登录,杜绝暴力破解
PubkeyAuthentication yes / no 是否允许 SSH 公私钥密钥登录 必须 yes;关闭后无法密钥登录,只能依赖密码
AllowUsers 用户名列表(空格分隔) 白名单:仅列表内用户可 SSH 登录,不在列表直接拒绝 示例:AllowUsers root admin ubuntu;不填该参数 = 允许所有用户;公网服务器强烈配置
AllowGroups 用户组名列表 白名单:仅指定用户组内成员可登录 配合 AllowUsers 使用,批量管控登录权限
DenyUsers 用户名列表 黑名单:列表内用户禁止 SSH 登录 优先级高于 AllowUsers,拦截高危账号
DenyGroups 用户组名列表 黑名单:指定用户组全部禁止登录 常用于禁用 nobody、guest 等低权限组
PermitEmptyPasswords yes / no 是否允许空密码账号登录 SSH 强制 no;空密码存在极高入侵风险
MaxAuthTries 数字(如 3、5) 单 IP 单次 SSH 连接最大认证失败次数,超限断开连接 推荐 3~5;减少暴力破解尝试机会
MaxSessions 数字 单个 SSH 连接最多开启多少个会话窗口 推荐 10;防止单连接占用大量资源
LoginGraceTime 时长(0/60/120,单位秒) 连接成功后,多久内必须完成登录认证,超时断开 推荐 60;0 = 不限制,容易被挂连接消耗资源
X11Forwarding yes / no 是否允许 X11 图形界面转发 无图形运维需求:no;关闭减少攻击面
PermitTunnel yes / no / point-to-point 是否允许 SSH 虚拟网卡隧道 绝大多数服务器不需要,统一设 no
GatewayPorts yes / no 端口转发是否监听 0.0.0.0(允许外部访问转发端口) 高危参数,推荐 no;开启后隧道端口对公网开放
ListenAddress IP 地址 / 0.0.0.0 / :: SSH 服务监听的本机 IP,限制仅指定网卡提供 SSH 示例:ListenAddress 192.168.1.10;仅内网 IP 开放 ssh
Port 数字(默认 22) SSH 服务监听端口 公网机器建议修改非 22 端口,减少扫描爆破
LogLevel QUIET / FATAL / ERROR / INFO / VERBOSE SSH 登录日志详细程度 安全审计推荐 VERBOSE,记录完整登录、认证失败信息
UseDNS yes / no 登录时反向解析客户端 IP 为域名 推荐 no;DNS 解析卡顿会导致 SSH 连接缓慢
IgnoreRhosts yes / no 是否忽略.rhosts 信任登录文件 必须 yes;rhosts 机制极不安全,易被劫持
HostbasedAuthentication yes / no 基于主机信任免密登录 必须 no;内网环境也存在横向渗透风险
ClientAliveInterval 秒数 服务端定时向客户端发送保活包,超时无响应断开 推荐 300;防止闲置连接占用会话
ClientAliveCountMax 数字 保活包无响应最大重试次数 搭配 ClientAliveInterval,超时自动踢掉线连接
Banner 文件路径 SSH 连接后、登录前展示提示公告 示例:Banner /etc/ssh/banner.txt,用于安全告警
StrictModes yes / no 校验用户家目录、.ssh 文件夹、密钥文件权限 必须 yes;权限过宽会直接拒绝密钥登录,防止私钥篡改
AuthorizedKeysFile .ssh/authorized_keys 指定用户公钥存储路径 默认即可,一般无需修改
Compression yes / no / delayed 是否开启传输压缩 带宽不足 yes;高负载服务器 delayed(登录后再压缩)
IgnoreUserKnownHosts yes / no 是否忽略用户 known_hosts 主机信任记录 推荐 no,用于校验目标主机防中间人劫持
KerberosAuthentication yes / no Kerberos 单点登录认证开关 无 Kerberos 环境统一 no
GSSAPIAuthentication yes / no GSSAPI 企业域认证开关 普通服务器 no,仅域控环境开启
PermitTTY yes / no 是否允许分配终端 TTY(交互式 shell)
- yes:正常 ssh 登录能输入命令
- no:仅允许无终端执行单条命令,无法交互式登录
适用于 API / 中转专用账号,禁止交互式操作;设为 no 后用户 ssh 登录会直接断开,只能ssh user@ip command执行单次指令
X11Forwarding yes / no 是否开启 X11 图形界面转发 服务器无图形需求一律设 no,缩小攻击面
Match LocalPort 端口数字 条件匹配块开头,匹配指定 SSH 监听端口,下方配置仅对该端口生效 Match 是条件分组语法,可按端口、用户、地址差异化限制 SSH 权限,示例见下方

服务器sshd_config配置

指纹信息

获取服务器指纹

1
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub

删除本地存储的指纹信息

切换需要删除指纹信息的用户

1
2
# 切换到执行rsync的用户 syncdata
su - 用户
1
2
# 删除目标IP旧指纹
ssh-keygen -R 目标IP地址

本地重新获取指纹

1
2
弹窗出现新指纹,和第二步服务器本地获取的指纹一字不差再输入 yes。
核对无误写入 known_hosts。ssh -i /home/用户/.ssh/密钥 -p 22222 服务器用户名@目标IP

弹窗出现新指纹,和第二步服务器本地获取的指纹一字不差再输入 yes。指纹对比可以去服务器做如下操作比较,有输出就是比较正确

1
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub | grep 指纹信息

核对无误写入 known_hosts。

SSH目录下文件含义

该文件是在用户目录下,XXXXXX是用户名

1
C:\Users\XXXXXX\.ssh

config

  1. 当有多个设备配置了不同公钥与私钥后,就需要通过配置文件配置,才能去区分。
  2. 配置文件的格式可以在边上搜索框中搜索 同一台电脑上多个github或gitee账户 查看编写格式

id_rsa

  1. 这是生成的本地私钥文件

id_rsa.pud

  1. 这是公钥文件,给服务器使用的

authorized_keys

  1. 该文件是服务器将客户端的公钥信息,保存在这个文件中(用于客户端免密登录时候使用)

known_hosts

  1. 当客户端接收到服务器的公钥之后,服务器信息就记录在了该文件中,代表着客户端相信该服务器公钥信息了,便于下次连接,不再需要一个确认过程。存储着指纹信息

known_hosts.old