FreeBSD bridge快速起步

2025年我在构建 Studio 采用了一台组装 纳斯NASSE C246 ITX主板 台式机,主要是原因能够达到静音和节能的目的。这个 纳斯NASSE C246 ITX主板 虽然是一个杂牌主板,但是集成了4个 Intel I226-V 2.5Gbps 以太网卡 ,这是我非常注重的一个服务器特性:

  • 我期望使用 Linux/FreeBSD 来构建软件定义网络(SDN),实现高速交换路由网络

  • 构建开源的网络流量监控和解析

底层Host操作系统采用FreeBSD,最基本的 Bridge (Switch) 是内置功能,最初我在 bhyve快速起步 已经实现了一个简单的Bridge提供给虚拟机使用,这样虚拟机就可以通过 tap 设备连接到生成的 bridge 再连接到某个物理网卡,就能够通过物理网卡连接外部世界。

这个 bridge 是一种通用交换网络设备,对于物理接口也是一视同仁,所以我们可以用这个内置的 bridge 为连接到FreeBSD主机的不同接口网络交换功能。现在在这里,我们从头梳理完整的交换网络配置过程:

内核模块加载

  • 交换网络(bridge/switch)的内核模块是 if_bridge.ko ,可以通过命令行加载内核模块(需要持久化则需要配置 /boot/loader.conf ):

加载内核模块 if_bridge (其他3个内核模块用于支持虚拟化)
kldload vmm
kldload nmdm
kldload if_tap
kldload if_bridge
  • 需要配置 /boot/loader.conf 确保加载这个 if_bridge 模块(这里其他模块是为了虚拟机,虚拟机也是连接到这个bridge,如果只是物理网络交换,则不需要虚拟化相关模块):

配置启动时自动加载 if_bridge 内核模块支持交换机功能(其他3个内核模块用于支持虚拟化)
echo 'vmm_load="YES"' >> /boot/loader.conf
echo 'nmdm_load="YES"' >> /boot/loader.conf
echo 'if_tap_load="YES"' >> /boot/loader.conf
echo 'if_bridge_load="YES"' >> /boot/loader.conf

创建网桥和将网络接口设备添加到网桥

备注

我的实践是混合了虚拟化(tap设备)以及真实的物理网卡接口( igcX Intel I226-V 2.5Gbps 以太网卡 ),所以:

  • 涉及到 tapX 设备命令和配置是为了支持 bhyve(BSD hypervisor)

  • 如果不需要虚拟化支持,则仅添加和 igcX 相关配置或命令

  • (这步仅在虚拟化环境需要)在 /etc/sysctl.conf 中配置tap设备在操作系统启动时启动:

配置tap设备启动
echo "net.link.tap.up_on_open=1" >> /etc/sysctl.conf
sysctl net.link.tap.up_on_open=1
  • 通过命令来创建网桥,并将虚拟网卡(tap设备)和物理网卡(igcX)连接到这个bridge上,实现了完整到交换网络通讯(完成后就可以将物理网络设备连接到FreeBSD的网卡接口上,测试网络联通,包括虚拟机的网络联通)

创建网桥并连接(虚拟和物理)网卡
# 创建tap设备
ifconfig tap0 create
# 创建多个tap设备,分别对应不同虚拟机内部虚拟网卡,规划为每个vm一个虚拟网卡设备,这里案例我一共添加了3个tap设备
ifconfig tap1 cteate
ifconfig tap2 cteate

# 创建 bridge0
ifconfig bridge0 create

# 网桥重命名为 igc0bridge
ifconfig bridge0 name igc0bridge
ifconfig igc0bridge up

# 可以连续使用 addm 添加多个设备到网桥,也可以拆分成一次addm一个设备
# 添加tap虚拟网卡设备连接到bridge
ifconfig bridge0 addm tap0 addm tap1 addm tap2
# 一共有4个Intel i226-v 2.5Gbps网卡,都配置到一个bridge上联通网络
ifconfig bridge0 addm igc0 addm igc1 addm igc2 addm igc3

# 现在虚拟网络和物理网卡接口就已经实现了完全的交换网络(平面型),可以测试网络连通性了
  • 为了实现配置持久化,对应修改 /etc/rc.conf :

/etc/rc.conf 中配置
# 创建网桥以及用于虚拟机的tap虚拟网络设备
cloned_interfaces="bridge0 tap0 tap1 tap2"
# 重命名网桥
ifconfig_bridge0_name="igc0bridge"
# 将物理网卡(4个igcX)和虚拟网卡(tapX)连接到网桥上
ifconfig_igc0bridge="inet 192.168.7.201/24 addm igc0 addm igc1 addm igc2 addm igc3 addm tap0 addm tap1 addm tap2 up"
# 设置默认网关
defaultrouter="192.168.7.101"
# 激活物理网卡
ifconfig_igc0="up"
ifconfig_igc1="up"
ifconfig_igc2="up"
ifconfig_igc3="up"

现在就可以测试虚拟机( bhyve快速起步 )以及连接到物理网卡的设备互相网络连通性

参考