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

链路聚合路由器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.dtcms.com/a/337157.html

相关文章:

  • 如何在 Ubuntu 24.04 安装 Python 3.12 ?
  • SpringAI集成MCP
  • 详细探讨AI在金融、医疗、教育和制造业四大领域的具体落地案例,并通过代码、流程图、Prompt示例和图表等方式展示这些应用的实际效果。
  • 【金融数据分析】用Python对金融产品价格进行时间序列分解
  • MySQL的锁:
  • Python入门第9课:面向对象编程(OOP)从零开始,类、对象与三大特性
  • Leetcode 3650. Minimum Cost Path with Edge Reversals
  • Vue Router的常用API有哪些?
  • 05 定时器,延时器、递归、内置对象(Object 对象+Math 对象+Date 对象+String对象)
  • Less (CSS 预处理器)
  • 8.18网络编程——基于UDP的TFTP文件传输客户端
  • 后端通用基础代码
  • 电源电路介绍
  • OpenTelemetry、Jaeger 与 Zipkin:分布式链路追踪方案对比与实践
  • 窗口看门狗(WWDG)
  • 网络基础——协议认识
  • Linux权限的学习
  • 抽象类与接口的区别
  • 【C语言篇】操作符详解
  • Ubuntu下无法在huggingface下载指定模型的解决方法
  • Read Frog:一款开源AI浏览器语言学习扩展
  • 如何解决IDEA/Datagrip无法连接数据库的问题:解决方法为添加参数-Djava.net.preferIPv4Stack=true
  • Java原子类详解
  • 并发编程原理与实战(二十四)Java并发基石LockSupport park/unpark机制全解析
  • 车e估牵头正式启动乘用车金融价值评估师编制
  • AI出题人给出的Java后端面经(十八)(日更)
  • Java基础八股复习3 jvm-内存结构
  • 数据仓库理论
  • 具身智能2硬件架构(人形机器人)摘自Openloong社区
  • Vue3 中使用 Element Plus 完整指南