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
相关推荐
xywww16813 小时前
大模型 API 选型实战:GPT、Gemini、Claude 接入时该看哪些指标?
运维·服务器·人工智能·python·gpt·langchain
sdghterhd18 小时前
WebSocket 快速入门教程(附示例源码)
网络·websocket·网络协议
夜雪一千18 小时前
Python enumerate() 函数完整详解:遍历同时获取索引,告别手动计数
服务器·windows·python
能有时光19 小时前
PyTorch KernelAgent 源码解读 ---(4)--- ExtractorAgent
人工智能·pytorch·python
xy345319 小时前
Wireshark捕获过滤器——语法元素详解
网络·测试工具·渗透测试·wireshark
_Jimmy_19 小时前
Python 协程库如何使用以及有哪些使用场景
python
aqi0020 小时前
15天学会AI应用开发(十七)使用LangGraph实现会话记忆功能
人工智能·python·大模型·ai编程·ai应用
第一程序员20 小时前
Rust Agent 子进程执行:Command 之前,先定义输入和超时
python·rust·github
DLYSB_20 小时前
生命通道:如何用 HIS 医疗系统直连网络声光终端,打造“零延误”的危急值响应网关?
java·网络·数据库·报警灯
skywalk816320 小时前
设计并实现段言的 C FFI 绑定机制 @Trae
c语言·开发语言·python·编程