链路聚合路由器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.pswp.cn/bicheng/93768.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI时代企业转型指南:用AI降本增效,销售转化翻3倍,获客成本砍一半!

AI时代,大部分企业每天都在问同一个问题:AI到底能帮我做什么?无论你是做电商、做IP、做操盘手,还是传统企业老板,你都会发现一个现实——AI真正的用途是用来在业务场景里直接降本增效的。对我个人来说,AI已…

【牛客刷题】最大公约数与最小公倍数:算法详解与实现

文章目录 一、题目介绍 1.1 输入描述 1.2 输出描述 1.3 示例(含详细注释) 二、考察的知识点 三、算法设计思路 3.1 最大公约数(GCD) 3.2 最小公倍数(LCM) 四、流程图 五、题解实现 六、复杂度分析 七、关键算法知识点 一、题目介绍 计算两个整数的**最大公约数(GCD)和最小公…

将 iPhone 联系人转移到 Infinix 的完整指南

从 iPhone 切换到 Infinix 设备是一次令人兴奋的升级,但在切换过程中,转移个人数据(尤其是联系人)可能会有些棘手。联系人是任何手机上最重要的信息类型之一,如果在切换过程中丢失它们,会带来很大的不便。由…

Clipboard.js 复制内容

插件地址 clipboard.js 中文网 安装 npm install clipboard --save使用示例 <template><div><div class"copyBtn" click"copyText">复制文本</div ></div> </template><script> // 引入clipboard.js import…

蛇形方阵构造

给出方阵的长宽&#xff0c;n 和 m &#xff0c;按照斜着的蛇形输出该方阵 面试官给的送分题裸模拟&#xff0c;写的太慢了没过&#xff0c;实际确实慢&#xff0c;结束后起码用了一个多小时才调完 找了下没找到leetcode 提交的地方&#xff0c;各种oj 倒是有&#xff0c;不过是…

传统方式部署(RuoYi-Cloud)微服务

实验环境192.168.10.43和192.168.10.44内存不能小于4G一、安装MySQL&#xff08;192.168.10.46&#xff09;1、安装MySQL依赖库dnf -y install ncurses-compat-libs2、上传mysql-8.0.42-linux-glibc2.17-x86_64-minimal.tar.xz二进制包到/root目录&#xff0c;解压并移动到指定…

Linux网络服务(一)——计算机网络参考模型与子网划分

文章目录前言一、分层思想1.1 分层的基本概念1.2 点到点与端到端通信的区别二、OSI参考模型2.1 OSI七层模型的结构2.2 各层功能示例&#xff08;以QQ为例&#xff09;2.3 单工&#xff0c;半双工和全双工2.4 OSI七层模型总结三、TCP/IP模型3.1 TCP/IP四层与五层模型3.2 TCP/IP协…

Elasticsearch全文检索中文分词:IK分词器详解与Docker环境集成

目录一、IK分词器介绍与选择1. IK分词器详细介绍1.1 基本概念1.2 核心功能1.3 适用场景2. 如果不使用IK分词器&#xff0c;有哪些替代方案&#xff1f;2.1 默认分词器的局限性2.2 替代方案及对比2.3 示例&#xff1a;Ngram Tokenizer配置3. 如何选择分词器&#xff1f;3.1 决策…

实用软件推荐

作者给大家推荐两个软件&#xff1a;typedown,typora typedown在microsoft上即可下载&#xff0c;免费 如果有更多的需求建议下载typora,typora为付费软件 typora官网&#xff1a;typora官网 typedown下载&#xff1a;typedown下载 作者曾经发布的一些以"md"为后…

地图导航怎么测?

地图导航的测试需要结合功能验证、性能评估和场景模拟等多维度方法,以下是基于行业标准和实践的系统化测试方案: 一、核心测试维度与方法 (一)功能测试:覆盖导航全流程 1、基础功能验证 路线规划:输入起点 / 终点后,验证系统是否能生成最短、最快或避开拥堵的路线,并…

