build-your-own-zerotier:Build your own layer-2 virtual switch in less than 300 lines of code

Build your own layer-2 virtual switch in less than 300 lines of code

分支1Tags0
文件最后提交记录最后更新时间
3 年前
3 年前
3 年前
3 年前
3 年前
3 年前
3 年前
3 年前
3 年前
3 年前

构建自己的Zerotier

简介

实现一个类似于Zerotier的第二层(L2)虚拟私人网络(VPN)或是虚拟交换机。

它模拟了物理交换机的行为,为连接到交换机端口的设备提供以太网帧交换服务。

不同之处在于,这个虚拟交换机的端口可以通过互联网连接全球各地的设备,使得这些设备在操作系统层面看来仿佛处于同一个局域网中。

背景知识

什么是网络交换机?

网络交换机是一种网络硬件,通过使用分组交换技术接收和转发数据,来连接计算机网络上的设备。

网络交换机是多端口的网络桥接器,在OSI模型的数据链路层(第2层)利用MAC地址转发数据。一些交换机还集成了路由功能,在网络层(第3层)也能转发数据,这样的交换机通常被称为三层交换机或多层交换机。

本项目专注于二层交换机,它们识别并转发以太网帧。在转发数据包时,交换机会使用转发表查找与目标地址对应的端口。该表在交换机中通常称为MAC地址表,记录着本地网络中已知的MAC地址及其对应端口。当交换机收到以太网帧时,它会查看转发表中的目标MAC地址所对应的端口,并仅向那个端口转发数据帧,从而实现在局域网内的数据转发。如果目标MAC地址不在表中,交换机会将以太网帧广播到除源端口外的所有端口,以便目标设备响应并更新转发表。

在这个项目中,我们将编写名为VSwitch的程序,作为虚拟交换机来实现以太网帧交换功能。

虚拟网络设备:TAP接口

TAP接口是一种虚拟网络设备,能够模拟物理网络接口,使得操作系统和应用程序可以像对待物理接口一样使用它。TAP接口常用于创建不同计算机之间的虚拟私有网络(VPN),确保公共网络上安全的数据传输。

TAP设备由操作系统的内核实现,看起来像是常规网络接口,应用程序可以像使用普通物理网卡一样使用它。当数据包通过TAP设备发送时,它们被传递给内核中的TUN/TAP驱动程序,再由该驱动程序传送给应用处理。相反,当应用程序发送数据包时,这些包也会通过TUN/TAP驱动程序转发至指定的目标设备或网络。

在本项目中,TAP设备用于连接客户端电脑和虚拟交换机,使客户端电脑与虚拟交换机间能进行数据包转发。

系统架构

  • 由一台服务器(VSwitch)和多个客户端(VPorts)组成

  • 服务器(VSwitch)模拟物理网络交换机的行为,为每个通过VPorts连接到VSwitch的电脑提供以太网帧交换服务。

    • 维护MAC表
      MAC 地址 VPort
      11:11:11:11:11:11 VPort-1
      aa:aa:aa:aa:aa:aa VPort-a
    • 基于MAC表实现以太网帧交换服务
  • 客户端(VPort)模拟物理交换机端口行为,负责在交换机和计算机之间中继以太网帧。

    • VPort有两个端点。
      • 一端通过TAP设备连接到计算机(Linux内核)。
      • 另一端通过UDP套接字连接到VSwitch。
    • 负责在计算机(Linux内核)和VSwitch之间中继数据包。
      计算机的Linux内核 <==[TAP]==> (以太网帧)<==[UDP]==> VSwitch
      
  • 架构图

        +----------------------------------------------+
        |                   VSwitch                    |
        |                                              |
        |     +----------------+---------------+       |
        |     |            MAC Table           |       |
        |     |--------------------------------+       |
        |     |      MAC       |      VPort    |       |
        |     |--------------------------------+       |
        |     | 11:11:11:11:11 |   VClient-1   |       |
        |     |--------------------------------+       |
        |     | aa:aa:aa:aa:aa |   VClient-a   |       |
        |     +----------------+---------------+       |
        |                                              |
        |           ^                       ^          |
        +-----------|-----------------------|----------+
            +-------|--------+     +--------|-------+
            |       v        |     |        v       |
            | +------------+ |     | +------------+ |
            | | UDP Socket | |     | | UDP Socket | |
            | +------------+ |     | +------------+ |
            |       ^        |     |        ^       |
            |       |        |     |        |       |
            |(以太网帧)   |     |(以太网帧)   |
            |       |        |     |        |       |
      VPort |       v        |     |        v       | VPort
            | +------------+ |     | +------------+ |
            | | TAP Device | |     | | TAP Device | |
            | +------------+ |     | +------------+ |
            |       ^        |     |        ^       |
            +-------|--------+     +--------|-------+
                    v                       v
      -------------------------   -------------------------
      计算机A的Linux内核   计算机B的Linux内核
    

源代码

  1. vswitch.py: VSwitch 的代码
  2. vport.c: VPort 的代码

如何构建

只需运行

make

如何部署

环境准备

  • 具有公网IP的服务器,用于运行VSwitch
  • 至少两台客户端,运行VPort连接至VSwitch,构成虚拟专用网络
  • 假设公网IP为 SERVER_IP,服务器端口号为 SERVER_PORT

步骤1. 运行VSwitch

在具有公网IP的服务器上:

python3 vswitch.py ${SERVER_PORT}

步骤2. 在客户端-1上运行和配置VPort

  • 运行VPort
    sudo ./vport ${SERVER_IP} ${SERVER_PORT}
    
  • 配置TAP设备
    sudo ip addr add 10.1.1.101/24 dev tapyuan
    sudo ip link set tapyuan up
    

步骤3. 在客户端-2上运行和配置VPort

  • 运行VPort
    sudo ./vport ${SERVER_IP} ${SERVER_PORT}
    
  • 配置TAP设备
    sudo ip addr add 10.1.1.102/24 dev tapyuan
    sudo ip link set tapyuan up
    

步骤4. 连通性测试

  • 从客户端-1ping客户端-2
    ping 10.1.1.102
    
  • 从客户端-2ping客户端-1
    ping 10.1.1.101
    

演示视频

https://github.com/peiyuanix/build-your-own-zerotier/assets/11792595/7e4db7a5-88a5-4181-8d5f-dd861e9a040c

项目介绍

在不超过300行的代码中,构建您自己的二层虚拟交换机。【此简介由AI生成】

定制我的领域