当前位置: 首页 > ops >正文

链路聚合路由器OpenMPTCProuter源码编译与运行

0.前言

前面写了两篇关于MPTCP的文章:

  • 《链路聚合技术——多路径传输Multipath TCP(MPTCP)快速实践》
  • 《使用MPTCP+BBR进行数据传输,让网络又快又稳》

对MPTCP有了基本的了解与实践,并在虚拟的网络拓扑中实现了链路带宽的叠加。

1.OpenMPTCProuter简介

在现网场景中,实现链路聚合并不会像我之前写的文章中那样,直接用裸linux机器当做链路聚合路由器,而是更倾向于使用更轻量级且专业的路由器系统来运行MPTCP,比如大名鼎鼎的OpenWRT。

OpenMPTCProuter就是OpenWRT+MPTCP的最佳实践。

openmptcprouter
其官网地址为:http://www.openmptcprouter.com/

在OpenMPTCProuter的官网中也有关于它的详细介绍,且所有源码均已开源(向Ysurac大神致敬)。

如仅需使用OpenMPTCProuter,可直接下载OpenMPTCProuter官方已编译好的镜像,下载地址为:https://www.openmptcprouter.com/download

omr-download
x86、arm、香蕉派、树莓派等各个版本的都有,按需所取就行。

2.OpenMPTCProuter源码编译

但有时,我们需要在OpenMPTCProuter(OMR)的基础上进行一些二次开发,这时就需要采用源码编译的方式构建出OpenMPTCProuter的镜像包了。

关于OMR的编译文章网上不多,通过笔者的实践在本文中记录一下。

其编译步骤可以参考OMR仓库中的自动化脚本:workflows/main.yml

我们根据脚本中的内容可以提取出如下关键信息:

OMR_KERNEL: [6.6, 6.12]runs-on: ubuntu-latestsudo apt-get updatesudo apt-get install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch unzip zlib1g-dev lib32gcc-s1 libc6-dev-i386 subversion flex uglifyjs git-core gcc-multilib p7zip p7zip-full msmtp libssl-dev texinfo libglib2.0-dev xmlto qemu-utils upx libelf-dev autoconf automake libtool autopoint device-tree-compiler python3-pyelftools llvm clangOMR_KERNEL="${OMR_KERNEL}" OMR_FEED_SRC="${SOURCE_NAME}" sh build.sh prepare {tools,toolchain}/install -j$(nproc) || OMR_KERNEL="${OMR_KERNEL}" OMR_FEED_SRC="${SOURCE_NAME}" sh build.sh prepare {tools,toolchain}/install -j1 V=s

提取出关键信息:

  • 在最新的ubuntu系统中运行,当前时间是2025/8/5,目前最新的ubuntu-LTS版本为:ubuntu24.04
  • 执行apt-get 更新,并安装所需依赖
  • 指定OpenMPTCProuter(OMR)的内核版本,并执行build.sh脚本开始编译

详细也可参考OMR官方wiki中的说明:Create-image-for-unsupported-platform

在编译的过程中,build.sh会自动拉取https://github.com/Ysurac/openmptcprouter-feeds仓库的代码,而对OMR的二次开发也主要是对openmptcprouter-feeds中代码的修改,所以在编译自己的源码时,需要在build.sh中对其进行调整:

omr-github
将这里的OMR_FEED_URLOMR_FEED_SRC替换为自己仓库的地址和分支。

再指定对应的编译平台类型,并执行编译命令进行编译:

OMR_TARGET=“x86_64” OMR_FEED_SRC=“master” OMR_KERNEL=“6.12” ./build.sh

如编译成功,则会输出如下信息:
omr-build
如编译失败,可在编译参数后指定单线程并输出详细日志信息

OMR_TARGET=“x86_64” OMR_FEED_SRC=“master” OMR_KERNEL=“6.12” ./build.sh -j1 V=s

编译成功的镜像文件位于:openmptcprouter/x86_64/6.12/source/bin/targets/x86/64目录中

omr-build-files
运行时,再根据自己的需要挑一个适合的镜像文件运行即可。

3.OpenMPTCProuter镜像运行(windows系统)

这里以在windows上的虚拟机运行OMR为例,使用的镜像文件为:x86-64-generic-ext4-combined-efi.vmdk.gz

如:

VMware ext4 image (EFI): openmptcprouter-v0.62-6.6-r0+28431-92e020b50f-x86-64-generic-ext4-combined-efi.vmdk.gz (2025/03/13 - 79.90Mo - sha256sum)

