ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

XCAP 1-3-7构造带VLAN标签报文实战:从802.1Q到Wireshark验证

XCAP 1-3-7构造带VLAN标签报文实战:从802.1Q到Wireshark验证

做网络调试这些年,我越来越觉得,搞网络协议这东西,光会看抓包是不行的,关键时候得能“造包”。尤其是测交换机、测防火墙策略、验证网关设备对VLAN的处理逻辑时,你不可能每次都去改真实设备的配置来配合你,最省事的方法就是直接拿发包工具,从网卡里构造一条带VLAN标签的报文发出去,看对端怎么反应。这篇文章要聊的,就是我用XCAP最新版1-3-7发送带VLAN相关报文的全过程,亲测有效,而且操作步骤少到你可能觉得自己漏了什么,觉得“就这么简单?”。

先说适合谁看:如果你在配网、测设备、做网络自动化验证,或者做嵌入式网络开发,手头需要一款不需要写一堆脚本就能构造二三四层报文的工具,这篇文章正好对路。XCAP这工具不复杂,但网上能找到的教程要么版本太老,要么讲得太绕,所以我干脆把1-3-7版本里发VLAN报文的最简流程整理成一篇文章,作为这个“网络协议系列”的第一篇。你照着做完,就能得到一条实实在在带着VID的报文,并且在Wireshark里看到它。

1. 为什么要自己动手发带VLAN的报文

1.1 什么人需要这个能力

最常见的场景是在实验室里验证交换机。你接手一台设备,需要确认它在端口上是否正确处理了VLAN标记,VLAN 100的帧能不能从某个口转发出去,VLAN 200的帧会不会被丢弃。你当然可以去命令行里敲一堆配置,然后用真实终端去发流量,但这样周期太长,而且环境一变就得重来。

另一种场景是配合抓包做功能的回归测试。比如你改完了一段协议栈代码,需要反复确认收到特定VID的报文后程序走的分支是否正确。这时候你需要一个能精确控制每个字段的工具,而不是用现成的Ping或者浏览器访问网页——那些软件走的是操作系统协议栈,该带什么标签、不该带什么标签,你根本控制不了。

还有一类人群是做交换机芯片或者终端网卡开发的。调试时经常需要模拟对端设备发来带特定802.1Q标签的报文,来验证自己的硬件行为和预期一不一致。这类工作用现成的物理设备来搭场景,成本高、效率低,用发包工具纯粹从网卡口发出自定义报文,几分钟就能跑一个用例。

1.2 先把“发带VLAN的报文”这件事定义清楚

这里说的“发带VLAN的报文”,不是说你在交换机上把一个端口划分到某个VLAN里,再让交换机自动给流量打上标签。我们做的事情是自己构造一帧完整的二层数据,在以太网头部里手动加入VLAN Tag字段,然后把这一帧原始数据直接交给网卡发送出去。

这么说可能有点抽象,我们换个类比:正常上网时,你的网卡像一个“自动流水线”,操作系统把所有协议头都封装好了,它只负责往外吐。而发包工具像“手工作坊”,每个字节你都能自己摆位置。带VLAN的报文,关键就在于你在“源MAC之后、上层协议类型之前”插入了一个4字节的标签,里面记录了优先级、VID等信息。对端交换机看到这个标签,才知道这个帧属于哪个VLAN。

搞清楚这一点,后面做配置心里就有底了。我们不是在配置什么复杂的虚拟网络,而是在手工编写一个符合802.1Q规范的数据帧。

2. 开工前的准备:XCAP 1-3-7 与验证环境搭建

2.1 工具与版本:为什么用最新版1-3-7

XCAP是一款图形化的发包工具,实际用下来,它最大的优点是字段可视、修改直观,不需要记一堆命令,也不用手写Python脚本。新版的1-3-7在帧模板管理、发送性能和界面响应上都比旧版舒服不少,尤其是配置复杂报文时,界面不会卡。

安装上有一个细节需要特别提醒:装完之后,第一次打开如果没有任何反应,八成是权限问题。右键选择“以管理员身份运行”,因为它需要直接访问网卡驱动。另外,如果你的电脑装了比较严格的杀毒软件,建议把XCAP的安装目录加进白名单,不然它可能把发包工具当木马直接杀掉。这不是工具的问题,是很多底层发包工具都会触发类似误报,因为它们需要拿原始套接字权限。

除了主程序,我建议把网卡驱动确认一遍。Windows系统一般没问题,但如果你用的是比较老的USB网卡或者虚拟机默认的虚拟网卡,驱动是否完整支持原始帧发送会直接影响结果。我之前试过在某台虚拟化环境里发带VLAN的帧,发是发出去了,但抓包怎么看都少一个Tag,这个坑后面章节专门讲。

