CentOS8设置SSH服务开机自启的正确姿势:别让远程连接掉链子
CentOS8设置SSH服务开机自启的正确姿势

装完CentOS8,兴冲冲地敲完最后一行配置,重启机器却发现Putty死活连不上?十有八九是sshd没跟着系统一起醒。别急着拍桌子,把SSH服务设成开机自启其实就两条命令,但坑点藏在细节里,一步踩空,远程端口依旧自闭。
先确认openssh-server真在
很多最小化镜像默认只给客户端,没装服务端。先跑一句:
rpm -q openssh-server
如果返回“package openssh-server is not installed”,直接:
dnf install -y openssh-server

装完别急着走,继续看。
把服务拽进systemd
CentOS8用systemd管生老病死,老派chkconfig已经靠边。让sshd每次跟着系统起来,就一句:
systemctl enable sshd
屏幕会打印“Created symlink …”才算成功。没提示?多半是权限被限制,sudo别省。
立即启动并验活

enable只是写链接,当前会话里服务仍旧睡着。顺手:
systemctl start sshd
再查状态:
systemctl status sshd
看到“active (running)”且绿色高亮,心里就有底。如果红色,日志甩出来:
journalctl -xeu sshd
端口占用、密钥权限、配置语法都能在这排雷。
防火墙放过22端口
服务起来了,却被firewalld挡在外面,一样白搭。一次放行永久生效:
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload
自定义端口的朋友把“--add-service=ssh”换成“--add-port=6022/tcp”即可,记得SELinux也给新端口打标签:
semanage port -a -t sshportt -p tcp 6022
开机自启仍失效?排查三板斧
1. 检查/etc/systemd/system/sshd.service.wants/有无残留旧链接,有就rm掉再enable一次。
看/etc/fstab里有没有把/var或/tmp挂成noexec,这会导致sshd生成密钥失败,systemd判定启动不成功。
虚拟机模板如果装了cloud-init,它可能把ssh禁掉。/etc/cloud/cloud.cfg里把sshpwauth和disableroot设置成符合自己环境的值,或者干脆卸载cloud-init。
想更安全?改端口+密钥+Fail2ban
端口改掉后,/etc/ssh/sshd_config里Port字段去掉注释,改完systemctl restart sshd。root别放行,PasswordAuthentication设no,只留公钥。再装个fail2ban:
dnf install fail2ban -y
简单写个/etc/fail2ban/jail.local:
[sshd]enabled = true
maxretry = 3
bantime = 3600
最后systemctl enable --now fail2ban,暴力破解直接关小黑屋。
懒人一键脚本
把下面内容存成ssh-auto.sh,chmod +x后root执行,上面步骤一次到位:
#!/bin/bashdnf install -y openssh-server
systemctl enable --now sshd
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload
echo 'SSH已设为开机自启并立即启动,端口22,防火墙已放行。'
改端口自己加变量即可。
常见作死现场Top3
1. 没开防火墙却怪连不上。云主机还要检查安全组,本机防火墙与安全组双重放行才算数。
2. enable后忘了start,重启才生效的误解。enable≠立刻跑,想马上用必须start。
3. 手抖把Port 22改写成Port 6022,却忘了reload防火墙。SELinux也没放行,结果端口一通telnet就挂。
CentOS8让SSH自启就两步:装包、enable。听起来简单,可一旦漏掉防火墙、SELinux、cloud-init这些拦路虎,远程照样失联。按上面顺序排查,五分钟搞定,再也不用抱着显示器跑机房。
