查看虚拟机SSH服务器配置,最直接的方法是进入虚拟机终端执行grep -E "^(Port|PermitRootLogin|PasswordAuthentication)" /etc/ssh/sshd_config命令,结合systemctl status sshd确认服务状态,这套组合拳能解决九成以上的排查需求。
为什么你查不到SSH配置?先分清服务端与客户端
很多新手在虚拟机上敲ssh -v localhost看到一堆日志就以为这是配置,其实完全跑偏了,SSH分服务端(sshd)和客户端(ssh)两套体系,我们讨论的“服务器配置”专指服务端sshd_config文件,虚拟机的特殊性在于,你既要看系统内的配置,还要检查虚拟化平台的网络映射是否把端口转发对了,比如VMware的NAT模式往往需要手动设置端口转发规则。
登录虚拟机前的准备工作:三种连接方式的底层逻辑
行业共识认为,排查SSH配置前必须确认自己处于哪种访问路径中,最简单的路径是直接在虚拟机控制台操作,这相当于坐在物理机前;第二种是宿主机通过SSH客户端连接,此时涉及虚拟网络适配器配置;第三种是外部设备跨网络访问,这种情况必须先检查虚拟机的IP地址是否可达。
先用ip addr或ifconfig确认虚拟机的IP段,若你用的是NAT模式,虚拟机的IP通常是192.168.x.x,宿主机能ping通但外部设备不行,这是正常现象,若用桥接模式,虚拟机和宿主机在同一网段,外部设备可直接访问,这里最容易踩坑的是VirtualBox的“仅主机模式”,它默认不提供NAT转换,虚拟机无法访问外网,更别提被外部SSH连接。
Linux系虚拟机SSH配置查看实操指南
确认SSH服务是否安装
多数情况下,最小化安装的Linux不会预装SSH服务端,执行dpkg -l | grep openssh-server(Debian/Ubuntu)或rpm -qa | grep openssh-server(CentOS/RHEL)检查,若输出为空,需要先安装:
- Debian系:
sudo apt update && sudo apt install openssh-server -y - RedHat系:
sudo yum install openssh-server -y
安装完成后用sudo systemctl enable --now sshd设置开机自启并立即启动。
查看核心配置文件sshd_config
配置文件路径通常为/etc/ssh/sshd_config,这是SSH服务的“大脑”,用sudo cat /etc/ssh/sshd_config直接看全文,但更推荐用grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"过滤注释和空行,只留有效配置,重点关注以下参数:
- Port:默认22,若改成其他端口,客户端连接时必须加
-p参数 - PermitRootLogin:
yes允许root直接登录,no禁止,prohibit-password仅允许密钥登录 - PasswordAuthentication:
yes开放密码认证,no则强制使用密钥对
以Ubuntu 22.04为例,默认配置中PasswordAuthentication yes是注释掉的,实际生效值取决于SSH版本的内置默认,Ubuntu 22.04默认允许密码登录,但Ubuntu 24.04开始,OpenSSH的默认配置已转向优先密钥认证,这类发行版差异是排查时的隐藏陷阱。
用sshd -T查看实际生效配置
很多人不知道sshd -T这个命令,它能输出当前实际生效的完整配置,不受注释和Include片段的影响,执行sudo sshd -T | grep -E "port|permitrootlogin|passwordauthentication",得到的结果才是SSH服务真正运行时采用的参数,这个命令在调试时价值极高,特别是遇到配置文件中用Include /etc/ssh/sshd_config.d/.conf引入额外配置的情况。
检查服务运行状态和日志
sudo systemctl status sshd能查看服务是否active(running),若服务未运行,用sudo journalctl -u sshd -n 50查看最近的错误日志,常见的报错如Bad protocol 2 host key algorithms或Permission denied,多半与密钥权限或SELinux策略有关,CentOS系统还需额外检查getenforce,若返回Enforcing,尝试sudo setsebool -P ssh_sysadm_login on放行root登录。
Windows虚拟机SSH配置查看方法
Windows 10/11和Windows Server 2019+自带OpenSSH Server,但默认未启用,查看方式分两步:
第一步,在PowerShell(管理员)中执行Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Server',查看返回的State是否为Installed,若为NotPresent,执行Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0安装。
第二步,启动服务并查看配置:
Start-Service sshdSet-Service -Name sshd -StartupType 'Automatic'- 配置文件位于
C:\ProgramData\ssh\sshd_config,用记事本打开即可
Windows版sshd_config的语法与Linux基本一致,但有几个Windows专属参数,比如Match Group administrators用于限制管理员登录权限,常见坑点是Windows防火墙默认放行22端口,但部分安全软件会拦截,排查时记得检查wf.msc里的入站规则。
排查虚拟机SSH连接不上,应从哪几个维度入手
这可能是运维日常最高频的问题,假设你已确认sshd_config配置无误,服务也在运行,但就是连不上,按以下顺序排查:
- 第一步:确认路径,在虚拟机内执行
ss -tlnp | grep sshd,看监听地址是0.0.0.0还是127.0.0.1,后者说明sshd只绑定了回环地址,外部永远无法访问 - 第二步:检查网络模式,VMware的NAT模式需在“虚拟网络编辑器”中确认端口转发规则,VirtualBox则在“网络-高级-端口转发”中设置,宿主机防火墙也要放行对应端口
- 第三步:测试宿主机到虚拟机的连通性,先
ping虚拟机的IP,通的话再telnet 虚拟机IP 22,看端口是否开放 - 第四步:检查密钥权限,若使用密钥登录,
.ssh目录权限应为700,authorized_keys应为600,权限过宽(如777)会导致SSH直接拒绝认证
以VMware Workstation为例,最常见的问题是虚拟机网络适配器误设为“仅主机模式”,此时虚拟机无法访问外网,且宿主机可以ping通但SSH握手超时,解决方案是改为NAT模式,并确保“NAT设置”中的网关IP与虚拟机路由一致。
修改SSH配置后的正确重启姿势
改完sshd_config,千万别直接重启虚拟机,效率太低,用sudo systemctl reload sshd即可平滑重载配置,不影响现有连接,若语法有误,reload会失败并输出错误行号,稳妥起见,先用sudo sshd -t做语法检查,返回OK再执行reload。
对于修改端口这类敏感操作,建议先保留原会话,另开一个终端测试新端口,例如你打算把22改成2222,先执行sudo semanage port -a -t ssh_port_t -p tcp 2222(CentOS需要),再修改配置文件里的Port和ListenAddress,最后reload sshd并测试ssh -p 2222 用户@虚拟机IP,若测试失败,原会话还能帮你回滚配置。
Q&A:虚拟机SSH配置常见疑问
虚拟机里的ssh配置和物理机有什么区别?
逻辑上完全一致,都是读取/etc/ssh/sshd_config,区别在于虚拟机的网络层多了一道虚拟化转换,NAT模式下端口映射可能造成额外延迟,部分虚拟化平台(如Proxmox VE)支持在宿主机层面配置SSH隧道,但这与虚拟机内部的SSH服务无关。
云服务器配置ssh密钥登录后,密码登录会被自动禁用吗?
不会自动禁用,你需要手动在sshd_config中设置PasswordAuthentication no并重载服务,但多数云平台的安全组规则会默认禁止密码登录,因此即便配置文件中仍开放密码认证,外部流量也无法触达22端口,建议遵循最小权限原则,将密钥登录PubkeyAuthentication yes与PasswordAuthentication no配合使用。
为什么修改了Port参数后,虚拟机ssh连接不上?
大概率是防火墙未放行新端口,Linux执行sudo firewall-cmd --permanent --add-port=2222/tcp && sudo firewall-cmd --reload(CentOS)或sudo ufw allow 2222/tcp(Ubuntu),Windows则需在“高级安全Windows Defender防火墙”中新增入站规则,修改端口后,务必确认SELinux上下文,否则sshd -t虽通过,实际连接仍会被拒绝。
配置查看的本质是确认“服务在跑、端口在听、规则放行”三个事实,把sshd -T和ss -tlnp配合使用,80%的配置问题都能定位,若实在查不出问题,试着用ssh -vvv连接并观察客户端日志,最后三行的报错信息往往直接指向根因。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/796847.html