2.2 配套验证环境怎么搭

工具选好了,还得有验证手段。我的建议是安装Wireshark,用另一台电脑或者同一个平台上独立物理网卡来抓包。最推荐的实验拓扑是两台电脑直连,A机跑XCAP发包,B机开Wireshark抓包,中间只放一根网线。

有人可能会问:能不能在同一台电脑上又发又抓?技术上可以,但如果只有一块网卡,你发的带VLAN报文可能在被驱动处理的时候就被改掉了,抓到的结果并不能代表线上的真实形态。所以,能分开尽量分开。如果你手头实在只有一台机器,可以尝试用支持混杂模式的USB千兆网卡,但效果不如双机直连稳定。

抓包工具的过滤规则也要提前准备好。在Wireshark的过滤栏里输入vlan,它会直接列出所有带VLAN标签的帧。这样在你大量发包时,不会被其他广播报文干扰视线。如果抓到的帧里能看到vlan标签,并且VID和你设置的一致,就说明整个发送链路是通的,你的报文构造也没有问题。

3. 看清802.1Q的字段再下手,构造思路才不会歪

3.1 802.1Q标签到底长什么样

要发带VLAN的报文,你得先知道VLAN Tag在帧里的确切位置。常见的Ethernet II帧,顺序是:目的MAC(6字节)、源MAC(6字节)、EtherType(2字节)、Payload。而打了VLAN标签之后,EtherType这个位置被“挤”到后面去了,取而代之的是一个4字节的TPID和TCI字段组合。

TPID全称Tag Protocol Identifier,标准取值是0x8100,表示这是一个802.1Q标签。TCI又拆成三块:PCP(3比特优先级)、DEI(1比特丢弃优先级)、VID(12比特VLAN编号)。这12比特决定了VLAN号的取值范围是0到4095,不过实际可用的是1到4094,0和4095有特殊含义,配置的时候也尽量避开。

我整理了一张表,你构造报文之前对照着看:

字段长度含义常见取值
目的MAC6字节目标设备MAC地址00:11:22:33:44:55
源MAC6字节本机或模拟源MAC66:55:44:33:22:11
TPID2字节标签协议标识0x8100
TCI-PCP3比特用户优先级默认0
TCI-DEI1比特丢弃标识默认0
TCI-VID12比特VLAN编号例如100
EtherType2字节上层协议类型0x0800表示IPv4
Payload不定长上层数据自定义填充

这张表的意义在于,你在XCAP界面里看到的每一个输入框,几乎都能在这张表里找到对应关系。理解角度对了,后面一个个填字段就不会晕。

3.2 构造前先画一张字段清单

很多新手上来就在工具里猛点,点完发现报文还是空的,原因就是没有预先想清楚要发什么。我的习惯是:打开XCAP之前,先在草稿纸上写清楚五件事。第一,目的MAC是多少;第二,源MAC是多少;第三,要打几个VLAN标签,VID分别是多少;第四,上层协议是IPv4还是IPv6或者干脆是裸二层数据;第五,payload里想放什么内容。

假如我要模拟一台服务器向交换机发送属于VLAN 100的ICMP请求,我的清单会写成这样:目的MAC 00:11:22:33:44:55,源MAC 66:55:44:33:22:11,TPID 0x8100,VID 100,EtherType 0x0800,IP源地址192.0.2.10,IP目的地址192.0.2.20,ICMP报文内容随便填一段十六进制数据。

有了这份清单,你在XCAP里的工作就变成了“把草稿纸上的内容搬进界面”,而不是一边想一边试。实测下来,这样做的效率高很多,而且字段不容易漏。尤其是后面要发双标签QinQ报文时,没有清单的话,内外层VID填反了是非常常见的事。

4. 实测:XCAP一步步发出第一条带VLAN的报文

4.1 第一步:新建报文模板并选择帧格式

打开XCAP 1-3-7之后,主界面左侧是报文模板列表,右侧是帧结构配置区。点击新建模板按钮,输入一个你认得出来的名字,比如“VLAN100_Test”。

然后选择一个基础帧格式。这里的关键点:我们要自己控制VLAN标签,所以帧格式选择Ethernet II而不是802.3原始帧。虽然802.3也能加Tag,但Ethernet II在工具里操作起来更直观,EtherType字段直接暴露在外面,你后面插入VLAN标签时逻辑也更顺畅。

选完帧格式后,界面里会出现一条标准的以太网帧结构树:目的MAC、源MAC、EtherType、数据。有些版本可能还默认带了一个IPv4模板,不用管它,我们先把底层结构里的这些字段都填对。双击目的MAC输入框,填入你计划里的目的MAC。双击源MAC,填入模拟的源MAC。如果找不到输入框,多半是界面折叠了,点字段前面的小箭头展开就行。

