CentOS 7 是一款广泛使用的 Linux 发行版,其稳定性和安全性使其成为许多服务器环境的首选,在使用过程中,用户可能会遇到各种问题,没有 sshd” 是一个比较常见的困扰,本文将详细探讨在 CentOS 7 系统中找不到 sshd 服务或无法通过 SSH 连接的可能原因,并提供系统性的排查步骤和解决方案。

理解 sshd 服务的重要性
我们需要明确 sshd 服务的作用,sshd 是 SSH(Secure Shell)协议的守护进程,它负责监听来自客户端的 SSH 连接请求,并建立安全的加密通信通道,对于服务器管理而言,SSH 是最常用、最便捷的远程访问方式,sshd 服务未运行、未安装或配置不当,管理员将无法通过 SSH 远程连接服务器,只能通过物理控制台或 IPMI/KVM 等方式进行管理,这在很多场景下是不方便甚至不可行的,快速定位并解决“没有 sshd”的问题至关重要。
排查步骤一:确认 sshd 服务是否已安装
当发现无法连接 SSH 时,第一步应该确认系统是否已经安装了 openssh-server 软件包,该软件包包含了 sshd 守护程序及其相关配置文件,可以通过以下命令进行检查:
rpm -qa | grep openssh-server
如果命令没有输出或显示相关的包名,则说明系统尚未安装 openssh-server,可以通过 yum(CentOS 7 的默认包管理器)进行安装,执行以下命令:
sudo yum install openssh-server -y
安装完成后,建议使用 systemctl start sshd 命令手动启动服务,并使用 systemctl enable sshd 命令设置服务为开机自启,以确保服务器重启后 SSH 服务依然可用。
排查步骤二:检查 sshd 服务的运行状态
如果确认已安装 openssh-server,但仍然无法连接,下一步需要检查 sshd 服务的当前运行状态,可以使用 systemctl 命令来实现:
systemctl status sshd
该命令会显示 sshd 服务的详细状态信息,包括是否正在运行(Active: active (running))、是否启用开机自启(Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled))等,如果服务状态为 inactive (dead) 或 failed,则说明服务未成功运行。
对于处于 dead 状态的服务,可以尝试使用 systemctl start sshd 命令启动,如果启动失败,命令输出通常会提示错误信息,例如端口被占用、配置文件错误等,对于处于 failed 状态的服务,可以查看 journal 日志以获取更详细的错误原因:

journalctl -u sshd.service
排查步骤三:检查 SSH 端口和网络防火墙设置
SSH 服务默认监听 22 端口,即使 sshd 服务正在运行,22 端口被防火墙阻止,外部客户端仍然无法连接,在 CentOS 7 中,默认使用 firewalld 作为防火墙管理工具,需要确保 22 端口已在 firewalld 的允许列表中。
检查 firewalld 的状态:
systemctl status firewalld
firewalld 正在运行,可以使用以下命令永久开放 22 端口:
sudo firewall-cmd --permanent --add-service=ssh sudo firewall-cmd --reload
--permanent 参数表示规则将永久生效,--reload 参数用于重新加载防火墙配置使其立即生效,如果服务器使用了其他防火墙工具(如 iptables),则需要相应地检查和修改 iptables 规则,确保 22 端口未被阻止,如果服务器部署在云环境中(如 AWS、阿里云等),还需要检查云平台的安全组设置,确认是否已放行 22 端口。
排查步骤四:审视 SSH 配置文件
sshd 服务的配置文件位于 /etc/ssh/sshd_config,错误的配置也可能导致 SSH 服务无法正常工作或连接被拒绝,在修改配置文件前,建议先备份一份原始文件:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
然后使用文本编辑器(如 vi 或 nano)打开配置文件,检查以下关键项:
Port:确认 SSH 监听的端口是否为 22 或您期望的端口,如果修改了端口,客户端连接时也需要指定相应端口。PermitRootLogin:此项控制是否允许 root 用户直接通过 SSH 登录,如果设置为no,则 root 用户需要先以普通用户身份登录,然后使用su或sudo提升权限。PasswordAuthentication:此项控制是否使用密码进行身份验证,如果设置为no,则必须使用密钥对进行认证,确保客户端的认证方式与服务器配置匹配。ListenAddress:指定 sshd 监听的网络地址,如果设置为0.0.1,则只允许本地连接;如果设置为0.0.0,则允许来自任何 IP 的连接。AllowUsers或DenyUsers:用于限制或允许特定用户组或用户通过 SSH 登录。
修改完配置文件后,需要重启 sshd 服务使配置生效:
sudo systemctl restart sshd
排查步骤五:检查系统日志和网络连接

如果以上步骤均未能解决问题,可以进一步检查系统日志和网络连接状态,使用 netstat 或 ss 命令可以查看 sshd 是否在监听正确的端口:
netstat -tuln | grep 22 # 或者 ss -tuln | grep 22
如果命令没有输出,说明 sshd 并未在监听 22 端口,这可能意味着服务未成功启动或配置文件中的端口设置有误,系统日志文件(如 /var/log/secure 和 /var/log/messages)记录了 SSH 服务的启动信息和认证尝试,通过查看这些日志,可以获取更多关于连接失败原因的线索,Failed password”或“Connection refused”等。
“CentOS 7 没有 sshd”的问题通常由服务未安装、服务未运行、防火墙阻拦、配置错误或系统日志异常等原因引起,解决此类问题需要遵循由简到繁的排查思路,从基础的服务安装状态检查,到网络和防火墙设置,再到核心的配置文件审查,最后结合系统日志进行深入分析,每一步操作都应谨慎进行,尤其是在修改配置文件时,避免因误操作导致系统无法远程访问,通过系统性的排查,绝大多数“没有 sshd”的问题都能够被有效定位和解决。
相关问答 FAQs
问:我已经确认 sshd 服务正在运行,并且防火墙也放行了 22 端口,但为什么还是无法通过 SSH 连接,提示 “Connection refused”?
答:这种情况可能的原因有几个,请再次使用 netstat -tuln | grep 22 或 ss -tuln | grep 22 命令确认 sshd 进程确实在监听 22 端口,如果进程不存在,则服务可能启动失败,请检查 journalctl -u sshd 日志,检查 /etc/ssh/sshd_config 文件中的 ListenAddress 配置项,如果它被设置为 0.0.1,sshd 只会监听本地回环地址,外部连接自然会被拒绝,将其修改为 0.0.0 或服务器的实际 IP 地址即可,检查 SELinux 是否处于 enforcing 模式,并且策略是否阻止了 SSH 连接,可以尝试临时 setenforce 0 来禁用 SELinux,如果此时可以连接,则需要调整 SELinux 策略。
问:如何禁止 root 用户通过 SSH 直接登录,以提高服务器的安全性?
答:禁止 root 用户直接 SSH 登录是一个常见的安全实践,您可以通过编辑 /etc/ssh/sshd_config 文件来实现,找到 PermitRootLogin 这一行,将其值修改为 no,如果该行被注释掉了(以 开头),请取消注释并将其设置为 no,保存文件后,重启 sshd 服务使配置生效:systemctl restart sshd,修改后,root 用户将无法直接使用密码或密钥通过 SSH 登录,必须先以一个普通用户身份登录,然后使用 su - 或 sudo -i 切换到 root 用户,这增加了攻击者获取 root 权限的难度。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复