Rocky 10:为什么 sshd -T 看不到你的 Match 设置
Rocky Linux 10.2 Server 组虚拟机,OpenSSH_9.9p1。
实验:读全局有效配置 → 加一个按来源地址限定的 Match 块 → 用 sshd -T -C 对两个地址分别取值 → 清理。截图:public/evidence/sshd/rocky-match.png。
两个命令,两种视野
Section titled “两个命令,两种视野”$ sshd -T -C user=labuser,host=localhost,addr=192.168.2.241 | grep -E '^(maxauthtries|x11forwarding|passwordauthentication)'maxauthtries 6passwordauthentication yesx11forwarding yes| 命令 | 看什么 | 什么时候用 |
|---|---|---|
sshd -t | 语法是否正确 | 改完配置先跑它 |
sshd -T | 全局上下文的有效值 | 查默认值 |
sshd -T -C user=…,host=…,addr=… | 该连接的有效值 | 验证 Match 是否命中 |
只跑 sshd -T 就断言「配置没生效」,是最常见的误判来源。
加一个按来源生效的块
Section titled “加一个按来源生效的块”Match Address 192.168.2.240 MaxAuthTries 2 X11Forwarding no$ sshd -t && echo "config OK"config OK同一进程,两个客户端两个答案
Section titled “同一进程,两个客户端两个答案”$ sshd -T -C user=labuser,host=localhost,addr=192.168.2.240 | grep -E '^(maxauthtries|x11forwarding)'maxauthtries 2x11forwarding no
$ sshd -T -C user=labuser,host=localhost,addr=192.168.2.241 | grep -E '^(maxauthtries|x11forwarding)'maxauthtries 6x11forwarding yes这就是 Match 的本质:一份配置按条件求值,而不是把规则叠加到所有连接上。

Match 之后的所有指令都属于该块,直到文件结束或下一个 Match:
Match Address 192.168.2.0/24 PasswordAuthentication noX11Forwarding no ← 这行也被吞进 Match,只对网段内生效sshd_config.d/*.conf 按文件名排序加载,所以「某设置只对部分客户端生效」通常就是这么来的:一条本该全局的指令落在了 Match 块里。
排查动作:
sudo sshd -T -C user=labuser,host=localhost,addr=<可疑地址> | diff - <(sudo sshd -T) | head别把 Match 当访问控制
Section titled “别把 Match 当访问控制”Match 只改变参数取值,不改变可达性:
- 想让某网段完全连不上,用 firewalld,而不是
Match+ 不存在的用户; - 想只允许特定用户,用
AllowUsers(它可以在 Match 块里细化); - 认证失败仍会走 PAM,
MaxAuthTries只是限制重试次数。
sshd -t通过就以为生效:它只查语法;- 改完不 reload:
systemctl reload sshd; - Match 后续写了全局项:被吞进块内;
- 用错地址段写法:
192.168.2.0/24与192.168.2.*都支持,但混用容易漏。
练习:把「只对某人生效」验证清楚
Section titled “练习:把「只对某人生效」验证清楚”sudo tee /etc/ssh/sshd_config.d/70-user.conf >/dev/null <<'EOF'Match User labuser MaxSessions 1EOFsudo sshd -tsudo sshd -T -C user=labuser,host=localhost,addr=192.168.2.10 | grep maxsessionssudo sshd -T -C user=root,host=localhost,addr=192.168.2.10 | grep maxsessionssudo rm /etc/ssh/sshd_config.d/70-user.conf检查:
labuser得到 1,root保持默认 10;- 未 reload 也能用
-T -C验证(读文件,不影响会话); - 删除后两者一致;
- 理解
user=维度与addr=维度可以组合。
常见问题
Match 支持哪些条件?
Address、User、Group、Host、LocalAddress、LocalPort、RDomain 等,可用逗号组合表示「或」,多个 Match 关键字之间是「且」。
sshd -T -C 会影响线上连接吗?
不会,它只解析配置并打印结果,不建立会话、不重新加载。
旧版本没有 -T -C 怎么办?
-T 自 OpenSSH 6.8 起提供,-C 自 7.x 起;EL8 及以上都有,EL7 需要升级。
- sudo 与提权:/sudoers-basics/
- 来源限制:/firewalld-zones/