4.2 第二步:把VLAN标签塞进正确的位置

这是整个教程的核心步骤。在XCAP里,插入VLAN标签的动作通常是在EtherType字段附近做操作。现在EtherType这一行位于源MAC之后,它目前显示的是0x0800或者0x0000,取决于你选了什么模板。我们要在它之前插入一个4字节的VLAN字段。

具体操作是:在EtherType字段上右键,菜单里选择“插入VLAN标签”,或者点击工具栏里的“插入802.1Q”按钮。不同小版本的按钮位置可能有细微差别,但逻辑都一样:XCAP会在源MAC和EtherType之间生成一个VLAN字段,并把原来的EtherType自动后移。

插入之后,你会看到这个VLAN字段下面又拆出了几个子字段:TPID、PCP、DEI、VID。把TPID填成8100,这是标准值,一般来说不需要改。VID填成100,PCP按需填,测试场景下填0就够了。如果你需要模拟高优先级流量,可以把PCP改成5或7,但注意那是3比特,最大7,别填成8。

还有一个容易忽略的点:插入VLAN标签后,原始的EtherType字段值不要忘了确认。如果它本来是0x0000,你后面要发的是IPv4报文,就得把它改成0x0800。说实话,这个字段如果忘了改,报文发出去虽然带着VLAN标签,但对端根本不知道上层是什么,直接丢包。

4.3 第三步:配置网卡参数并开始发送

报文内容构造完毕后,进入发送界面。首先要选择发送用的物理网卡。界面上通常有一个下拉列表,会列出你机器上所有的网络适配器。千万不要选择虚拟回环接口,那个接口无法真正把带VLAN标签的帧送到线缆上。选好物理网卡之后,如果软件提示“该网卡不支持原始套接字发送”之类的错误,先不要慌,最常见的原因是权限不够,重新以管理员身份运行通常就能解决。

发送模式一般有三种:单次发送、循环发送、突发发送。第一次验证建议选择单次发送,点一下“发送”按钮,就发一帧出去。这样方便结合Wireshark逐帧核对内容。等你确认帧结构完全正确,再切到循环发送或者突发发送,去测设备在高频率下的处理能力。

发送参数里有一个容易被忽略的选项是“发送速率”。XCAP默认可能会以最大速率发,这在连续发送时会让CPU占用很高,甚至导致系统假死。我的建议是,如果你只是验证连通性,把发送间隔设置在10毫秒以上;如果是压力测试,则按需设置为较高的速率,但先小范围跑一下看看机器扛不扛得住。

4.4 用实时抓包确认报文真的带上了标签

到了验证环节。B机Wireshark里,你先开启抓包,过滤规则填vlan。然后回到A机的XCAP,点击单次发送。你会在B机的抓包列表里看到一条新出现的帧,它的Protocol列可能会显示为802.1Q,甚至直接显示为“VLAN”相关字样。

点开这条帧,展开Ethernet字段,你应该能看到类似这样的结构:目的MAC、源MAC、802.1Q Virtual LAN。在802.1Q Virtual LAN这一层里,就有你填的VID值。如果你看到VID是100,说明整个发送链路已经完全通了。

细心的读者可能会发现,帧长度比标准以太网帧多出了4字节,这是因为VLAN Tag本身就是额外插入的4字节。这属于正常现象,802.1Q标准允许帧长度因为Tag而增长。至于校验和字段,XCAP一般会自动计算,Wireshark如果提示“校验和错误”,检查一下网卡是否开启了校验和卸载,这类问题在第6章里详聊。

5. 再深入一点:双标签与循环发送的实际应用

5.1 双标签报文的构造与验证

单层VLAN标签会发之后,双标签QinQ也要会,因为很多运营商网络和服务商接入场景里,报文会带两层标签,外层叫公网标签,内层叫私网标签。XCAP里插入第二层标签的操作和第一层类似:在已经存在的VLAN标签字段上继续右键,再次选择插入VLAN标签,工具会把新的标签插在更靠近源MAC的位置,也就是外层。

构造双标签时最重要的是保持顺序概念。二层帧里的字段顺序是:目的MAC、源MAC、外层VLAN Tag、内层VLAN Tag、EtherType、Payload。外层TPID经常被配置成0x88a8(运营商桥接协议),而内层TPID保持0x8100。有些场景也会两个都填0x8100,这取决于你要模拟的网络环境。

验证的时候,在Wireshark过滤栏输入vlan,你会看到这个帧下面列着两个802.1Q标签层。用鼠标逐层展开,就能确认外层VID和内层VID是否和你设置的一致。我实测中遇到最多的问题就是内外层顺序填反,解决办法就是回到第三步里说的字段清单,先把两个VID写在纸上,再照着填。

