问题表现
修改 /etc/ssh/sshd_config 中的 Port 例如 Port 3212。
重启 SSH 服务:sudo systemctl restart sshd。
使用 sudo ss -tnlp | grep sshd 发现 SSH 依然监听 22 端口。
服务器上存在 ssh.socket 单元,systemctl status ssh.socket 显示该服务处于活跃状态。
根本原因现代 systemd 系统采用了 socket 激活机制(socket activation) 来管理 SSH 服务。具体来说:
ssh.socket 单元会提前监听 TCP 端口(默认 22),而不是由 sshd 自己监听。
当有连接请求时,systemd 触发启动 sshd 进程来处理连接。
这样即使你修改了 sshd 的配置文件,ssh.socket 仍然在监听默认的 22 端口,导致端口修改无效。
ssh.socket 的优点
按需启动 sshd,节省系统资源。
快速响应连接请求。
方便 systemd 集中管理和日志审计。
提升服务稳定性和自动恢复能力。
解决方案方法一:禁用 ssh.socket,使用传统 sshd 监听端口123sudo systemctl disable ssh.socketsudo systemctl stop ssh.socketsudo systemctl restart ssh.service
方法二:修改 ssh.socket 配置监听新端口
编辑 ssh.socket 文件(路径一般为 /usr/lib/systemd/system/ssh.socket 或 /etc/systemd/system/ssh.socket)。
修改 [Socket] 部分的 ListenStream=22 为你想要的端口,比如 ListenStream=3212。
重新加载 systemd 配置:
123sudo systemctl daemon-reloadsudo systemctl restart ssh.socketsudo systemctl restart ssh.service
额外提示
使用 ssh.socket 是 systemd 的现代管理方式,适合资源有限或连接不频繁的服务器。
直接禁用 ssh.socket 更适合需要自定义 SSH 端口的场景,操作更简单。
修改端口后,别忘了开放防火墙相应端口。