今天在修改新装的一台 ubuntu server 24 的SSH端口的时候,如图所示一直不生效,SSH 服务在修改 Port 616
后未生效,且日志明确显示仍在监听 22
端口(Server listening on :: port 22
),但配置文件中已正确设置了 Port 616
。以下是具体分析和解决方案:
问题原因
-
ssh.socket
的干扰- 日志中显示
TriggeredBy: ssh.socket
,说明 SSH 服务被 systemd 的 socket 机制控制。 - socket 激活模式会强制监听默认端口(22),导致
sshd_config
中的Port 616
被忽略。
- 日志中显示
-
配置未完全加载
- 虽然执行了
systemctl restart sshd
,但未禁用ssh.socket
,导致服务仍按旧配置运行。
- 虽然执行了
解决方案
1. 禁用 ssh.socket
(关键步骤)
sudo systemctl stop ssh.socket # 停止 socket 监听
sudo systemctl disable ssh.socket # 禁止开机自启
2. 强制重启 SSH 服务
sudo systemctl restart sshd # 重新加载配置
3. 验证端口是否生效
sudo ss -tulnp | grep sshd
- 正常输出应显示:
tcp LISTEN 0 128 *:616 *:* users:(("sshd",pid=2345,fd=3))
4. 检查服务状态
sudo systemctl status sshd
- 确认日志中无
port 22
字样,且显示Server listening on :: port 616
。
为什么需要重启?
ssh.socket
的顽固性:
systemd 的 socket 激活机制会持续监控默认端口(22),即使重启服务也可能被重新拉起。
必须彻底禁用ssh.socket
才能让Port 616
生效。
长期配置建议
-
显式关闭默认端口
在sshd_config
中注释Port 22
,避免冲突:#Port 22 # 注释掉默认端口 Port 616 # 取消注释并确保唯一
-
防火墙放行新端口
sudo ufw allow 616/tcp # Ubuntu sudo firewall-cmd --add-port=616/tcp --permanent && sudo firewall-cmd --reload # CentOS
-
重启系统(最终保障)
sudo reboot
- 确保所有配置在开机时正确加载。
总结
- 直接原因:
ssh.socket
强制占用 22 端口,覆盖了sshd_config
的配置。 - 修复方法:禁用
ssh.socket
+ 重启服务(或系统)。 - 验证命令:
ss -tulnp | grep sshd
和journalctl -u sshd
。
执行上述步骤后,Port 616
将确定生效。如果仍有问题,可能是 SELinux/AppArmor 限制,需进一步检查安全策略。
附说明
1. 禁用 ssh.socket
的直接影响
(1)服务启动方式变化
- 当前状态(图片中可见):
TriggeredBy: ssh.socket # 显示 SSH 服务由 socket 激活机制控制
- 此时 SSH 服务 不持续运行,仅在收到连接请求时通过
ssh.socket
唤醒。
- 此时 SSH 服务 不持续运行,仅在收到连接请求时通过
- 禁用后:
- SSH 服务将改为 常驻运行(传统模式),直接监听配置文件中指定的端口(如
616
)。
- SSH 服务将改为 常驻运行(传统模式),直接监听配置文件中指定的端口(如
(2)端口监听行为
- 当前问题:
即使sshd_config
设置了Port 616
,日志仍显示Server listening on :: port 22
,说明ssh.socket
强制覆盖了配置。 - 禁用后:
SSH 服务会严格遵循sshd_config
的端口设置(如616
),不再被22
端口绑定。
2. 潜在风险与注意事项
(1)连接延迟(理论风险)
- socket 模式优点:按需启动服务,节省资源。
- 禁用后:服务常驻运行,可能轻微增加内存占用(约 1-2MB,如图中
Memory: 1.4M
),但对现代服务器影响可忽略。
(2)依赖 socket 的特殊场景
- 若系统有其他服务依赖
ssh.socket
的按需启动特性(极少见),可能导致意外行为。 - 解决方案:
可改用ssh@.service
模板服务(需手动配置)。
3. 长期维护建议
- 保留 socket 的替代方案(如需):
在sshd_config
中同时保留22
和616
端口:
然后仅禁用Port 22 Port 616
ssh.socket
,这样可通过任意端口连接。