核心是分清“谁在什么时候显示什么”:SSH连接分三阶段——连接建立时(协议头)、登录前(终端横幅)、登录后(欢迎消息);需分别配置DebianBanner no、清空/etc/issue与/issue.net、设置PrintLastLog no并精简motd,方可彻底隐藏发行版和内核信息。

新手配置SSH欢迎信息隐藏Linux发行版和内核信息,核心是分清“谁在什么时候显示什么”——SSH连接过程有三个关键阶段:连接建立时(协议头)、登录前(终端横幅)、登录后(欢迎消息)。每阶段对应不同文件和配置项,改错地方就白忙活。
关闭SSH协议层的版本自报(最关键)
这是攻击者最先看到的信息,比如 SSH-2.0-OpenSSH_9.2p1 Debian-2+deb12u2。它不来自任何文本文件,而是sshd程序内置行为:
- 编辑
/etc/ssh/sshd_config - 确保这两行存在且未被注释:
DebianBanner noBanner /etc/issue.net -
DebianBanner no禁用OpenSSH自动拼接的带发行版的版本字符串 -
Banner指向一个你可控的纯提示文件(内容只能是文字,不能含转义符),例如写入Authorized access only - 执行
sudo systemctl restart sshd生效 - 验证:用
nc -v your-server-ip 22或ssh -o LogLevel=DEBUG1 user@host查看初始响应,确认不再出现版本号和系统名
清空登录前终端横幅(/etc/issue 和 /etc/issue.net)
这两个文件控制本地TTY、getty、telnet及部分SSH场景下输入用户名前显示的内容,常含 Kernel \r on an \m 这类泄露内核和架构的转义序列:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 运行命令一次性清空并设只读:
sudo truncate -s 0 /etc/issue /etc/issue.net && sudo chmod 444 /etc/issue /etc/issue.net - 注意:修改后需重启 getty 服务(如
sudo systemctl restart getty@tty1)或重新连接SSH才能生效 - 不要删文件,清空+只读更稳妥,避免服务因文件缺失报错
屏蔽登录后的欢迎消息与最后登录记录
登录成功后看到的系统信息(如Ubuntu的“421 packages can be updated”)和“Last login”行,属于 motd 和 SSH 会话控制范畴:
- 停掉“Last login”提示:在
/etc/ssh/sshd_config中设置PrintLastLog no,然后重启 sshd - 精简或清空 motd 内容:motd 由多个脚本动态生成(尤其在Ubuntu/Debian),直接改
/etc/motd效果有限;更可靠的是禁用更新脚本,例如:
Ubuntu:运行sudo systemctl disable motd-news.timer
再清空主文件:sudo truncate -s 0 /etc/motd - 对单个用户快速静音:在用户家目录创建空文件
touch ~/.hushlogin(仅对该用户生效)
额外提醒:别漏掉其他服务的Banner
FTP、HTTP、数据库等服务也可能暴露系统指纹:
- Apache:设
ServerTokens Prod和ServerSignature Off(/etc/apache2/apache2.conf) - Nginx:在
http{}块中加server_tokens off; - vsftpd:在
/etc/vsftpd.conf中设ftpd_banner=Welcome - PHP:在
php.ini中设expose_php = Off

