之后解压成vmdk文件。

omr-zip
再打开VMware,选择创建新的虚拟机,选择稍后安装操作系统。
操作系统选择为:其他Linux 5.x 内核64位。

之后再添加一个硬盘,(如有其他硬盘可以先删除),选择使用现在磁盘,将磁盘文件选择为之前下载解压后的vmdk文件。

omr-install-vm
之后启动虚拟机:
start-omr
输入用户名root进入系统。
view-vm-network
我这里的网络模式选择的为NAT模式,NAT网关IP为192.168.81.2。
虚拟机的详细网络可在VMware的虚拟网络编辑器中查看。

4.OpenMPTCProuter基本配置

OpenMPTCPRouter启动后不会自动获取IP地址,需要再手动设置一下。

以要将OMR的管理地址设置为192.168.81.3为例,输入以下命令:

uci set network.lan.proto='static'
uci set network.lan.ipaddr='192.168.81.3'
uci set network.lan.netmask='255.255.255.0'
uci set network.lan.gateway='192.168.81.2'
uci commit network
/etc/init.d/network restart

重启之后测试一下:

test-network-gateway
与NAT网关可达性正常。

再试一下在web浏览器中访问:http://192.168.81.3/

输入默认用户名:root,默认无密码
omr-web
可访问到OpenMPTCPRouter的WEB界面,运行成功。

5.OpenMPTCProuter聚合效果演示

OMR支持的功能众多,异地组网方面也已经内置了WireGuard。
链路聚合方面主要使用的是支持MPTCP的工具+VPS实现的。
omr-interfaces
OMR与vps建立mptcp连接,对于一些比较复杂的场景,还可以实现OMR与VPS流量的动态路由、负载均衡、策略分流等高级功能。

官网中对这部分也有一些说明:

If you have a router with enough CPU power, in System->OpenMPTCProuter, wizard tab, “Advanced settings” checkbox you can choose ……

关于OMR的vps详细安装与配置过程这里不详细展开,可参考:Install-or-update-the-VPS。

想要体验OMR的实际链路聚合功能,可以参考笔者的此拓扑:

omr-test-topo

其中的限速使用linux中自带的tc工具实现,如果IP地址为内网IP则还需要对OMR中的bypass策略进行调整,以禁止绕过vps节点。

相关排查命令:

#查看omr中当前bypass规则
uci show omr-bypass
#查看当前策略
nft list ruleset

最后再来一张我在验证omr时,实现双接口链路聚合时的截图:

link-agg-omr
从OMR的监控面板中实现了两个接口的流量分担,并达到了500+500=1000的链路聚合效果。

详细的配置部分篇幅较多,这里不再详细展开。

如在OMR搭建调试过程中遇到问题,可留言交流~

http://www.xdnf.cn/news/18104.html

相关文章:

  • 【Day 30】Linux-Mysql数据库
  • vue的双向数据绑定
  • 【DL学习笔记】损失函数各个类别梳理
  • Go并发编程-goroutine
  • Docker小游戏 | 使用Docker部署文字风格冒险网页小游戏
  • 【计算机视觉与深度学习实战】05计算机视觉与深度学习在蚊子检测中的应用综述与假设
  • wait / notify、单例模式
  • TDengine `count_window` 指定列计数功能用户手册
  • 密码管理中随机数安全修复方案
  • 【金融数据分析】用Python对金融产品价格进行时间序列分解
  • JVM 面试精选 20 题
  • MyCAT完整实验报告
  • 音频分类模型笔记
  • 集成电路学习:什么是Face Detection人脸检测
  • CentOS 7.9 部署 filebrowser 文件管理系统
  • 动态规划:入门思考篇
  • 【完整源码+数据集+部署教程】海洋垃圾与生物识别系统源码和数据集:改进yolo11-RVB
  • 第一阶段C#基础-15:面向对象梳理
  • nsfp-
  • 《Unity Shader入门精要》学习笔记二
  • 多数据源 Demo
  • python 数据拟合(线性拟合、多项式回归)
  • WPF 打印报告图片大小的自适应(含完整示例与详解)
  • quic协议与应用开发
  • 实战架构思考及实战问题:Docker+‌Jenkins 自动化部署
  • [Oracle数据库] Oracle 进阶应用
  • 基于 ONNX Runtime 的 YOLOv8 高性能 C++ 推理实现
  • 网络间的通用语言TCP/IP-网络中的通用规则2
  • CMakeLists.txt 学习笔记
  • Java中的128陷阱:深入解析Integer缓存机制及应对策略