Google Cloud虚拟机SSH连接失败求助:端口22被拒绝/过滤
问题分析与解决方案
首先,咱们先理清楚几个关键信息:你遇到的Connection refused加上nmap显示22/tcp filtered,说明SSH流量要么没到达VM,要么被中途拦截了;而你修改的/etc/ssh/ssh_config是客户端配置文件,只会影响你本地SSH客户端的行为,不会导致服务器端的SSH服务故障,所以这个修改不是问题的直接诱因——大概率是其他配置或规则出了问题。
可能的原因
- GCP VPC防火墙规则拦截:最常见的情况是你或团队误删/修改了默认的允许SSH入站的防火墙规则,或者有优先级更高的规则阻断了22端口流量。
- VM内部防火墙限制:比如VM上的ufw、iptables等本地防火墙,不小心禁用了22端口的入站连接。
- SSH服务(sshd)故障:可能你误修改了服务器端的
sshd_config(注意是sshd不是ssh),导致服务启动失败;或者服务意外停止。 - VM网络配置异常:比如临时外部IP被释放,或者VM的内部网络出现问题。
分步解决步骤
第一步:排查GCP层面的防火墙
先从最容易排查的云层面入手:
- 登录GCP控制台,找到你的VM实例,进入详情页后点击「编辑」。
- 下拉到「防火墙」区域,确认已经勾选了「允许SSH流量」;如果是自定义规则,确保对应的防火墙规则已启用,且目标标签和你的VM标签匹配。
- 也可以直接进入「VPC网络 → 防火墙规则」,检查
default-allow-ssh规则是否存在、启用,并且覆盖你的VM实例。
第二步:通过串行控制台登录VM排查内部问题
如果GCP防火墙没问题,那问题出在VM内部,这时候可以用GCP的串行控制台直接连接:
- 在VM实例详情页,点击「连接到串行端口」,如果之前没启用,先在编辑页面勾选「启用连接到串行端口」。
- 在串行控制台窗口按Enter,输入你的VM用户名和密码(如果之前设置过)登录。
检查SSH服务状态
登录后先确认sshd是否在运行:
sudo systemctl status sshd
- 如果显示「inactive (dead)」,启动服务:
同时设置开机自启避免下次故障:sudo systemctl start sshdsudo systemctl enable sshd - 如果启动失败,查看日志找错误原因:
常见错误比如配置文件语法错误,这时候可以备份当前配置,恢复GCP默认的sshd配置:sudo journalctl -u sshdsudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak sudo cp /etc/ssh/sshd_config.d/50-cloud-init.conf /etc/ssh/sshd_config sudo systemctl restart sshd
检查本地防火墙
如果sshd在运行,检查VM内部的防火墙:
- 对于ufw:
如果22端口被拒绝,添加允许规则:sudo ufw statussudo ufw allow 22/tcp - 对于iptables:
没有允许规则的话,添加:sudo iptables -L -n | grep 22sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
确认外部IP正确性
检查VM详情页的外部IP是否和你SSH时使用的一致——如果是临时IP,可能会被自动释放,这时候可以将其改为静态IP。
替代方案
如果以上步骤暂时无法解决,还有几个应急方案:
- 浏览器端SSH:在VM实例详情页直接点击「SSH」按钮,通过GCP的内部通道直接连接,绕过本地SSH客户端和网络限制。
- 磁盘快照恢复:如果VM无法修复,先给VM磁盘创建快照,然后将快照挂载到另一个正常运行的VM实例上,提取数据或修复配置文件后再恢复。
- 串行控制台长期操作:如果浏览器SSH也不行,串行控制台可以作为临时操作通道,完成所有必要的配置修复。
内容的提问来源于stack exchange,提问作者Manel Guzmán
相关产品推荐
相关产品推荐

