构造包含内外层地址的VXLAN报文并发送到指定网卡

下面我将详细介绍如何使用Scapy构造一个完整的VXLAN报文,包含外层(underlay)和内层(overlay)的源/目的地址,并发送到指定网卡。

完整VXLAN报文结构

一个典型的VXLAN报文包含以下几层:

  1. 外层以太网头(Underlay Ethernet)
  2. 外层IP头(Underlay IP)
  3. 外层UDP头(VXLAN使用)
  4. VXLAN头
  5. 内层以太网头(Overlay Ethernet)
  6. 内层IP头(Overlay IP)
  7. 内层传输层及数据

使用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)

关键参数说明

  1. 外层(Underlay)网络:
    • outer_src_mac: 发送网卡的MAC地址
    • outer_dst_mac: 下一跳设备的MAC地址(如网关)
    • outer_src_ip: 本地VTEP的IP地址
    • outer_dst_ip: 远端VTEP的IP地址
  2. VXLAN头部:
    • vni: VXLAN网络标识符(1-16777215)
    • flags: 0x08表示VNI字段有效
  3. 内层(Overlay)网络:
    • inner_src_mac: 虚拟机的源MAC
    • inner_dst_mac: 虚拟机的目的MAC
    • inner_src_ip: 虚拟机的源IP
    • inner_dst_ip: 虚拟机的目的IP

验证发送

  1. 在接收端使用tcpdump抓包验证:

bash

复制

sudo tcpdump -i eth0 -nn -v udp port 4789
  1. 如果接收端配置了VXLAN接口,应该能看到解封装后的ICMP报文

注意事项

  1. 确保发送网卡(target_iface)确实存在且有正确的MAC地址
  2. 外层目的MAC地址应该是可达的下一跳地址
  3. 如果VXLAN流量需要通过网关,外层目的MAC应该是网关的MAC
  4. 需要root权限才能发送原始数据包
  5. 在生产环境中,VXLAN通常与SDN控制器或分布式网络系统配合使用

你可以根据需要修改各层地址和负载内容(如将ICMP改为TCP/UDP等)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值