出于个人习惯会定期对包进行更新,结果这次更新后发现SSH远程不上服务器了,因为我修改了默认端口,
使用远程连接时发现端口直接拒绝,但是服务器的其他端口却能正常访问,初步判断是SSH出了问题。
开始想得很简单,应该是更新包之后覆盖了sshd_confg配置,只要修改回配置即可。
通过终端登录服务器,发现配置确实变成了默认22端口,重新修改配置文件。
cat /etc/ssh/sshd_config
Port 1234 #SSH监听端口号
PasswordAuthentication no #禁用密码登录
PubkeyAuthentication yes # 启用密钥认证
保存好配置后,重启服务,结果报错:but its triggering units are still active: ssh.socket
这里出现一个新的东西 ssh.socket,此前只见过ssh.service
,起初打算不管它,先停止再重启服务
systemctl stop ssh.socket #停止这没见过的东西
systemctl stop ssh.service #停止ssh服务
systemctl start ssh.service #启动ssh服务
服务启动成功了,但是仍然监听默认22端口。后面经过一个小时重装openssh-server
测试,发现端口还是没有修改成功。
回头发现还是ssh.socket有关系。。。查了资料,关于ssh.socket说明是这样:
ssh.socket 是一个 systemd socket
单元文件,用于管理 OpenSSH 服务的按需启动功能。它的作用是通过监听网络端口(如 SSH 默认的 22 端口)来动态启动 ssh.service,而不是让 SSH 服务一直运行。
简单理解就是为了避免SSH服务一直运行占用资源,给他设置了一个前置的服务(systemd socket 单元文件),这个服务会先监听端口,如果端口收到请求,才会拉起ssh.service。
方式一:启用ssh.socket按需拉起ssh.service
好家伙,原来前面还有一个服务,它的端口配置也需要修改,如下:
root@ubuntu:~$ cat /usr/lib/systemd/system/ssh.socket
[Unit]
Description=OpenBSD Secure Shell server socket
Before=sockets.target ssh.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Socket]
ListenStream=1234 #监听端口号,默认为22,这里修改为SSH监听的端口号(需要与sshd_config端口号保持一致)
Accept=yes #允许按需要启动服务
FreeBind=yes #允许socket绑定到一个尚未配置的网络接口上时,而不会导致绑定失败。需要内核支持,这里先注释了。
[Install]
WantedBy=sockets.target
RequiredBy=ssh.service
root@ubuntu:~$ systemctl daemon-reload #因为修改的配置,需要刷新下
root@ubuntu:~$ systemctl restart ssh.socket #重启服务器
root@ubuntu:~$ systemctl enable ssh.socket #将服务设置为自启
不出意外的话,这个时候ssh就可以正常使用了。
方式二:禁用ssh.socket直接使用ssh.service
结果我这里一直报错:
systemd[1]: ssh.socket: Failed to set socket on service: Invalid argument
systemd[1]: ssh.socket: Failed with result 'resources'.
实在没找到原因(有解决的朋友欢迎解答下),干脆禁用ssh.socket使用传统模式吧
root@ubuntu:~$ systemctl stop ssh.socket #停止服务
root@ubuntu:~$ systemctl disabled ssh.socket #取消自服务启动,一定得先将ssh.socket禁用,不然启动ssh.service会拉起这个报端口冲突
root@ubuntu:~$ systemctl start ssh.service #启动ssh.service服务
root@ubuntu:~$ systemctl enable ssh.service #将服务设置为自启
至此SSH服务正常运行。两种方法都可以解决问题,时间充裕可以研究下方式一,如果不想折腾直接选方式二。
