tyron's page 不断探索是一件好事,学无止境!

在ubuntu14.04上实现收发VLAN(802.1Q)帧的一番折腾

2019-10-16
David

  • 目的:

测试中需要测试7个网卡,独立收、发802.1q的帧。

  • 平台:

不限(目前在Ubuntu 14.04上实现,windows上没有实现)

目前实现的配置:

Ubuntu 14.04+Pycharm Community 2016.1+Python 2.7.6+scapy 2.3.2。 经过一番折腾,终于有结果了。过程很曲折,记录下来,以备以后翻阅。​

阶段1:远离windows

网上查阅,发现scapy可以实现通过网卡收、发帧,需要基于python。

开始是在windows 7上,Eclipse+PyDev,运行时提示:IPv6不支持,而且发现用scapy无法实现收发802.1q的帧。

经过网上查阅,发现该问题从2012年就有人提交了问题,scapy在windows下目前不支持ip v6的相关操作(后来的实现也没有用到ipv6,而是用的ipv4)。

以后预计在scapy 3.0后会修改,会支持windows 10以后版本,windows 7不支持。

不过,不能收发802.1q帧的问题重点其实不在这里,而是windows不支持直接操作网卡。 所以,只好转到Ubuntu。

阶段2:远离windows下的虚拟机

转Ubuntu,第一想法是用虚拟机,我采用了virtualBox虚拟机,安装了Ubuntu14.04LTS。

终端运行python,发现版本是2.7.6,符合要求。

安装scapy。

安装pycharm。

这时,可能会提示需要安装相应版本的JDK,具体安装另见“JDK的安装”。

JDK是必需的,而且相应版本要安装正确,pycham需要JDK 8.

pycharm下编辑python程序:发送802.1Q帧

from scapy.all import *
sendp(Ether(dst='(目标网卡MAC地址)',src='(发送源网卡MAC地址)') /Dot1Q(vlan=1,id=3,prio=2,type=0x22f0))

网卡的MAC地址在windows下可以通过ping命令查到,在Ubuntu下也可以通过ping命令查询到,也可以“系统设置”-“网络”-“有线”-“硬件地址”,直接看到。

另准备一台windows PC,安装wireshark,可以监测ubuntu发出来的802.1q帧。

但是,如果再接一个网卡,我用的是UGREEN的USB2Eth网卡,问题就来了:同一时间只能有一个网卡发送成功。

经过查询,VM中同一时间只能有一个网卡“桥接”方式有效,而我需要同时连接7个网卡呢。

所以,只好抛弃VM。

阶段3:2个网卡Tx帧成功,Rx的帧无VLAN tag

幸好,有台机器是uBuntu,还安装了mate桌面(坑,找不到设置),虽然版本是12.04,经过周末2个多小时的升级过程,升级到了14.04,mate被抹掉了。

添加root用户,重启,登陆。

检查python,版本是2.7.6,够用。

安装scapy,安装JDK。

安装pycharm。

重复前面的帧发送程序,从eth0发送,另一台PC运行wireshark监测,成功。

修改前面的帧发送程序,从eth1发送,另一台PC运行wireshark监测,成功。

pycharm下编辑python程序:接收802.1Q帧

from scapy.all import *
sniff(filter="ether proto 0x8100", prn=lambda x: x.show(), count=1,timeout=20)

运行程序监测接收数据,从另一台PC运行ostinato发送802.1Q数据,发现收到的数据缺少4个VLAN tag字节(0x8100,priority,VLAN ID)。

阶段4:找回缺失的VLAN tag

windows下用wireshark监测数据时,曾经出现过不显示VLAN tag的问题,通过网卡的高级属性,设置“Priority and VLAN tag”为disabled,就可以显示VLAN tag。

还用这个思路,在ubuntu下不知道如何设置网卡属性。

查阅结果发现,是linux kernel把VLAN tag给stripped(移除)了,因为它认为0x8100是标准的,没有人需要该信息,可是我需要呀。

用tcpdump命令发现,监视到0x8100字样的VLAN tag存在。

终于搜到一个帖子(如下,我加了一些安装信息)提示安装pcap或pcappy,因为它们采用和tcpdump同样的方法:重建VLAN tag。


Does anyone know why scapy is unable to capture (parse?) the vlan frame, but tcpdump sees it fine?

Based on RyPeck’s answer and GuyHarris’s advice, I now have a much better workaround:

###a) Using http://sourceforge.net/projects/pylibpcap/ import pcap conf.use_pcap=True

Linux下安装pylibpcap模块
1. 安装libpcap

apt-get install libpcap-dev

2.安装python的dev版,否则安装pylibpcap出错

apt-get install python-dev

3.安装python pcap模块

下载pylibpcap-0.6.2.tar.gz并解压,执行

python setup.py install

4. 去pylibpcap-0.6.2/examples执行测试脚本

python sniff.py eth0 'port80'

###b) Using pcappy - which is can be installed with: pip install pcappy import pcappy as pcap conf.use_pcap=True

Now scapy shows the same vlan information as tcpdump, with all it's great parsing features intact!

安装setuptools
wget https://bootstrap.pypa.io/ez_setup.py -0 - | python easy_install -i https://pypi.python.org/pypi/pcappy pcappy (easy_install pcappy会出错,缺省网址变了)

运行程序准备接收,从另一台PC运行ostinato发送802.1Q数据。

带VLAN tag字节(0x8100,priority,VLAN ID)的帧数据终于被收到了,而且两个网卡都可以正常Tx & Rx了。

总结:

  1. scapy对windows支持不好,尤其是windows7以下。

  2. windows下很难以administrator权限操作网卡。

  3. VM下只能有一个网卡作用于桥接方式。

  4. 需要pcap或pcappy重建被linux kernel移除的VLAN tag。


Comments

Content