用 ssh 或者 ping 连一台服务器,返回 No route to host,跟 Connection refused、Connection timed out 是三种不同的病。它对应 ICMP 里的「主机不可达」,意思是有设备明确告诉你:这条路到不了对面。

和另外两个错误怎么区分

  • Connection refused:对方主机通了,但目标端口没程序监听,TCP 直接回 RST。
  • Connection timed out:包出去了没有任何回应,通常是被防火墙静默丢弃。
  • No route to host:中间有设备回了 ICMP 不可达,说明是路由或者链路层面的问题。

从本机开始查

ip route
ip addr
traceroute -n 10.0.0.5   # Windows 上是 tracert -d 10.0.0.5

先看本机有没有默认网关,网卡是不是拿到了正确网段的地址。容器环境里很常见的一种情况是:容器分配了 IP,但没有正确设置网关或者路由,出不去也进不来。

traceroute 停在哪一跳,问题就在那一段。停在第一跳,通常是本机网关错误;跑到中间停住,说明中间链路断了。

常见的四种原因

  • IP 或网段填错:子网掩码写错导致以为在同一个网段,数据包发给了错误的网关。
  • 网关不可达:交换机端口 VLAN 配错,或者服务器所在的机柜网络没通。
  • 防火墙返回 ICMP 不可达:有些防火墙会主动回 host-unreachable,看起来像路由问题,实际是策略拒绝了。
  • IPv6 优先导致:域名解析出 IPv6 地址,本机有 IPv6 地址但路由不通,于是报错。用 -4 强制 IPv4 验证。

验证和修复

先 ping 网关,再 ping 同网段的另一台机器,一层层往外扩。能 ping 通网关但不能通目标,就找网络管理员看交换机和防火墙的 ACL。

如果是云服务器,重点查安全组和路由表:安全组没放行会表现为超时,路由表缺失则更容易出现主机不可达。弹性网卡换了子网、路由没同步,也会突然报这个错。

一句话,no route to host 是网络层的事,别在应用日志里找原因。