OVN/OVS场景下虚拟机新网卡通过 DHCP 获取 IP 地址的完整过程

虚拟机新网卡通过 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.logovs-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,提供 IP 172.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.120.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) 才算匹配。
  • 最后一条(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 服务 的标准行为:

  1. 新网卡出现 ,OVN 通过 binding 认领 MAC。
  2. 虚拟机发送 DHCP Discover(广播),流表匹配到 table 35 的 conjunction 规则,触发 controller 动作,将 DHCP 请求上送到 OVN 控制器。
  3. OVN 的 pinctrl 模块处理该请求,根据逻辑端口配置分配 IP(172.16.119.12),并通过流表构造 DHCP Offer/ACK 响应包,修改包头后发回给虚拟机。
  4. 日志中记录的 DHCPOFFERDHCPACK 就是这一过程的证据。

因此,看到的一切------日志、流表中的 conjunction、controller 动作------共同构成了给新网卡动态分配 IP 的完整 DHCP 交互。这一过程完全是 OVN 内部自动完成的,无需额外部署 DHCP 服务器。

相关推荐
今天AI了吗1 小时前
DeepSeek Harness 深度解析:从评测架构到实战落地
java·网络·数据库·人工智能·架构·java-ee
M哥支付1 小时前
高频交易优选方案:银联快捷支付通道
服务器·网络·其他·微信·金融
爱倒腾的老唐2 小时前
11、误码率测试仪
网络
逍遥~1422 小时前
什么是工业级算力?算盘科技的核心能力解析
网络·人工智能·科技
稳联技术老娜2 小时前
伺服内嵌EtherNet IP方案:嵌入式小板SPI通讯固件Demo程序适配改造
运维·服务器·网络
uoKent3 小时前
计网中的TCP/UDP协议 特点与联系
网络协议·tcp/ip·udp
CLK音视频广播设备4 小时前
河南川利卡科技集团圆满落地安徽宿州校园网络广播项目
网络·科技
论文复现现场5 小时前
MiniMaxH3 生成视频速度慢、电脑带不动怎么办?用 RTX 5090 云端镜像快速运行
云计算·电脑·音视频·gpu算力
M哥支付5 小时前
快捷支付 VS 网关支付 安全对比
服务器·网络·其他·微信·金融