windows环境下,bmv2虚拟交换机的部署与使用方法

目录

一、前言

  • bmv2(Behavioral Model version 2),是一个开源的软件交换机模拟器,通过bmv2,你可以看到硬件交换机内部是如何处理数据的,是网络工程师和网络开发人员学习和测试的重要工具。
  • 我们平时使用的抓包工具与其它流量分析工具,只能从交换机的接口数据,来间接的分析交换机的内部行为,没有bmv2直观真实。
  • bmv2默认部署在linux平台,但在办公和学习中,大多数人的电脑使用的是windows操作系统,所以,今天我们就说说bmv2在windows10平台的部署与使用方法。

二、windows下部署ubuntu

启用并安装 WSL 2 环境

  • WSL 2(Windows Subsystem for Linux 2)是微软为 Windows 10 和 Windows 11
    用户提供的虚拟化方案,它可以在 Windows 上运行 Linux 。是 Windows 下进行 Linux 开发、容器化部署及 AI
    训练的首选环境。

1、 启用 WSL:

  • 以管理员身份打开 PowerShell 或命令提示符,运行以下命令并重启电脑:

    复制代码
    Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

    2、安装 Ubuntu:

  • 从 Microsoft Store 搜索并安装 "Ubuntu 20.04" 或 "Ubuntu 22.04"。安装完成后启动,并设置用户名和密码。

Ubuntu (WSL) 中安装依赖

  • 在 WSL 终端中,需要先更新软件源并安装 bmv2 所需的编译工具和库。

    复制代码
    sudo apt update
    sudo apt install -y git build-essential cmake libgmp-dev libpcap-dev \
    libboost-all-dev libssl-dev python3 python3-pip

编译与安装 bmv2

1、 克隆代码:

复制代码
```
git clone https://github.com/p4lang/behavioral-model.git
```

2、安装 Python 依赖:

  • 高版本的ubuntu可能启用了保护机制,禁止直接使用 pip3 在系统级安装 Python 包,所以,我们需要在虚拟环境中安装

  • 安装虚拟环境工具:

    复制代码
    sudo apt install python3-venv python3-full -y
  • 在 behavioral-model 目录下创建虚拟环境

    复制代码
    cd ~/behavioral-model
    python3 -m venv venv
  • 激活虚拟环境

    复制代码
    source venv/bin/activate
  • 安装依赖

    复制代码
    sudo apt update
    sudo apt install -y autoconf automake libtool cmake  libgmp-dev libpcap-dev libboost-all-dev libssl-dev  libevent-dev libthrift-dev thrift-compiler libnanomsg-dev

3、编译安装bmv2

  • 生成配置并编译

    复制代码
    ./autogen.sh
    ./configure --enable-debugger
    make -j$(nproc)
    sudo make install
    sudo ldconfig

4、验证安装

  • 退出虚拟环境

    复制代码
    deactivate
  • 检查 simple_switch 是否可用

    复制代码
    simple_switch --version
  • 如果 simple_switch --version 正常输出版本信息,说明安装成功

安装 P4 编译器

1、安装 p4c

  • bmv2 需要由 p4c 编译器生成的 JSON 文件来驱动

  • 确认你的 Ubuntu 版本

    复制代码
    lsb_release -a
  • 克隆 P4c 源码

    复制代码
    git clone --recursive https://github.com/p4lang/p4c.git
  • 编译安装p4c

2、验证p4c安装情况

  • 如果p4c --version 正常输出版本信息,说明安装成功

    复制代码
    p4c --version

bmv2使用方法

