新闻  |   论坛  |   博客  |   在线研讨会
在ubuntu14.04上实现收发VLAN(802.1Q)帧
hawkdtw | 2016-04-14 13:52:04    阅读:252   发布文章

关键词 :
AVB, 802.1Q, VLAN, scapy,python,pycharm,uBuntu

目的:测试中需要测试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。



参与讨论
登录后参与讨论
推荐文章
最近访客