公众号旧文
虚拟机从二层网络消失,再重新加入网络
一台 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 不通就急着改配置,先判断问题发生在哪一层。