0.前言
前面写了两篇关于MPTCP的文章:
- 《链路聚合技术——多路径传输Multipath TCP(MPTCP)快速实践》
- 《使用MPTCP+BBR进行数据传输,让网络又快又稳》
对MPTCP有了基本的了解与实践,并在虚拟的网络拓扑中实现了链路带宽的叠加。
1.OpenMPTCProuter简介
在现网场景中,实现链路聚合并不会像我之前写的文章中那样,直接用裸linux机器当做链路聚合路由器,而是更倾向于使用更轻量级且专业的路由器系统来运行MPTCP,比如大名鼎鼎的OpenWRT。
而OpenMPTCProuter就是OpenWRT+MPTCP的最佳实践。
其官网地址为:http://www.openmptcprouter.com/
在OpenMPTCProuter的官网中也有关于它的详细介绍,且所有源码均已开源(向Ysurac大神致敬)。
如仅需使用OpenMPTCProuter,可直接下载OpenMPTCProuter官方已编译好的镜像,下载地址为:https://www.openmptcprouter.com/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_FEED_URL和OMR_FEED_SRC替换为自己仓库的地址和分支。
再指定对应的编译平台类型,并执行编译命令进行编译:
OMR_TARGET=“x86_64” OMR_FEED_SRC=“master” OMR_KERNEL=“6.12” ./build.sh
如编译成功,则会输出如下信息:
如编译失败,可在编译参数后指定单线程并输出详细日志信息
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目录中
运行时,再根据自己的需要挑一个适合的镜像文件运行即可。
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文件。
再打开VMware,选择创建新的虚拟机,选择稍后安装操作系统。
操作系统选择为:其他Linux 5.x 内核64位。
之后再添加一个硬盘,(如有其他硬盘可以先删除),选择使用现在磁盘,将磁盘文件选择为之前下载解压后的vmdk文件。
之后启动虚拟机:
输入用户名root进入系统。
我这里的网络模式选择的为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
重启之后测试一下:
与NAT网关可达性正常。
再试一下在web浏览器中访问:http://192.168.81.3/
输入默认用户名:root,默认无密码
可访问到OpenMPTCPRouter的WEB界面,运行成功。
5.OpenMPTCProuter聚合效果演示
OMR支持的功能众多,异地组网方面也已经内置了WireGuard。
链路聚合方面主要使用的是支持MPTCP的工具+VPS实现的。
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的实际链路聚合功能,可以参考笔者的此拓扑:
其中的限速使用linux中自带的tc工具实现,如果IP地址为内网IP则还需要对OMR中的bypass策略进行调整,以禁止绕过vps节点。
相关排查命令:
#查看omr中当前bypass规则
uci show omr-bypass
#查看当前策略
nft list ruleset
最后再来一张我在验证omr时,实现双接口链路聚合时的截图:
从OMR的监控面板中实现了两个接口的流量分担,并达到了500+500=1000的链路聚合效果。
详细的配置部分篇幅较多,这里不再详细展开。
如在OMR搭建调试过程中遇到问题,可留言交流~