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设备在操作系统启动时启动:
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快速起步 )以及连接到物理网卡的设备互相网络连通性