upgw-input 节点
upgw-input
节点承接dpdk-input
节点流量,会首先对报文做初步的类型分析:
区分报文是否为
ip
协议族报文,对非ip
报文及非arp报文
直接透传对于
ip
报文,做进一步分析若为
dns
报文,则将数据指针指向ip头
,并在报文元数据中标记为dns
报文后,送入upgw-dns-redirect
节点若为
gtpu
报文,则进一步分析内层报文类型若内层报文为
dns
报文,则将数据指针指向内层ip头
,并在报文元数据中标记为dns + gtpu
报文后,送入upgw-dns-redirect
节点若内层报文为非
dns
的其他业务报文,则将数据指针指向内层ip头
,并在报文元数据中标记为gtpu
报文后,送入upgw-traffic-process
节点
对于
arp
报文,查询自学习learning table
,查到arp
请求对应的ip
后,修改报文做arp
代答处理
处理流程
命令行
# 开启 UPGW feature,开启 UPGW feature 后,会将 upgw-input 挂接入 graph,承接 dpdk-input 节点流量
upgw enable-disable
# 配置 upgw interface 属性
upgw set interface role <interface-name> <user|network|lbp>
user:标明该interface 是用户侧接口
network:标明该interface 是网络侧接口
lbp:标明该interface 是边缘侧接口
# 配置 upgw interface 默认发送 interface
upgw set interface tx <main-interface-name> default_tx <interface-name>
main-interface-name:该接口名称
interface-name:默认发送interface
# 配置 upgw interface 对端 peer mac
upgw set interface mac <interface-name> <mac-address>
# 查看 upgw interface 配置
show upgw interfaces [interface-name]
# 配置举例
root@upfastri:~# cat /etc/vpp/upgw.conf
set int state TenGigabitEthernet0/a/0 up
set int state GigabitEthernet0/3/0 up
set interface mtu ip4 1500 GigabitEthernet0/3/0
set interface mtu ip4 9000 TenGigabitEthernet0/a/0
set interface reassembly TenGigabitEthernet0/a/0 on
set interface reassembly GigabitEthernet0/3/0 on
upgw set interface role TenGigabitEthernet0/a/0 user
upgw set interface tx TenGigabitEthernet0/a/0 default_tx GigabitEthernet0/3/0
upgw set interface mac TenGigabitEthernet0/a/0 3c:ec:ef:1d:63:42
upgw set interface role GigabitEthernet0/3/0 network
upgw set interface tx GigabitEthernet0/3/0 default_tx TenGigabitEthernet0/a/0
upgw set interface mac GigabitEthernet0/3/0 52:54:00:9b:29:cb
upgw enable-disable
set interface promiscuous on TenGigabitEthernet0/a/0
set interface promiscuous on GigabitEthernet0/3/0
upgw log level debug
基于 VPP 的 UPGW ARP 代答功能介绍
ARP 协议
ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标 IP 对应的 MAC 地址。
ARP 报文解析
ARP 分为查询请求和查询响应,请求和响应的报文结构基本相同。ARP 报文格式如图所示。
基础结构部分
硬件类型:16 位字段,用来定义运行 ARP 的网络类型。每个局域网基于其类型被指派一个整数。例如:以太网的类型为 1。ARP 可用在任何物理网络上。
协议类型:16 位字段,用来定义使用的协议。例如:对 IPv4 协议这个字段是 0x0800。ARP 可用于任何高层协议。
硬件长度:8 位字段,用来定义物理地址的长度,以字节为单位。例如:对于以太网的值为 6。
协议长度:8 位字段,用来定义逻辑地址的长度,以字节为单位。例如:对于 IPv4 协议的值为 4。
操作码:16 位字段,用来定义报文的类型。已定义的分组类型有两种:ARP 请求(1),ARP 响应(2)。
源硬件地址:这是一个可变长度字段,用来定义发送方的物理地址。例如:对于以太网这个字段的长度是6字节。
源逻辑地址:这是一个可变长度字段,用来定义发送方的逻辑(IP)地址。例如:对于 IP 协议这个字段的长度是 4 字节。
目的硬件地址:这是一个可变长度字段,用来定义目标的物理地址,例如,对以太网来说这个字段位 6 字节。对于 ARP 请求报文,这个字段为全 0,因为发送方并不知道目标的硬件地址。
目的逻辑地址:这是一个可变长度字段,用来定义目标的逻辑(IP)地址,对于 IPv4 协议这个字段的长度为 4 个字节。
ARP 流程
当设置 IP 和 网关时,直接 arp 请求网关的 MAC 地址。
当访问同网段 IP 时,直接发起 arp 请求。who has x.x.x.x ?
当访问不同网段 IP 时,不发起 arp 请求。直接发起访问,目的 MAC 地址为网关的 MAC 地址,由网关发起 ARP 请求。
地址冲突检测(ACD)
Gratuitous ARP 发现地址冲突后什么都不能做,只能提示用户发生了地址冲突,通常用在主机 MAC 地址变化的情况下。
与 GARP 不通,ACD 可以对地址冲突做出反应,ACD 定义了 ARP probe 和 ARP announcement 两种 ARP 包(都是ARP request ,只是填充内容不太一样)
ARP probe:用于检测 IP 地址冲突,Sender IP 填充为 0,填充为 0 是为了避免对其他主机的 ARP cache 造成污染(因为可能已经有主机正在使用候选 IP 地址了,不要影响别人的正常通行嘛),Target IP 是候选 IP 地址(即本机想要使用的 IP 地址)
ARP announcement:用于昭示天下(LAN)本机要使用某个IP地址了,是一个 Sender IP 和 Traget IP 填充的都是本机 IP 地址的 ARP request。这会让 LAN(VLAN) 中所有主机都会更新自己的 ARP cache,将 IP 地址映射到发送者的 MAC 地址。
arp probe 报文,特征 sender IP 为 0
arp announcement 报文,特征 sender IP address 和 target IP address 相同。
ARP 代答需求
边缘服务器收到业务请求时,需要向终端回复,回复之前需要发起 arp 请求查询终端 mac 地址,在 UPGW 收到 ARP 请求时需要使用 learning 表中记录的终端 MAC 进行代答回复。(learning 表数据来源于终端到 Network 侧的下行流量)
目前只需要对以太网的 arp 请求进行代答,当从 lbp 口收到 arp 请求时,通过请求的地址查询 learning 表找到终端 MAC ,然后进行回复,其他 arp 进行 drop。
根据 http://172.16.30.125/issues/78734,当 lbp 发送 arp probe 和 arp announcement 时且未收到 arp 回复 时,才会配置上 IP,所以需要对 arp probe 和 arp announcement 不做出处理;