假设我们有一个虚拟交换机,其中连接着两个虚拟机——VM1 和 VM2。现在我们想要实现 ARP 代答来避免 VM1 或 VM2 回复 ARP 请求。下面是一个简单的流表项来实现这样的功能:
ovs-ofctl add-flow br0 “table=0, priority=100, arp, in_port=1, dl_src=<MAC address of the VM>, arp_tpa=<IP Address of the VM>, actions=move:NXM_OF_ETH_SRC[]->NXM_OF_ETH_DST[], mod_dl_src:<MAC address of the VM>, load:<IP Address of the VM>->NXM_OF_ARP_SPA[], move:NXM_NX_ARP_SHA[]->NXM_NX_ARP_THA[], mod_nw_tos:0/0, move:NXM_NX_ARP_SPA[]->NXM_NX_ARP_TPA[], mod_dl_dst:ff:ff:ff:ff:ff:ff, output:NXM_OF_IN_PORT[]”
上述命令将流表的优先级设置为100,匹配类型为 ARP 请求,输入端口为 1(即连接到 VM1 的端口),并使用动作将请求信息修改为虚假的源 MAC、源 IP,接着将响应信息也改为虚假的 MAC 地址和 IP,输出到带有该请求的输入端口。
解释:
- br0: OVS 交换机的名称
- table=0: 表序号为 0,即默认表
- priority=100: 流表项的优先级。数值越高,优先级越高
- arp: 匹配类型,这里是 ARP 请求
- in_port=1: 匹配输入端口,这里是连接到 VM1 的端口
- dl_src=<MAC address of the VM>: 匹配 VM 的 MAC 地址
- arp_tpa=<IP Address of the VM>: 匹配 VM 的 IP 地址
- actions: 动作列表
- move:NXM_OF_ETH_SRC[]->NXM_OF_ETH_DST[]: 将数据包的源 MAC 地址复制到目标 MAC 地址
- mod_dl_src:<MAC address of the VM>: 修改数据包的源 MAC 地址为虚拟机的 MAC 地址
- load:<IP Address of the VM>->NXM_OF_ARP_SPA[]: 加载虚拟机的 IP 地址到数据包的源 IP 地址
- move:NXM_NX_ARP_SHA[]->NXM_NX_ARP_THA[]: 将数据包的源 ARP 地址复制到目的 ARP 地址
- mod_nw_tos:0/0: 修改服务类型(TOS)为 0/0
- move:NXM_NX_ARP_SPA[]->NXM_NX_ARP_TPA[]: 将源 IP 地址复制到目标 IP 地址中
- mod_dl_dst:ff:ff:ff:ff:ff:ff: 修改数据包的目标 MAC 地址为广播地址
- output:NXM_OF_IN_PORT[]: 输出端口,为输入端口
通过上述流表项配置,当 OVS 收到来自外部网络的 ARP 请求时,它将自动进行替换并欺骗对端网络,避免实际的 VM1 或 VM2 回复。这样可以提高网络运行效率,同时减轻 VM 对 ARP 缓存表的维护负担。