Sleepstars 的记录室

Sleepstars 的记录室

Debian 启用 MPTCP 突破单线程限速

2025-10-19

一、前言

最近遇到了一个很神奇的 VPS 服务商,他们会限制单线程速度,但是并不限制总的速度。同时还会限制 UDP 速度。为了解决这个问题,我盯上了 MPTCP 技术。

MPTCP 的主要作用是它允许单个(划重点)传输连接同时使用多个路径。MPTCP会话从初始子流开始,该子流类似于如上所述的常规TCP连接。设置第一个MPTCP子流后,可以建立其他子流。 每个其他子流也看起来类似于常规的TCP连接,具有SYN握手和FIN拆除功能,但不是单独的连接,而是将子流绑定到现有的MPTCP会话中。这项技术在日常生活中最常见到的其实就是 ”同时使用数据流量和WI-FI” 的功能。MPTCP 可以保证在打散了一个 Connection 之后,包乱序发出,正序到达,确保了数据的正确。

Linux 5.6 后,Kernel 就已经完整支持了全部的 IPv4 IPv6 的 MPTCP 的实现。因此我们可以非常方便地直接在 Debian 13 发行版上实现全部的功能。

二、部署 MPTCP

前提假设

有两台服务器,分别是 A 和 B。二者的 IP 我假设为 1.1.1.1 和 2.2.2.2。同时,二者均使用新版本的 Debian 发行版(RHEL 等 Redhat 的发行版也可以,这里仅测试了 Debian 13),拥有 >=5.6 的 kernel 版本。

内核版本查看可以使用:

uname -r

结果数字比 5.6 大即可:

# 例如博主使用的版本为
6.17.3-x64v3-xanmod1

博主比较推荐使用 xanmod 内核,其默认启用了 bbr3+fq 的 TCP 拥塞控制和队列调优,可以显著提升 TCP 网络性能。你可以参考 Debian 13 更换 Xanmod 内核(采用新版 Deb822)来手动更换。

BBR + FQ 和 TCP 窗口调整(可选)

如果使用的不是 xanmod ,我强烈推荐开启 bbr +fq。你可以参考我的开启,或者自己去网络上搜索。

# 调整方法 A 二选一
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
sudo sysctl -w net.core.default_qdisc=fq
# 调整方法 B 二选一
sudo bash -c 'echo \
"# 99-bbr to boost speed
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr" \
> /etc/sysctl.d/99-bbr.conf' && \
sudo sysctl -p /etc/sysctl.d/99-bbr.conf

同时建议调大 TCP 窗口:

# 放大缓冲
sudo sysctl -w net.core.rmem_max=67108864
sudo sysctl -w net.core.wmem_max=67108864
sudo sysctl -w net.ipv4.tcp_rmem="4096 87380 33554432"
sudo sysctl -w net.ipv4.tcp_wmem="4096 65536 33554432"

开始部署

  1. 安装基础软件包:

sudo apt update
sudo apt install -y iproute2 iperf3 mptcpize
  1. 两端启用 MPTCP:

# A、B 两台都执行
sudo sysctl -w net.mptcp.enabled=1
  1. 在两侧均启用N(少于8个)端口:

# 清理旧端点(可选,干净起步)
sudo ip mptcp endpoint flush

# IP 增加 4 个端点,并用 signal 标记对外公布
sudo ip mptcp endpoint add 1.1.1.1 port 40001 signal
sudo ip mptcp endpoint add 1.1.1.1 port 40002 signal
sudo ip mptcp endpoint add 1.1.1.1 port 40003 signal
sudo ip mptcp endpoint add 1.1.1.1 port 40004 signal
  1. 这一步相当于完成了旧版本 MPTCP 的替换 path_manager 为 ndiffports 的情况。后续可以自动从这四个端口分流。

可以查看是否完成新建:

# 查看生效的端点
sudo ip mptcp endpoint show

如果这几个端口上有防火墙请自行放通。

  1. 放开子流数量

# 无脑设置放开到最大的限制 8,注意不可以超过 8
sudo ip mptcp limits set subflows 8 add_addr_accepted 8
# 查看限制数量
sudo ip mptcp limits show

三、测试连接情况

iperf3 原生并不支持 mptcp 的使用,故在这里我们使用一个上古软件包 mptcpize 将 TCP 流重新包一下,使其强制支持 MPTCP。

在其中一台服务器启用 iperf3 server

mptcpize run iperf3 -s

在另一台服务器启用 iperf3 client

# 8M 大包,反映实际效果
mptcpize run iperf3 -c 2.2.2.2 -P1 -w 8M -t 15

可以看到,相较于最开始的 100Mbps 提升显著。

如果你发现没有提升,使用

ip mptcp monitor

观察是否有正确日志输出。在正常情况下,使用 iperf3 的时候,可以正常看到有相关端口(如果按照我上面的,端口会是 40001~40004)的日志输出。

四、结语

MPTCP 是一个非常好的技术,除了突破单线程限速之外,还有非常多的额外用途,比如高可用,又或者负载均衡等等。

部分参考:

https://www.cnblogs.com/zhijun1996/p/17430244.htmlhttps://zhuanlan.zhihu.com/p/277593169https://blog.boom.si/index.php/archives/424/