5.2 循环发送与批量模拟的真实场景

当你已经确认单帧完全正确,就可以考虑连续发送了。比如你想验证交换机在收到大量VLAN 100的广播包时会不会出现MAC地址表异常,可以用循环发送模式,把目的MAC设置成全F的广播地址,把VID保持在100,然后以一个固定的速率连续发几百帧。

这里有个操作细节:XCAP的发送按钮旁边通常会有一个发送计数设置。你可以先设成100帧,观察设备的CPU占用和Wireshark接收到的帧数是否一致。循环发送时如果Wireshark里有些帧没抓到,先不要怀疑XCAP丢包,检查一下抓包电脑的网卡是否开启了混杂模式,以及Wireshark的缓冲设置是否够大。

批量模拟还有一个技巧:把同一个报文模板复制多份,每个模板只改VID,例如复制出VLAN100、VLAN200、VLAN300三个模板,然后在XCAP里按顺序循环发送。这样可以模拟多VLAN业务并存的场景,对验证设备非常有用。

6. 常见问题速查与避坑心得

6.1 抓包看不到VLAN标签,问题多半出在网卡

这是我在评论区被问得最多的一个问题:明明在XCAP里填了VID,发送也提示成功,但Wireshark里抓到的帧就是没有VLAN标签。问题十有八九出在网卡的VLAN卸载功能上。

很多现代网卡驱动默认开启了VLAN硬件处理,也就是说系统在发送报文时,如果发现这个帧带了802.1Q标签,会先把标签扒掉,在硬件层面处理完再发;接收时又是反过来的。这样一来,你从应用层发出的原始帧里的VLAN标签,可能在到达物理线路之前就被网卡驱动“聪明”地处理掉了。

解决办法是到网卡的高级设置里,找到类似“VLAN ID”“VLAN stripping”“VLAN offload”的选项,把它关掉,或者设为0(表示不处理)。不同网卡的叫法不一样,而且这项设置在Windows上藏得比较深。我把排查路径贴出来:打开设备管理器,找到当前用的网卡,右键属性,切换到高级选项卡,在属性列表里逐个翻,看到带VLAN的选项就仔细看看描述,凡是跟卸载、剥离、offload相关的,都停用掉。

6.2 对端设备根本不认这个报文

如果抓包能看到帧,接口抓到了VLAN标签,但你的对端设备就是没反应,那就得从报文本身的正确性去排查。首当其冲的是TPID字段,有些设备强制要求外层标签的TPID是0x88a8,尤其在高等级交换机互联场景里,你发一个0x8100的帧,设备可能直接就归类为“不支持的标签类型”。

另一个隐蔽的问题是上层协议类型。很多人只关注VLAN标签,却忘了把原始EtherType改成实际携带的协议。如果你发的payload是IPv4数据包,但EtherType还停留在0x0000,那对端设备将这个帧解析为未知类型并丢弃,也是很正常的事。

如果设备还是没有响应,可以用Wireshark自带的校验和检查功能,看看报有没有报错。如果你的网卡开启了发送侧的TCP或IP校验和卸载,XCAP计算好的校验和可能在网卡层被重新计算,两边算法不一致就会出问题。稳妥起见,在测试环境里把网卡的校验和卸载也关掉,让报文带上XCAP原始计算的值,这样排查最干净。

6.3 发送成功率与工具使用心得

我再分享几个实操中总结的小技巧。第一,发包的电脑尽量用有线千兆网卡,无线网卡基本不适合做这个,它的驱动对原始帧的支持非常差。第二,如果你要连续大批量发包,XCAP运行时间长了偶尔会出现界面卡顿,这时候试着把发送速率降低一点,人不能和机器硬扛。第三,不要把配置好的报文模板随手删了,在XCAP里把它们按项目分门别类保存好,下次测试直接加载,能省不少时间。

最后还想提一个容易被忽略的点:如果你在Windows防火墙开了高防御模式,XCAP的原始套接字访问可能被拦截。实测的时候把防火墙对XCAP的访问权限放行,或者在测试网络环境里临时关闭防火墙,不然你可能会看到“发送失败”或者“句柄无效”这类让人摸不着头脑的报错。这与安全设置有关,不属于工具本身的问题。

这个系列的第一篇就到这里,核心就是一条:先在脑子里把802.1Q的每个字段理清楚,然后打开XCAP照着填,最后用Wireshark确认。步骤其实非常简单,真正花时间的反而是踩坑之后去查网卡驱动设置的过程。下一篇我打算继续聊XCAP构造ARP报文和自定义Option字段的技巧,如果你也在用这个工具做网络测试,欢迎一起交流。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进