虚拟机新网卡通过 DHCP 获取 IP 地址的完整过程。
[root@node25 ~]# ovs-ofctl dump-flows br-int |grep fa:cf:7c:ec:2b:01
cookie=0x73bd8cdc, duration=109.420s, table=30, n_packets=0, n_bytes=0, idle_age=109, priority=100,reg0=0xac10770c,reg15=0x6,metadata=0x51 actions=mod_dl_dst:fa:cf:7c:ec:2b:01,resubmit(,31)
cookie=0x649db74d, duration=109.458s, table=34, n_packets=0, n_bytes=0, idle_age=109, priority=50,arp,metadata=0x32,dl_dst=ff:ff:ff:ff:ff:ff,arp_tpa=172.16.119.12,arp_op=1 actions=move:NXM_OF_ETH_SRC[]->NXM_OF_ETH_DST[],mod_dl_src:fa:cf:7c:ec:2b:01,load:0x2->NXM_OF_ARP_OP[],move:NXM_NX_ARP_SHA[]->NXM_NX_ARP_THA[],load:0xfacf7cec2b01->NXM_NX_ARP_SHA[],move:NXM_OF_ARP_SPA[]->NXM_OF_ARP_TPA[],load:0xac10770c->NXM_OF_ARP_SPA[],move:NXM_NX_REG14[]->NXM_NX_REG15[],load:0x1->NXM_NX_REG10[0],resubmit(,42)
cookie=0xdb891c76, duration=109.458s, table=34, n_packets=0, n_bytes=0, idle_age=109, priority=50,arp,metadata=0x32,dl_dst=fa:cf:7c:ec:2b:01,arp_tpa=172.16.119.12,arp_op=1 actions=resubmit(,35)
cookie=0x0, duration=109.458s, table=35, n_packets=0, n_bytes=0, idle_age=109, priority=100,udp,reg14=0x25,metadata=0x32,dl_src=fa:cf:7c:ec:2b:01,nw_src=172.16.119.12,tp_src=68,tp_dst=67 actions=conjunction(3880932440,2/2)
cookie=0x0, duration=109.458s, table=35, n_packets=0, n_bytes=0, idle_age=109, priority=100,udp,reg14=0x25,metadata=0x32,dl_src=fa:cf:7c:ec:2b:01,nw_src=0.0.0.0,tp_src=68,tp_dst=67 actions=conjunction(3880932440,2/2)
cookie=0x0, duration=109.460s, table=35, n_packets=0, n_bytes=0, idle_age=109, priority=100,udp,reg14=0x25,metadata=0x32,dl_src=fa:cf:7c:ec:2b:01,nw_dst=172.16.119.1,tp_src=68,tp_dst=67 actions=conjunction(3880932440,1/2)
cookie=0x0, duration=109.460s, table=35, n_packets=0, n_bytes=0, idle_age=109, priority=100,udp,reg14=0x25,metadata=0x32,dl_src=fa:cf:7c:ec:2b:01,nw_dst=255.255.255.255,tp_src=68,tp_dst=67 actions=conjunction(3880932440,1/2)
cookie=0xb7c1bc0, duration=109.460s, table=35, n_packets=2, n_bytes=684, idle_age=104, priority=100,conj_id=3880932440,udp,reg14=0x25,metadata=0x32,dl_src=fa:cf:7c:ec:2b:01,tp_src=68,tp_dst=67 actions=controller(userdata=00.00.00.02.00.00.00.00.00.01.de.10.00.00.00.63.ac.10.77.0c.33.04.00.00.0e.10.1a.02.05.78.01.04.ff.ff.ff.00.03.04.ac.10.77.01.36.04.ac.10.77.01,pause),resubmit(,36)
cookie=0xdaccb267, duration=109.462s, table=36, n_packets=2, n_bytes=644, idle_age=104, priority=100,udp,reg0=0x8/0x8,reg14=0x25,metadata=0x32,dl_src=fa:cf:7c:ec:2b:01,tp_src=68,tp_dst=67 actions=move:NXM_OF_ETH_SRC[]->NXM_OF_ETH_DST[],mod_dl_src:fa:00:b7:36:d5:09,mod_nw_src:172.16.119.1,mod_tp_src:67,mod_tp_dst:68,move:NXM_NX_REG14[]->NXM_NX_REG15[],load:0x1->NXM_NX_REG10[0],resubmit(,42)
cookie=0xf92ad2d2, duration=113.746s, table=40, n_packets=0, n_bytes=0, idle_age=113, priority=50,metadata=0x32,dl_dst=fa:cf:7c:ec:2b:01 actions=load:0x25->NXM_NX_REG15[],resubmit(,42)
[root@node25 ~]#
[root@node25 ~]# grep -an fa:cf:7c:ec:2b:01 /var/log/ovn/ovn-controller.log
6343:2026-09-01T02:49:30.037Z|17187|binding|INFO|default.fe35d5uu8xee: Claiming fa:cf:7c:ec:2b:01
6357:2026-09-01T02:49:36.931Z|03037|pinctrl(ovn_pinctrl0)|INFO|DHCPOFFER fa:cf:7c:ec:2b:01 172.16.119.12
6358:2026-09-01T02:49:36.932Z|03038|pinctrl(ovn_pinctrl0)|INFO|DHCPACK fa:cf:7c:ec:2b:01 172.16.119.12
[root@node25 ~]
ovn-controller.log 和 ovs-ofctl 流表信息,可以清晰看到 OVN 如何拦截 DHCP 请求、分配 IP 并回应。下面逐步拆解。
🔍 1. 关键日志:DHCP 协商过程
在 /var/log/ovn/ovn-controller.log 中:
6343:2026-09-01T02:49:30.037Z|17187|binding|INFO|default.fe35d5uu8xee: Claiming fa:cf:7c:ec:2b:01
6357:2026-09-01T02:49:36.931Z|03037|pinctrl(ovn_pinctrl0)|INFO|DHCPOFFER fa:cf:7c:ec:2b:01 172.16.119.12
6358:2026-09-01T02:49:36.932Z|03038|pinctrl(ovn_pinctrl0)|INFO|DHCPACK fa:cf:7c:ec:2b:01 172.16.119.12
- Claiming :OVN 发现该 MAC 地址(新网卡)并绑定到逻辑端口
default.fe35d5uu8xee(即"认领"该设备)。 - DHCPOFFER :OVN 的
pinctrl模块(处理 DHCP 等控制器动作)发出了 DHCP Offer,提供 IP172.16.119.12。 - DHCPACK:客户端接受后,OVN 发出 DHCP ACK 确认分配。
这表明 DHCP 服务由 OVN 内置的 DHCP 功能(或通过 OpenFlow 的 controller 动作)提供,而非外部 DHCP 服务器。
🔎 2. 流表分析:数据包如何被"捕获"并触发 DHCP 响应
你通过 ovs-ofctl dump-flows br-int | grep fa:cf:7c:ec:2b:01 筛选出的流表,都是与该 MAC 相关的处理规则。下面解释关键的表项(按 table 顺序):
Table 30(匹配 MAC 并重定向)
cookie=0x73bd8cdc, table=30, priority=100, reg0=0xac10770c, reg15=0x6, metadata=0x51 actions=mod_dl_dst:fa:cf:7c:ec:2b:01,resubmit(,31)
- 作用:将目的 MAC 改为新网卡的 MAC,并转到 table 31。这通常用于将数据包送给该逻辑端口。
Table 34(ARP 处理)
有两条关于 ARP 的规则(优先级 50):
- 第一条匹配广播 ARP 请求(
dl_dst=ff:ff:ff:ff:ff:ff, arp_tpa=172.16.119.12, arp_op=1),动作是构造 ARP 响应(修改 MAC 地址并设置响应数据),将源 MAC 改为fa:cf:7c:ec:2b:01,并重设 IP 等。 - 第二条匹配目标 MAC 为该新网卡、且请求其 IP 的 ARP(
dl_dst=fa:cf:7c:ec:2b:01, arp_tpa=172.16.119.12),直接放行(resubmit(,35))。
Table 35(DHCP 请求匹配与 conjunction)
这是 DHCP 处理的核心:
- 四条
conjunction规则(优先级 100),用于匹配来自该 MAC 的 DHCP 请求(UDP 源端口 68,目的端口 67):- 两条匹配源 IP 为
172.16.119.12或0.0.0.0(第一次请求通常用 0.0.0.0),作为 conjunction 的"2/2"部分(即条件2)。 - 两条匹配目的 IP 为
172.16.119.1(网关)或255.255.255.255(广播),作为 conjunction 的"1/2"部分。 - 这些条件组合起来,形成 conjunction 规则(
conjunction(3880932440,2/2)和conjunction(3880932440,1/2)),即同时满足源IP条件(2/2)和目的IP条件(1/2) 才算匹配。
- 两条匹配源 IP 为
- 最后一条(
conj_id=3880932440)真正触发动作:actions=controller(userdata=...),resubmit(,36)。
它将 DHCP 请求数据包通过 OpenFlow 的controller动作 发送给 OVN 控制器(pinctrl模块),由它生成 DHCP Offer/ACK;同时继续转发到 table 36。
Table 36(DHCP 响应修改)
cookie=0xdaccb267, table=36, priority=100, udp, reg0=0x8/0x8, reg14=0x25, metadata=0x32, dl_src=fa:cf:7c:ec:2b:01, tp_src=68, tp_dst=67 actions=move:NXM_OF_ETH_SRC[]->NXM_OF_ETH_DST[],mod_dl_src:fa:00:b7:36:d5:09,mod_nw_src:172.16.119.1,mod_tp_src:67,mod_tp_dst:68,...
- 这条规则用于修改 DHCP 响应数据包 (因为响应是从控制器发出,需要伪装成 DHCP 服务器):
- 将源 MAC 移到目的 MAC(因为响应要发给客户端);
- 修改源 MAC 为某个特定的 MAC(
fa:00:b7:36:d5:09,可能是网关的 MAC); - 修改源 IP 为网关 IP(
172.16.119.1),并交换 UDP 端口(源变 67,目的变 68)。
- 最后
resubmit(,42)继续后续处理。
Table 40(流量重定向)
cookie=0xf92ad2d2, table=40, priority=50, metadata=0x32, dl_dst=fa:cf:7c:ec:2b:01 actions=load:0x25->NXM_NX_REG15[],resubmit(,42)
- 这是将去往该 MAC 的流量(可能是已经获得 IP 后的数据包)重新标记并送往 table 42,实现后续的转发。
✅ 总结
整个流程符合 OVN 内置 DHCP 服务 的标准行为:
- 新网卡出现 ,OVN 通过
binding认领 MAC。 - 虚拟机发送 DHCP Discover(广播),流表匹配到 table 35 的 conjunction 规则,触发
controller动作,将 DHCP 请求上送到 OVN 控制器。 - OVN 的
pinctrl模块处理该请求,根据逻辑端口配置分配 IP(172.16.119.12),并通过流表构造 DHCP Offer/ACK 响应包,修改包头后发回给虚拟机。 - 日志中记录的
DHCPOFFER和DHCPACK就是这一过程的证据。
因此,看到的一切------日志、流表中的 conjunction、controller 动作------共同构成了给新网卡动态分配 IP 的完整 DHCP 交互。这一过程完全是 OVN 内部自动完成的,无需额外部署 DHCP 服务器。