下面我将详细介绍如何使用Scapy构造一个完整的VXLAN报文,包含外层(underlay)和内层(overlay)的源/目的地址,并发送到指定网卡。
完整VXLAN报文结构
一个典型的VXLAN报文包含以下几层:
- 外层以太网头(Underlay Ethernet)
- 外层IP头(Underlay IP)
- 外层UDP头(VXLAN使用)
- VXLAN头
- 内层以太网头(Overlay Ethernet)
- 内层IP头(Overlay IP)
- 内层传输层及数据
使用Scapy构造并发送
python
复制
from scapy.all import *
from scapy.layers.inet import UDP, IP
from scapy.layers.l2 import Ether
from scapy.layers.vxlan import VXLAN
# 配置参数
outer_dst_mac = "00:11:22:33:44:55" # 外层目的MAC(下一跳)
outer_src_mac = "aa:bb:cc:dd:ee:ff" # 外层源MAC(本机网卡MAC)
outer_dst_ip = "192.168.1.100" # 外层目的IP(VTEP对端IP)
outer_src_ip = "192.168.1.200" # 外层源IP(本机IP)
vni = 5001 # VXLAN网络标识符
inner_dst_mac = "00:de:ad:be:ef:00" # 内层目的MAC
inner_src_mac = "00:ca:fe:ca:fe:00" # 内层源MAC
inner_dst_ip = "10.0.0.2" # 内层目的IP
inner_src_ip = "10.0.0.1" # 内层源IP
target_iface = "eth0" # 发送网卡
# 构造ICMP payload (ping请求)
icmp_payload = ICMP(type=8, code=0) # type=8表示echo request
# 构造完整VXLAN报文
vxlan_packet = (
# 外层封装(Underlay)
Ether(src=outer_src_mac, dst=outer_dst_mac) /
IP(src=outer_src_ip, dst=outer_dst_ip) /
UDP(dport=4789, sport=1234) / # VXLAN使用UDP端口4789
# VXLAN头部
VXLAN(vni=vni, flags=0x08) / # flags=0x08表示VXLAN ID有效
# 内层封装(Overlay)
Ether(src=inner_src_mac, dst=inner_dst_mac) /
IP(src=inner_src_ip, dst=inner_dst_ip) /
icmp_payload
)
# 打印报文详情
print("### 构造的VXLAN报文详情 ###")
vxlan_packet.show()
# 发送到指定网卡
print(f"\n发送VXLAN报文到网卡 {target_iface}...")
sendp(vxlan_packet, iface=target_iface, verbose=True)
关键参数说明
- 外层(Underlay)网络:
outer_src_mac
: 发送网卡的MAC地址outer_dst_mac
: 下一跳设备的MAC地址(如网关)outer_src_ip
: 本地VTEP的IP地址outer_dst_ip
: 远端VTEP的IP地址
- VXLAN头部:
vni
: VXLAN网络标识符(1-16777215)flags
: 0x08表示VNI字段有效
- 内层(Overlay)网络:
inner_src_mac
: 虚拟机的源MACinner_dst_mac
: 虚拟机的目的MACinner_src_ip
: 虚拟机的源IPinner_dst_ip
: 虚拟机的目的IP
验证发送
- 在接收端使用tcpdump抓包验证:
bash
复制
sudo tcpdump -i eth0 -nn -v udp port 4789
- 如果接收端配置了VXLAN接口,应该能看到解封装后的ICMP报文
注意事项
- 确保发送网卡(
target_iface
)确实存在且有正确的MAC地址 - 外层目的MAC地址应该是可达的下一跳地址
- 如果VXLAN流量需要通过网关,外层目的MAC应该是网关的MAC
- 需要root权限才能发送原始数据包
- 在生产环境中,VXLAN通常与SDN控制器或分布式网络系统配合使用
你可以根据需要修改各层地址和负载内容(如将ICMP改为TCP/UDP等)。