banner需启用并指定存在、可读、非符号链接的纯文本路径,权限严格为644或600;versionaddendum仅隐藏版本后缀,nmap通过kex指纹识别版本,彻底隐藏需重编译但不推荐。

修改 /etc/ssh/sshd_config 中的 Banner 配置项
SSH 登录前显示的横幅(Banner)由服务端主动推送,控制开关和路径都在 sshd_config 里。默认该配置被注释,不生效;启用后必须指定一个纯文本文件路径,且 OpenSSH 不校验内容格式,只按字面发送。
- 确保
Banner行未被注释,例如写成:Banner /etc/issue.net - 文件路径必须存在、可读,且不能是符号链接(OpenSSH 8.2+ 默认拒绝符号链接)
- 文件内容不要包含 ANSI 转义序列或非 ASCII 字符,某些旧客户端可能截断或报错
- 修改后必须执行
sudo systemctl reload sshd(或sudo service ssh reload),restart不必要,且会中断已有连接
隐藏 OpenSSH 版本号:改 VersionAddendum 还是编译时打补丁?
VersionAddendum 是最直接、无需重编译的隐藏方式,它控制 SSH 握手阶段返回的版本字符串后缀。但注意:它不隐藏协议版本(如 SSH-2.0)和 OpenSSH 主版本(如 OpenSSH_9.2),只能删掉括号里的附加信息(比如 Ubuntu-1ubuntu8.6 或 moduli 提示)。
- 设为
none可清空后缀:VersionAddendum none - 设为自定义字符串(如
VersionAddendum Custom)仅替换括号内容,主版本仍可见 - 真正彻底隐藏版本号需重新编译 OpenSSH,修改源码中
version.h的SSH_VERSION宏——但这会导致部分依赖版本协商的功能异常(如某些密钥交换算法兼容性判断),生产环境不推荐
为什么改了 Banner 和 VersionAddendum,nmap 仍扫出版本?
nmap -sV 探测 SSH 版本不依赖 Banner 或握手字符串,而是通过比对服务响应的密钥交换(kex)初始包特征、支持的加密算法列表、甚至响应时序等指纹信息。OpenSSH 自身协议实现细节就是最强识别依据。
- 即使关闭
Banner、设VersionAddendum none,nmap依然大概率识别出 OpenSSH 大版本(如 8.x / 9.x) - 想降低识别准确率,可调整
KexAlgorithms、Ciphers、Macs等参数,剔除典型组合(比如禁用curve25519-sha256),但会牺牲安全性和兼容性 - 更现实的做法是接受“指纹可识别”这一事实,把重点放在加固认证方式(禁用密码、强制密钥)、限制访问源 IP、启用 fail2ban 上
常见错误:Banner 文件权限不对或路径拼错
OpenSSH 对 Banner 文件权限极其敏感,稍有不慎就静默失效——不会报错,也不会显示 Banner,但日志里也无提示。
- 文件所有者必须是
root,权限不能大于644(即-rw-r--r--),600或644均可,640会失败 - 路径中任意一级目录若权限过松(如
/etc/目录设为777),整个 Banner 就会被忽略 - 测试是否生效:用另一台机器执行
ssh -o ConnectTimeout=5 -o BatchMode=yes user@host,观察连接前是否输出 Banner 内容;别只看本地sshd -t,它不验证 Banner 文件可读性
Banner 和版本号处理不是“开关一开就完事”的配置项,每一步都卡在权限、路径、协议层响应逻辑这些容易被跳过的细节上。漏掉任一环,表面看着改了,实际什么都没藏住。