力扣70:爬楼梯

力扣70:爬楼梯题目思路代码题目 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 思路 首先我们先列出来前几个台阶的答案从第一个开始&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;5。…

CoRL 2025|隐空间扩散世界模型LaDi-WM大幅提升机器人操作策略的成功率和跨场景泛化能力

内容源自计算机科研圈在机器人操作任务中&#xff0c;预测性策略近年来在具身人工智能领域引起了广泛关注&#xff0c;因为它能够利用预测状态来提升机器人的操作性能。然而&#xff0c;让世界模型预测机器人与物体交互的精确未来状态仍然是一个公认的挑战&#xff0c;尤其是生…

Rust 入门 生命周期-next2 (十九)

生命周期消除实际上&#xff0c;对于编译器来说&#xff0c;每一个引用类型都有一个生命周期&#xff0c;那么为什么我们在使用过程中&#xff0c;很多时候无需标注生命周期&#xff1f;例如&#xff1a;fn first_word(s: &str) -> &str {let bytes s.as_bytes();f…

Three.js 动画循环学习记录

在上一篇文章中&#xff0c;我们学习了Three.js 坐标系系统与单位理解教程&#xff1a; Three.js 坐标系系统与单位理解教程 接下来我们要学习的是Three.js 的动画循环 一、动画循环基础原理 1. 什么是动画循环&#xff1f; 动画循环是连续更新场景状态并重新渲染的过程&am…

ktg-mes 改造成 Saas 系统

ktg-mes 改造成 Saas 系统 快速检验市场&#xff0c;采用最简单的方案&#xff0c;即添加表字段 截止2025年8月16日上传的ktg-mes搭建存在一些问题&#xff0c;搭建可看文章&#xff1a; 搭建ktg-mes 改造 1. 添加租户表 create table sys_tenant (tenant_id bigint au…

【新手易混】find 命令中 -perm 选项的知识点

find 命令是 Linux/Unix 系统中强大的文件查找工具&#xff0c;广泛用于根据文件名、类型、时间、权限等条件搜索文件。其中&#xff0c;-perm 选项用于按文件权限查找文件&#xff0c;而在 -perm /mode 中出现的斜杠 / 是一种特殊的语法&#xff0c;表示“按位或&#xff08;O…

gdb的load命令和传给opeocd的monitor flash write_image erase命令的区别

问&#xff1a; "monitor flash write_image erase ${workspaceFolder}/obj/ylad_led_blink.elf", 和 "load", "executable" : "${workspaceFolder}/obj/ylad_led_blink.elf", 的区别&#xff1f;答&#xff1a; 你提到的 "monit…

1. Docker的介绍和安装

文章目录1. Docker介绍核心概念核心优势与虚拟机的区别一句话总结2. Docker的安装Windows 10/11 安装 Docker Desktop&#xff08;推荐 WSL2 方式&#xff09;Linux&#xff08;以 Ubuntu / Debian 系为例&#xff09;Docker 是一个开源的容器化平台&#xff0c;它允许开发者将…

fastdds.ignore_local_endpoints 属性

Fast DDS 的 fastdds.ignore_local_endpoints 属性用于控制同一 DomainParticipant 下的本地端点&#xff08;即 DataWriter 和 DataReader&#xff09;是否自动匹配。以下是对该功能的详细解释&#xff0c;并翻译为中文&#xff0c;结合其上下文、实现原理和使用场景&#xff…

华清远见25072班C语言学习day11

重点内容:函数&#xff1a;定义&#xff1a;返回值类型 函数名(参数列表) { //函数体 }函数的参数列表中可以有多个数据返回值&#xff1a;如果函数没有返回值可以写成void 返回值的作用&#xff0c;函数的结果用来返回给主调函数的&#xff0c;如果主调函数处不需要函数的结果…