slacr_

Just to record my life and thoughts.
笔记/编程/杂乱/极简

[Python]基于Scapy和PyQt5的Sniffer

Jan 19, 2024Network1535 words in 10 min

网络协议分析实验作业

实验环境

Win11 虚拟机:Ubuntu22.04、ovs2.17.8、python3.10.2、scapy、PyQt5、libreport

VxLAN

关于VxLAN

传统的二层网络技术VLAN中使用VLAN tag域中的12bit作为VLAN ID仅能划分4096个相互隔离的虚拟二层网络, 无法满足大二层网络中隔离大量租户的需求。为实现数据中心虚拟机跨设备的灵活迁移,VxLAN 引入VxLAN ID标识 网络,占24bit,可以划分1600万个相互隔离的二层网络, 满足了大型数据中心的需求。并且VxLAN使用 MAC in UDP 的隧道封装方式, 可以实现原始二层报文在IP网络中的透明传输。

VXLAN(Virtual Extensible LAN)是一种网络虚拟化技术,用于扩展现有的以太网技术,以提供更大的可用网络地址空间和跨物理网络的虚拟隔离。
VXLAN 在数据中心网络中广泛应用,特别是在云计算环境中,以解决传统以太网的扩展性和虚拟化隔离的限制。
VXLAN 使用 24 位的虚拟网络标识符(VNI)来标识虚拟网络。它通过在现有的 IP 网络上封装以太网帧,使用 UDP 封装,在物理网络上传输虚拟网络流量。

VXLAN 技术的主要优点包括:

扩展性:VXLAN 提供了 16,777,216(2^24)个虚拟网络标识符(VNI),使得网络可以支持更多的虚拟网络。
隔离性:VXLAN 允许在共享物理网络上创建多个虚拟网络,实现虚拟机之间的逻辑隔离。
灵活性:VXLAN 可以在不修改物理网络的情况下部署,通过在现有 IP 网络上封装以太网帧,使得它适用于现有的网络基础设施。
兼容性:VXLAN 可以与现有的网络设备和协议兼容,包括以太网交换机、路由器和 IP 网络。

VxLAN本地网络搭建

使用VMware创建两个虚拟机,在每台虚拟机中创建两个网桥,一个作为控制层面一个作为数据平面,控制器平面的网桥利用eth0接口实现互通,而数据平面的网桥通过VxLAN实现互通。

配置主机 h1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
ovs-vsctl show
# 删除自带网桥
# ovs-vsctl del-br <br_name>

# 创建网桥br0和br1。其中br1作为控制层面的网桥,br0作为数据层面的网桥
ovs-vsctl add-br br0
ovs-vsctl add-br br1

# 将eth0接口挂接到网桥br1上
ovs-vsctl add-port br1 eth0
ovs-vsctl show

# 将eth0的IP赋给br1,确保两个云主机在控制层面是能够通信的
ifconfig eth0 0 up
ifconfig br1 192.168.128.11/24 up

# 为br0配置一个IP
ifconfig br0 50.0.0.2/24 up

# 查看此时主机1的网卡信息
ifconfig | more

主机h2的配置方式与h1基本一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建网桥br0和br1。其中br1作为控制层面的网桥,br0作为数据层面的网桥
ovs-vsctl add-br br0
ovs-vsctl add-br br1

# 将eth0接口挂接到网桥br1上
ovs-vsctl add-port br1 eth0
ovs-vsctl show

# 将eth0的IP赋给br1,确保两个云主机在控制层面是能够通信的
ifconfig eth0 0 up
ifconfig br1 192.168.128.22/24 up

# 为br0配置一个IP
ifconfig br0 50.0.0.3/24 up

# 查看此时主机2的网卡信息
ifconfig | more

测试控制层面连通性, 登录主机1,向主机2发送6个ping包,ping网桥br1的IP。

1
ping -c 6 192.168.128.11

测试两个主机数据层面的连通性。登录主机1,向主机2发送6个ping包,ping网桥br0的IP。目前两个主机的数据层面无法通信

搭建隧道让两个云主机的数据层面也能够通信, 登录主机1,创建VxLAN。远端IP设置为主机2中br1的IP。

1
2
ovs-vsctl add-port br0 port0 -- set interface port0 type=vxlan options:remote_ip=192.168.128.22
ovs-vsctl show

登录主机2,创建VxLAN。远端IP设置为主机1中br1的IP。

1
2
ovs-vsctl add-port br0 port0 -- set interface port0 type=vxlan options:remote_ip=192.168.128.11
ovs-vsctl show

在主机2启动tcpdump,并且利用-i参数指定监听网口,此处监听eth0

1
tcpdump -i eth0

登录主机1,再次测试两个云主机数据层面的连通性。验证VxLAN是否起作用。可以看出创建VxLAN后主机数据层面之间也连通了。

查看主机2抓包结果。可以看出主机数据层面通过VxLAN隧道实现通信

使用 Scapy 和 PyQt5 实现 Sniffer

关于 pcap 格式

"pcap"是Packet Capture(数据包捕获)的缩写。它是一种用于捕获和分析网络数据包的标准文件格式和库。pcap文件格式是一种用于存储网络数据包捕获的二进制文件格式,它可以被多种网络分析工具和协议分析器所使用。

libpcap是一个常用的网络数据包捕获库,使用C语言编写,用于在Linux系统上进行网络数据包捕获和分析, 前文使用的tcpdump底层就是libpcap库。

WinPcap 是一个用于在 Windows 系统上进行网络数据包捕获的库,使用C++编写。从win10开始,微软已引入Npcap(Winpacp的一个分支)。

Pcapy 是基于libpcap的Python接口。
Scapy 是一个强大的python网络数据包处理库。

实现

https://github.com/s1acr/net-sniffer

  • Author:

    slacr_

  • Copyright:

  • Published:

    January 19, 2024

  • Updated:

    January 19, 2024

Buy me a cup of coffee ☕.

1000000