You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

双ISP网络下Ubuntu 20.04实现uTorrent负载均衡可行性问询

可行!用双ISP线路提升uTorrent带宽的实现方案

首先得给你掰明白核心逻辑:单个TCP连接只能占用一条线路的带宽,所以没法让一个uTorrent下载任务同时跑满两条线,但我们可以通过负载均衡把多个下载/上传连接分摊到两条ISP线路上,从而整体拉满你的总带宽利用率。下面分两种方案详细说明,适配不同的技术需求:

一、Linux内核级策略路由(轻量无额外软件)

这种方案直接用Ubuntu自带的iproute2iptables实现,适合不想折腾额外软件的场景——核心思路是给不同的连接打标记,让标记过的流量走对应ISP的专属路由表。

步骤1:配置双网卡基础网络

假设你的两个网卡分别是enp0s3(对应ISP1)和enp0s8(对应ISP2),先配置静态IP(用DHCP也可以,但要记好网关和IP地址):

  • 编辑Netplan配置文件(Ubuntu 20.04默认用Netplan):
# /etc/netplan/00-installer-config.yaml
network:
  ethernets:
    enp0s3:
      addresses: [192.168.1.10/24]
      gateway4: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]
    enp0s8:
      addresses: [192.168.2.10/24]
      # 这里千万别设gateway4,不然会出现默认路由冲突
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]
  version: 2

执行sudo netplan apply让配置生效。

步骤2:创建专属路由表

给每个ISP单独建路由表,避免线路互相干扰:

  • 编辑路由表配置文件,添加两行:
# /etc/iproute2/rt_tables
100 isp1
200 isp2
  • 给ISP1添加路由规则(让走isp1表的流量用ISP1的网关):
sudo ip route add default via 192.168.1.1 dev enp0s3 table isp1
sudo ip rule add from 192.168.1.10 table isp1
  • 给ISP2添加同样逻辑的路由规则:
sudo ip route add default via 192.168.2.1 dev enp0s8 table isp2
sudo ip rule add from 192.168.2.10 table isp2

步骤3:用iptables标记流量并分流

我们针对uTorrent的默认端口(6881-6889)做流量标记,把一半流量分给ISP1,一半分给ISP2:

# 标记第1、3、5...个连接为1(走ISP1)
sudo iptables -t mangle -A OUTPUT -p tcp --sport 6881:6889 -m statistic --mode nth --every 2 --packet 0 -j MARK --set-mark 1
# 标记第2、4、6...个连接为2(走ISP2)
sudo iptables -t mangle -A OUTPUT -p tcp --sport 6881:6889 -m statistic --mode nth --every 2 --packet 1 -j MARK --set-mark 2

# 让标记过的流量走对应路由表
sudo ip rule add fwmark 1 table isp1
sudo ip rule add fwmark 2 table isp2

步骤4:配置SNAT(关键!避免回包异常)

因为主机有两个IP,必须让出站流量用对应线路的IP返回,否则会出现“发出去的包找不到回来的路”的问题:

sudo iptables -t nat -A POSTROUTING -o enp0s3 -j SNAT --to-source 192.168.1.10
sudo iptables -t nat -A POSTROUTING -o enp0s8 -j SNAT --to-source 192.168.2.10

二、用HAProxy做透明负载均衡(更灵活,支持故障转移)

如果你需要更智能的流量控制——比如按线路带宽比例分配、自动剔除故障线路,可以用HAProxy。这里我们把HAProxy作为透明代理,让uTorrent的流量通过它分发到两条ISP线路。

步骤1:安装HAProxy

sudo apt update && sudo apt install haproxy

步骤2:配置HAProxy

编辑HAProxy的主配置文件,添加TCP负载均衡规则:

# /etc/haproxy/haproxy.cfg
frontend utorrent_tcp
    bind *:6880  # 监听一个中转端口,让uTorrent连接这个端口
    mode tcp
    default_backend isp_backends

backend isp_backends
    mode tcp
    balance roundrobin  # 轮询分配流量,也可以换成leastconn(最少连接数)策略
    server isp1 192.168.1.1:0 check  # ISP1的网关,:0表示匹配任意端口
    server isp2 192.168.2.1:0 check  # ISP2的网关
    option transparent  # 开启透明代理,让后端能看到uTorrent的真实IP

步骤3:启用内核转发和流量重定向

  • 开启Linux内核的IP转发功能:
sudo sysctl -w net.ipv4.ip_forward=1
sudo echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
  • 用iptables把uTorrent的流量转发到HAProxy的监听端口:
sudo iptables -t nat -A OUTPUT -p tcp --dport 6881:6889 -j REDIRECT --to-port 6880

步骤4:重启HAProxy生效

sudo systemctl restart haproxy
sudo systemctl enable haproxy  # 设置开机自启

关键注意事项

  1. 单个任务无法提速:TCP是面向连接的协议,一个下载任务的所有数据都在同一个TCP连接里,只能走一条线路。要提升总带宽,得同时下载多个任务,或者在uTorrent设置里调高“最大连接数”。
  2. ISP限制要留意:有些ISP会限制BT流量,或者用CGNAT(运营商级NAT)不给公网IP,这种情况下uTorrent的上传和下载速度会受影响,建议先确认两个ISP是否提供公网IP。
  3. 故障转移的补充:用策略路由的话,得自己写脚本检测线路可用性(比如定时ping网关),故障时手动切换路由;用HAProxy的话,check参数会自动检测后端是否可用,故障时自动剔除这条线路。
  4. uTorrent部署位置:如果uTorrent在本机,直接用上面的方案就行;如果在其他主机,需要把那台主机的网关指向你的Ubuntu负载均衡服务器,再在Ubuntu上配置对应的转发和路由规则。

内容的提问来源于stack exchange,提问作者Bazif Rasool

火山引擎 最新活动