简易二层虚拟交换机,基于 TAP 设备实现远程组网(暂未实现身份认证和数据加密传输,不对安全性做保证,请勿用于正式用途)
通过本仓库代码可编译出两个产物 vswitch
和 vport
,对应说明如下:
vswitch
:运行在所有待组网设备均可访问到的设备上,实际处理二层交换的数据转发业务vport
:运行在所有待组网的设备上,创建 TAP 接口并将对应流量发送到vswitch
进行转发
本工具的组网使用场景通常至少涉及三台设备,其中两台设备无法直接通信,但是均可与第三台设备通信。
在该第三台设备上运行 vswitch
,需指定服务绑定的地址和端口,可选设置日志打印等级,如下:
./vswitch -d 2 -i 192.168.123.200 -p 20808
在另外两台可与 vswitch
通信的设备上运行 vport
,需指定待创建的 TAP 设备名、上述远程 VSwitch 的 IP 地址和端口号,可选设置日志打印等级:
sudo ./vport -d 2 -n vtap -i 192.168.123.200 -p 20808
之后在这两台运行 vport
的设备上手动为刚刚创建的 TAP 设备设置同网段的 IP 地址并启用对应网络接口后即可通过 VSwitch 转发跟对方通信:
# PC1 设置 IP 地址并启用接口
sudo ip addr add 192.168.198.10/24 dev vtap
sudo ip link set vtap up
# PC2 设置 IP 地址并启用接口
sudo ip addr add 192.168.198.12/24 dev vtap
sudo ip link set vtap up
# 之后 PC1 和 PC2 之间可以通过上述设置的 IP 地址通信
ping 192.168.198.10
ping 192.168.198.12
基础系统架构图如下,其中 VSwitch 维护了一个转发表,记录各 MAC 地址和 VPort 的对应关系,并根据收到以太网帧的目的地址查询该转发表对数据包进行转发;VPort 通过 UDP Socket 与 VSwitch 建立连接,并将来自本地 TAP 设备的流量发送到 VSwitch 处理:
+----------------------------------------------+
| VSwitch |
| |
| +----------------+---------------+ |
| | Forward Table | |
| |--------------------------------+ |
| | MAC | VPort | |
| |--------------------------------+ |
| | 11:11:11:11:11 | VPort-1 | |
| |--------------------------------+ |
| | 22:22:22:22:22 | VPort-2 | |
| +----------------+---------------+ |
| |
| ^ ^ |
+-----------|-----------------------|----------+
| |
+-------|--------+ +--------|-------+
| v | | v |
| +------------+ | | +------------+ |
| | UDP Socket | | | | UDP Socket | |
| +------------+ | | +------------+ |
| ^ | | ^ |
| | | | | |
|(Ethernet Frame)| |(Ethernet Frame)|
| | | | | |
VPort | v | | v | VPort
| +------------+ | | +------------+ |
| | TAP Device | | | | TAP Device | |
| +------------+ | | +------------+ |
| ^ | | ^ |
+-------|--------+ +--------|-------+
v v
------------------------- -------------------------
Computer A's Linux Kernel Computer B's Linux Kernel