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
相关推荐
2301_780789662 小时前
跨平台适配!SDK 游戏盾兼容全终端游戏场景
java·网络·ddos
第九序言T3 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
2501_915106323 小时前
抓包抓到乱码或压缩字节怎么解析,TraceEagle五种查看模式和一键解码
网络协议·计算机网络·网络安全·ios·adb·https·udp
Java后端的Ai之路3 小时前
CAS并发控制-从CPU指令到企业级乐观锁
vue.js·人工智能·python·cas·乐观锁
qq_426003963 小时前
UI自动化高频次登录login限流解决方案
python·ui·自动化
情 九3 小时前
MCP 实战 06:把 HTTP 接口接成工具,让 AI 帮你查数据
人工智能·网络协议·http·mcp
Sakura_j_h_3 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
星融元asterfusion4 小时前
工业网络升级实战:100G 双轨 Leaf-Spine 架构破解高并发出货网络瓶颈
网络·架构·spine
Da Da 泓4 小时前
五子棋 Web 端测试用例报告
前端·网络·websocket·网络协议·测试用例·项目
quantdash_cc4 小时前
如何验证历史行情的交易日期是否完整覆盖研究区间?
python·数据分析·pandas·量化交易·股票数据·quantdash