内核或路由设备无法把数据送到目标主机并返回 no route to host 的定位与修复
客户端报 connect: no route to host、No route to host 或 EHOSTUNREACH,ping 可能显示 Destination Host Unreachable。它表示本机知道目标所在网段,但无法把数据交付到具体主机:可能是同网段 ARP 失败、网关或路由器返回主机不可达,也可能是防火墙用拒绝规则生成了这类 ICMP。
要和 network is unreachable 区分:后者是本地路由表根本没有到目标网段的路由,错误通常在发包前就产生;no route to host 则可能已经选好了出口,失败发生在二层解析或后续跳点。还要和 connection refused 区分:拒绝说明包已经到达目标,只是端口没有监听或主动拒绝。
先看内核选择了哪条路由、哪个源地址和出口接口:
ip route get <ip>
ip route show
ip -6 route get <ipv6>
ip neigh show <ip>
sudo arping -I <iface> -c 3 <ip>
ping -c 3 -W 2 <ip>
traceroute -n -T -p <port> <host>
mtr -n -T -P <port> -c 20 <host>
ss -lnt '( sport = :<port> )'
sudo iptables -S | grep -E 'REJECT|DROP'
sudo nft list ruleset | grep -E 'reject|drop'
sudo conntrack -L -d <ip>
ip -br link
sudo ethtool <iface> | grep -E 'Link detected|Speed'
dmesg -T | tail -50
ip route get 的输出要和预期对比:出口接口是否错误、网关是否缺失、源地址是否属于该接口。同网段目标会显示 dev <iface> src <ip>,此时重点查邻居表和二层链路;跨网段目标会显示 via <gateway>,此时重点查网关和后续路由。
同网段场景先看 ip neigh show <ip>:条目为 FAILED 或 INCOMPLETE,说明 ARP 或 ND 没有得到响应。用 arping 验证二层可达性,再检查交换机端口隔离、VLAN、IP 冲突和主机电源状态。跨网段场景用 traceroute 或 mtr 找到返回不可达的跳点,并在该设备上检查路由、ACL 和 NAT。
防火墙的 REJECT 规则可能返回 icmp-host-prohibited 或 icmp-port-unreachable,在 Linux 客户端上表现为 no route to host。抓包确认 ICMP 类型和代码,比只看 connect 错误更可靠:
sudo tcpdump -ni any -tttt 'icmp or (host <ip> and port <port>)'
ip route get 选错出口。REJECT --reject-with icmp-host-prohibited,主动生成不可达响应。ip route get 确认出口接口、源地址和网关,再判断问题在本地路由、二层链路还是后续跳点。REJECT 规则,确认拒绝语义是否符合预期;需要放行的流量要同时考虑请求和返回方向。rp_filter 和策略路由,避免只在一个方向放行。traceroute、mtr 和抓包记录 ICMP 类型与代码,明确不可达是本地、网关还是防火墙生成的。合上页面,先回答,再展开对照。
no route to host 和 network is unreachable 的区别是什么?no route to host,应最先检查什么?network is unreachable 表示本地路由表没有到目标网段的路由,通常在发包前失败;no route to host 表示已有出口但无法交付到具体主机,可能卡在 ARP、网关路由或防火墙拒绝。FAILED 或 INCOMPLETE,用 arping 验证二层可达,再检查目标主机状态、VLAN、交换机端口隔离和 IP 冲突。ip route get 看本地选路,用 traceroute 或 mtr 定位返回不可达的跳点,用 tcpdump 查看 ICMP 类型与代码,并在疑似设备上检查路由和 REJECT 规则。
小程序版
微信扫码,随时查命令