大多数情况下是因为防火墙默认策略未放行 SSH 端口,需要在 firewalld 中显式添加 ssh 服务或 22 端口,操作前务必确保拥有服务器控制台权限以防失联。
先说结论:这是防火墙默认拦截策略导致的连通性问题,优先通过 firewall-cmd 放行服务,操作期间保持控制台连接可用。
- 先确认:检查 firewalld 状态及当前放行规则
- 先处理:添加 ssh 服务到永久规则并重载配置
- 再验证:使用新终端测试连接并查看防火墙日志
命令速用版
如果你急需恢复连接且确认当前会话未断开,可依次执行以下命令。注意:一旦当前 SSH 会话断开,若规则未生效将无法再次连接,请务必保留控制台访问方式。
systemctl status firewalld
firewall-cmd `--permanent` `--add-service`=ssh
firewall-cmd `--reload`
firewall-cmd `--list-all`为什么会这样
CentOS 7 默认使用 firewalld 作为动态防火墙管理器。开启防火墙后,默认区域(public)的策略通常是丢弃未明确允许的入站流量。SSH 服务监听 22 端口,如果该端口未被添加到允许列表中,外部发起的连接请求会被防火墙直接丢弃,客户端表现为 Connection timed out。
此外,有时虽然添加了规则,但未执行 reload 或未使用 `--permanent` 参数,导致重启后失效或当前会话未即时生效。
分步处理
步骤 1:确认防火墙状态
先查看防火墙是否正在运行,避免对未开启的服务做无效配置。
systemctl is-active firewalld若返回 active,则继续下一步。若返回 inactive,则超时问题可能源于其他网络配置或安全组。
步骤 2:放行 SSH 服务
使用 `--permanent` 参数确保规则写入配置文件,重启后依然有效。
firewall-cmd `--permanent` `--add-service`=ssh如果自定义了 SSH 端口(非 22),请使用端口模式:
firewall-cmd `--permanent` `--add-port`=2222/tcp步骤 3:重载防火墙配置
修改永久规则后必须重载才能生效,这一步会应用新规则。
firewall-cmd `--reload`步骤 4:检查区域设置
确认网卡绑定的区域是否正确,默认通常为 public。
firewall-cmd `--get-active-zones`怎么验证是否生效
不要直接关闭当前 SSH 窗口。新开一个终端窗口尝试连接:
ssh -v user@your_server_ip观察输出是否卡在 Connecting 还是进入 Authentication。同时可在服务器端查看防火墙日志确认是否有放行记录:
journalctl -u firewalld -f也可使用以下命令确认端口是否在允许列表中:
firewall-cmd `--list-services`此外,建议使用 telnet 或 nc 从外部测试端口连通性:
nc -zv your_server_ip 22紧急恢复:失联后如何通过云控制台修复
如果操作失误导致 SSH 无法连接,请立即使用云厂商提供的远程控制台(VNC/终端)登录服务器。
临时恢复连接:
systemctl stop firewalld停止防火墙后通常可立即恢复 SSH 连接,随后再按上述步骤重新配置规则。
永久修复:
登录控制台后,重新执行放行命令并启动防火墙:
firewall-cmd `--permanent` `--add-service`=ssh
firewall-cmd `--reload`
systemctl start firewalld常见坑
- 失联风险:在远程 SSH 会话中操作防火墙,一旦规则错误且当前连接断开,将无法再次登录。务必先测试云厂商的控制台(VNC)是否能登录。
- 临时与永久:不加 `--permanent` 参数规则仅在内存中生效,重启服务器或重载后会丢失。
- 安全组冲突:云服务器(如阿里云、腾讯云)除了系统防火墙,还有外层安全组。若安全组未放行 22 端口,系统内配置正确也无法连接。
- SELinux 干扰:虽然少见,但若修改了 SSH 默认端口,需同时调整 SELinux 策略,否则可能拒绝连接。