名词解释:
弱端系统模型 (weak end system model) : IP实现接受目的地址为本主机任一IP地址的数据报,而不管数据报到达的接口。当从二层接收到分组时,匹配系统的所有的接口的所有的ip地址。
强端系统模型 (strong end system model): 只接受达到接口与目的地址一致的数据报。当从二层接收到分组时,匹配接收到该分组的接口的所有的ip地址。
现象描述:
主机配置:


其中ens33是连通的网卡,ens37未连通。
从主机ping局域网其他机器:

走ens33可以ping通其他机器,走ens37无法ping通其他机器。
从其他机器ping主机:

主机ens33的ip192.168.36.3和ens37的ip192.168.36.37都可以从其他机器ping通,但其他机器上的arp缓存里的主机mac地址只有ens33的,192.168.36.37的mac地址也是ens33的mac。
现象解释(借鉴AI):
ens37 根本没有物理链路(NO-CARRIER),但它的 IP 能被 ping 通,是因为 Linux 内核开启了「弱主机模型」(weak host model)。
简单说:
- 别的机器 ping 36.37 → 数据包到你主机 → 内核发现 "这个 IP 是我的",就直接从 ens33 回包了
- 所以你看到:外面能 ping 通 ens37 的 IP,但本机从 ens37 发不出去任何包
1. 先看你自己的输出:ens37 是 NO-CARRIER
3: ens37: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 ... state DOWN
NO-CARRIER= 网卡没插线 / 没连上交换机 / 虚拟机网卡没桥接 / 仅主机state DOWN= 链路层不通
所以:ens37 只能收包(被内核代答),不能发包。
2. 为什么外面能 ping 通 192.168.36.37?
Linux 默认是 weak host model(弱主机模型):
只要 IP 属于本机,不管从哪个网卡进来,内核都认,并从 ** 默认路由网卡(ens33)** 回复。
所以流程是:
- alma88 ping 192.168.36.37
- 包走交换机 → 到达你的 ens33
- 内核看到:"36.37 是我本机 IP"
- 直接从 ens33 回复 ICMP 应答
- 对方收到 → 显示 ping 通
这就是典型的 "单向通"、"IP 能 ping 通但网卡不通"。
3. 为什么你本机 ping -I ens37 36.5 不通?
因为:
- 你强制从 ens37 出包
- 但 ens37 NO-CARRIER,物理层不通
- 包根本发不出去,直接丢在本机协议栈
所以 100% 丢包。
4. 从 arp 表也能看出来猫腻
192.168.36.37 ether 00:0c:29:b2:35:ec C ens33
- 36.37 对应的 MAC 是 ens33 的 MAC
- 不是 ens37 的 MAC(00:0c:29:b2:35:f6)
说明:应答来自 ens33,不是 ens37。
5. 怎么验证我说的对不对?
方法 1:看 ens37 根本收不到 arp
tcpdump -i ens37 arp
再从外面 ping 36.37,你会发现:ens37 上没有任何流量,全走 ens33。
方法 2:关闭弱主机模型,立刻不通
sysctl -w net.ipv4.conf.all.arp_ignore=1
sysctl -w net.ipv4.conf.all.arp_announce=2
sysctl -w net.ipv4.conf.all.rp_filter=1
再从外面 ping 36.37,直接不通。
6. 你真正要解决的是:ens37 NO-CARRIER
VMware 虚拟机 ens37 没连上网络:
- 网络模式没选对(host-only / 桥接 / NAT 没开)
- 或虚拟机网卡没连上
- 或同网段交换机没开
解决:
- 关机
- 编辑虚拟机设置
- 找到网络适配器 2(ens37)
- 选择和适配器 1 一样的模式(比如 NAT 或 桥接)
- 开机
之后 ens37 会变成:
state UP
再 ping -I ens37 36.5 就通了。
一句话总结
- ens37 物理链路 DOWN,所以发不出包
- Linux 弱主机模型让别的机器能 ping 通它的 IP
- 本质:IP 通 ≠ 网卡通
--end--