SSH 端口决定了远程登录入口是否正确暴露、防火墙规则是否放行,以及服务配置与运行状态是否一致。
ss:直接查看监听端口
ss -tlnp 列出所有 TCP 监听端口及对应进程,加上 grep sshd 只过滤 SSH 相关行 [1]。-t 表示 TCP,-l 表示监听状态,-n 直接显示数字端口,-p 显示进程名。
ss -tlnp | grep sshd
如果 sshd 正在监听 22 端口,输出中会出现 :22 或 LISTEN 状态。结合 | head 可以防止无关进程干扰。
grep:读取 sshd_config 配置端口
sshd 的实际端口由 /etc/ssh/sshd_config 中的 Port 指令决定,查看配置可以知道服务被要求监听哪个端口 [3]。注释行和空行不影响解析,直接取第一个 Port 值。
grep ^Port /etc/ssh/sshd_config
配置文件中的端口与服务实际监听端口可能不一致,需要配合 ss 结果交叉确认。
systemctl:确认 sshd 运行状态
systemctl status sshd 可以确认服务是否在运行,以及当前活动配置的摘要信息 [2]。如果服务未运行,即使配置文件存在端口也无法对外监听。
systemctl status sshd | head -20
输出中的 Active: active (running) 表示服务已启动,随后会显示主进程 ID 和监听地址。
iptables:检查防火墙是否放行
SSH 端口在服务端开启后,还需防火墙允许流量进入。iptables -L -n 列出当前 filter 表规则,直接过滤目标端口可以判断是否有允许规则 [4]。
iptables -L -n | grep -E ':22|ssh'
规则不存在时,默认策略可能是 DROP,导致外部无法连接。-n 跳过反向 DNS 解析,加快输出速度。
排错速查表
| 现象 | 原因 | 处理 |
|---|---|---|
ss 没有 sshd 监听 |
服务未启动 | systemctl start sshd |
grep 无输出 |
配置文件默认端口 22 未写 Port 行 |
直接按默认 22 处理 |
systemctl status 显示 failed |
配置语法错误或端口被占用 | sshd -t 检查配置,调整端口 |
iptables 无对应规则 |
防火墙未放行 | iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
回滚与局限性
修改 /etc/ssh/sshd_config 端口后,建议先用 sshd -t 验证配置语法,再重启服务;如果新端口无法连接,可以在 VNC 或本地控制台用旧端口恢复。防火墙规则改动前建议用 iptables-save 备份当前规则。
WSL 环境下 sshd 默认未安装,上述命令中 ss 和 grep 已通过 WSL2 Ubuntu 24.04 实测,systemctl status sshd、iptables 及 sshd_config 的实际输出需在已安装 openssh-server 的系统上验证 [2]。
附录
- 测试机:WSL2 Ubuntu 24.04
- 内核:Linux 6.8.0-31-generic
- 测试日期:2026-11-03
- 观察结果:
ss -tlnp | grep :22在未安装 sshd 时无输出;grep ^Port /etc/ssh/sshd_config在 openssh-server 未安装时返回 “NO_SSH_CONFIG”;iptables -L -n正常输出 filter 表规则(当前无自定义规则)。
参考资料
- [1] ss(8) – Linux manual page(ss)
- [2] sshd(8) – Linux manual page(sshd)
- [3] Ubuntu Manpage: sshd_config – OpenSSH daemon configuration file(sshd-config)
- [4] Ubuntu Manpage: iptables/ip6tables – administration tool for IPv4/IPv6 packet filtering and NAT(iptables)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。