公众号旧文

虚拟机从二层网络消失,再重新加入网络

作者:胖子阅读 —

一台 VPS 关机后,它从二层网络中消失;

重新开机后,又重新出现在网络中。

整个过程刚好展示了 Linux 网络通信中非常重要的一环:

ARP(二层地址解析)如何决定一台机器是否存在。

一、故障背景

环境中有两台 VPS

源服务器:

193.142.18.225

目标服务器:

193
.
142
.
18
.
143

两台机器位于同一个网络环境。

测试访问:

ping

193.142.18.143

结果:

From 193.142.18.225 icmp_seq=1 Destination Host Unreachable

目标不可达。

二、第一次排查:traceroute 出现异常

执行:

traceroute 193.142.18.143

结果:

traceroute
 to
193.142.18.143
1

193.142.18.225

3077
 ms !H

这里出现了一个很奇怪的现象:

第一跳不是网关,而是自己。

正常网络:

客户端
 |
网关
 |
运营商
 |
目标服务器

但是现在:

193.142.18.225
        |
        |
        X
目标:
193.142.18.143

!H 是什么意思?

traceroute 中:

!H

代表:

Host Unreachable

即主机不可达。

关键点:

这个错误不是目标机器返回的。

而是:

当前这台机器自己产生的。

意思是:

我想访问 193.142.18.143,但是我找不到它。

三、查看 Linux 路由判断

继续分析:

ip route get 193.142.18.143

输出:

193.142.18.143 dev eth0 src 193.142.18.225

这里最关键:

dev eth0

而不是:

via xxx.xxx.xxx.xxx

说明 Linux 判断目标 IP 和其在同一个直连网络。

也就是说它没有经过网关。

通信模型:

193.142.18.225
        |
       eth0
        |
    二层交换网络
        |
193.142.18.143

四、进入二层排查:ARP

既然目标在同一个二层网络,那么通信前必须知道:

193.142.18.143 对应哪个 MAC 地址。

IPv4 通信流程:

目标 IP
  |
  |
ARP 查询
  |
  |
目标 MAC
  |
  |
发送 Ethernet 帧

Linux 查看邻居表:

ip
 neigh

发现:

193.142.18.143 dev eth0 FAILED

FAILED 意味着什么?

Linux 曾经发送:

Who has 193.142.18.143?
Tell 193.142.18.225

类似:谁是 193.142.18.143,请告诉我你的 MAC 地址。

但是没有任何回应。

于是:

IP存在?
未知

MAC地址?
未知

结果:
FAILED

五、真正原因:目标 VPS 关机

继续检查 VPS 面板:

发现:

193
.
142
.
18
.
143

这台机器:

OFF

原来不是:

  • 防火墙问题
  • SSH问题
  • 路由问题

而是目标虚拟机根本没有运行。

六、重新开机:虚拟机出现

启动目标 VPS。

再次:

ping

193.142.18.143

恢复:

64 bytes from 193.142.18.143:
icmp_seq=1 ttl=64 time=0.771 ms
64 bytes from 193.142.18.143:
icmp_seq=2 ttl=64 time=0.241 ms

延迟:

0.2 ms

非常低。

说明两台 VPS 距离非常近。

大概率:

  • 同一机房
  • 同一宿主网络
  • 同一个 VLAN

七、抓包验证整个过程

安装:

apt install tcpdump

监听:

tcpdump -ni eth0 host 193.142.18.143

然后 ping:

ping

193.142.18.143

抓到:

请求:
193.142.18.225 > 193.142.18.143:
ICMP echo request

回复:
193.142.18.143 > 193.142.18.225:
ICMP echo reply

完整闭环:

225
 |
 | ICMP Request
 ↓
143

143
 |
 | ICMP Reply
 ↓
225

八、再次查看 ARP 状态

现在:

ip
 neigh

结果:

193.142.18.143 dev eth0 lladdr bc:24:11:b1:8c:5c STALE

变化:

之前:
FAILED

现在:
STALE

STALE 是不是异常?

不是。

Linux 邻居状态:

状态 含义
REACHABLE 刚确认通信正常
STALE 曾经确认过,可以使用
DELAY 等待重新确认
PROBE 正在探测
FAILED 无法找到

现在:

STALE

说明:我知道它是谁,也知道它的 MAC 地址。

九、整个生命周期

关机状态

193.142.18.225
        ARP:
        Who has 193.142.18.143?
                ↓
        没有响应
ip
 neigh:
193
.
142
.
18
.
143
 FAILED
ping:
Destination Host Unreachable

开机状态

193.142
.
18.225

ARP
:

Who
 has
193.142
.
18.143
?
                ↓
        回复:

bc:
24
:
11
:b1:
8
c:
5c
ip
 neigh:
193
.
142
.
18
.
143
 STALE
ping
:
0
.
2
ms

十、这次故障学到了什么?

很多人看到 ping 不通

第一反应:

  • 改防火墙
  • 重启服务
  • 检查端口

但是网络排障应该先判断:

第一步:在哪一层?

应用层
 |
TCP
 |
IP
 |
ARP
 |
Ethernet

这次故障

不是应用层:

❌ SSH

不是传输层:

❌ TCP端口

不是网络层:

❌ 路由

而是:

✅ 二层 ARP

十一、VPS 网络排障常用命令

查看路由

ip route get 目标IP

判断:

  • via → 经过网关
  • dev eth0 → 可能二层直连

查看 ARP / 邻居状态

ip
 neigh

重点:

REACHABLE
STALE
FAILED

抓包

tcpdump -ni eth0 host IP

确认:

  • 有没有发出去
  • 有没有回来

总结

这次故障表面看,这是一台 VPS ping 不通。

但实际过程:

目标 VPS 关机
↓
从二层网络消失
↓
ARP 查询失败
↓
Linux 标记 FAILED
↓
恢复开机
↓
重新发送 ARP
↓
获得 MAC 地址
↓
恢复通信

这也是 Linux 网络中一个非常经典的过程:

IP 地址代表“我是谁”,而 MAC 地址决定“我能不能找到你”。

当一台虚拟机关闭时,它不仅仅是“服务停止”,它会直接从所在二层网络中消失。

重新开机后,它又通过 ARP 重新加入这个网络。

这次排查最大的收获:

不要看到 ping 不通就急着改配置,先判断问题发生在哪一层。