1、编写P4程序:

  • bmv2 需要一个 JSON 格式的配置文件,这个文件由 p4c 编译器从 P4 源代码生成。以下是一个实现交换机透传功能的p4程序。可以验证你的 bmv2 环境是否正常。

    复制代码
    #include <core.p4>
    #include <v1model.p4>
    
    header ethernet_t {
        bit<48> dstAddr;
        bit<48> srcAddr;
        bit<16> etherType;
    }
    
    struct metadata { }
    struct headers {
        ethernet_t ethernet;
    }
    
    parser MyParser(packet_in packet, out headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
        state start {
            packet.extract(hdr.ethernet);
            transition accept;
        }
    }
    
    control MyVerifyChecksum(inout headers hdr, inout metadata meta) { apply { } }
    
    control MyIngress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) {
        apply {
            // 直接转发到入端口相反的端口:0->1, 1->0
            if (standard_metadata.ingress_port == 0) {
                standard_metadata.egress_spec = 1;
            } else if (standard_metadata.ingress_port == 1) {
                standard_metadata.egress_spec = 0;
            } else {
                standard_metadata.egress_spec = 9; // drop
            }
        }
    }
    
    control MyEgress(inout headers hdr, inout metadata meta, inout standard_metadata_t standard_metadata) { apply { } }
    control MyComputeChecksum(inout headers hdr, inout metadata meta) { apply { } }
    control MyDeparser(packet_out packet, in headers hdr) {
        apply { packet.emit(hdr.ethernet); }
    }
    
    V1Switch(MyParser(), MyVerifyChecksum(), MyIngress(), MyEgress(), MyComputeChecksum(), MyDeparser()) main;
  • 编译p4文件为json文件

    复制代码
    p4c --target bmv2 --arch v1model --std p4-16 pass.p4 -o pass.json

2、创建虚拟接口:

  • 为了让数据能进出 bmv2 这个"软件 交换机",你需要创建一对虚拟网卡作为连接端口。

    复制代码
    # 创建一对名为 veth0 和 veth1 的虚拟网卡
    sudo ip link add veth0 type veth peer name veth1
    sudo ip link set veth0 up
    sudo ip link set veth1 up

3、启动交换机:运行 simple_switch(bmv2的一个具体实现),加载你写好的P4程序。

  • 使用 simple_switch 命令启动,将虚拟网卡绑定为交换机的端口

    复制代码
    # -i 0@veth0 表示将交换机的端口 0 绑定到 veth0 接口
    # --nanolog 用于指定事件记录器的 IPC 地址
    sudo simple_switch -i 0@veth0 -i 1@veth1 \
        --nanolog ipc:///tmp/bm-log.ipc \
        pass.json

4、打开"观察窗口"开始观察:

  • 事件记录器:打开一个新的终端,运行下面的命令。之后,只要有任何数据包经过交换机,这个窗口就会实时打印出内部处理过程,比如数据包从哪个端口进来、匹配了哪张表、执行了什么动作、又从哪个端口转发出去等。

    复制代码
    sudo nanomsg_client.py --thrift-port 9090
  • 抓包工具:你也可以像监控真实网卡一样,在 veth0 或 veth1 上使用 tcpdump 抓包,从外部观察数据包的原始样子。

    复制代码
    sudo tcpdump -i veth0 -vvv -e

5、发送一个ping包,观察事件记录器

  • 这时候,你应该能在观察窗口中看到数据的处理过程了

    复制代码
    ping -I veth0 192.168.100.2 -c 3
相关推荐
彳亍1011 小时前
WooCommerce 多渠道联盟链接动态追加教程
jvm·数据库·python
TechWayfarer1 小时前
营销数据分析:如何利用IP归属地识别和规避虚假流量
网络·数据库·python·tcp/ip·数据分析
xcbrand1 小时前
新零售品牌策划公司有哪些
大数据·人工智能·python·零售
zh1570231 小时前
mysql如何给用户分配全局权限_合理使用GLOBAL权限层级
jvm·数据库·python
2303_821287381 小时前
HTML怎么配合JavaScript交互_HTML DOM操作入门【指南】
jvm·数据库·python
Cat_Rocky1 小时前
ingress service配置解析
linux·服务器·网络
m0_631529821 小时前
SQL如何简化长SQL子查询结构_利用CTE公用表表达式优化
jvm·数据库·python
小冷爱学习!1 小时前
Apache Shiro 1.2.4 反序列化漏洞Shiro-550(CVE-2016-4437)
服务器·网络·python·安全·网络安全·apache
m0_740352421 小时前
mysql安装完成后如何配置慢查询阈值_mysql日志监控方法
jvm·数据库·python