SSH配置检查、生效值与安全重载

配置文件中“写了某一行”不等于该行对当前登录生效。Include片段、Match条件和服务启动参数都会影响最终行为。本篇教你检查与应用已经明确的配置变更,不提供一键关闭认证或更改端口的模板。保留当前会话,并先确认可用恢复入口。

确认配置入口和服务方式

systemctl status ssh.service --no-pager
systemctl status ssh.socket --no-pager
sudo grep -nE '^[[:space:]]*(Include|Match|Port|ListenAddress|PasswordAuthentication|PubkeyAuthentication|PermitRootLogin)' /etc/ssh/sshd_config

Debian/Ubuntu常见名称为ssh.service;其他系统可能为sshd.service。ssh.socket不存在并不一定是故障。实际配置可能包含 /etc/ssh/sshd_config.d/*.conf,应检查被Include的相关片段,且区分全局配置与Match条件块。不要通过批量替换所有同名行来修改策略。

先保存副本,再检查语法

将本次会编辑的主配置与片段分别保存为带时间的私有副本,记录原路径、权限和归属;不要为了备份配置顺手把整套服务器私钥导出到公开目录。修改完成后先运行:

sudo /usr/sbin/sshd -t

正常通过通常不输出内容;出现文件名、行号、未知选项或密钥错误时,先按提示修正并重新检查,未通过不重载。这个命令只检查配置与关键一致性,不能保证你的来源IP、用户和认证方式仍符合新策略。

检查特定连接的有效值

sudo /usr/sbin/sshd -T -C 'user=baoleadmin,addr=198.51.100.25,host=client.example,laddr=203.0.113.10,lport=22' | grep -E '^(port|passwordauthentication|pubkeyauthentication|permitrootlogin|allowusers|allowgroups)[[:space:]]'

示例中的用户、客户端公网地址、客户端主机名、服务器地址和端口应全部按实际连接替换。-T输出有效配置,-C让相关Match条件按这个连接场景计算;不能用一个场景的结果证明所有用户都一致。程序实际监听还可能由socket单元决定,最终还要核对 sudo ss -lntp。

重载后验证新的独立连接

sudo systemctl reload ssh.service
systemctl status ssh.service --no-pager
sudo journalctl -u ssh.service --since "5 minutes ago" --no-pager

仅在服务支持重载、语法检查通过且本次变更适合重载时执行。涉及Ubuntu特定版本的socket激活、Port或ListenAddress时,按对应版本说明处理,不直接套用这一行。保留原会话,从第二个本地终端用预期账号、认证方式和实际端口重新登录,成功后再结束旧会话。

新连接失败时

利用仍保留的会话或可信恢复入口,按本次记录恢复出问题的配置片段,再次执行语法检查和相应重载,重新验证连接。不要同时删除密钥、关闭密码、改端口及改防火墙;一次改多层会使失败原因和恢复路径难以判断。