如何将多个Internet连接合并为一个?


23

我的PC总共有4个NIC,2个有线千兆以太网网卡以及2个无线网卡。(一个具有专有驱动程序的Broadcom和具有开源软件的Ralink,这比Broadcom更好。)

我的手机可以将其连接无线共享到我的PC,但是我也具有有线Internet连接。因此,我具有多个Internet连接以访问Internet。如何将2个或更多连接合并在一起并平衡它们,以享受一种统一的Internet体验,这是与之连接的所有Internet连接的总和。

例如,如果我有一台调制解调器,它的Internet连接为1024kB / s,另一台提供512kB / s的调制解调器,另一台提供128kB / s的调制解调器,则在负载平衡并合并所有连接(绑定或​​成组)后,可以在以下位置下载以全部3个Internet连接为例,其速度为1664kB / s。

这个问题一直令我着迷。


5
似乎超出了Ask Ubuntu的范围:)这是相当复杂的网络工作。IMO很少值得这么做,因为当您考虑到由于链路断开(甚至是暂时性的)而丢失的数据包,由于某些链路的速度比其他链路慢而重新排序数据包时,等等。我不知道会做一个“黑匣子”解决方案,这可能是一个有趣的项目。

9
好了,问题在于是否可以在ubuntu中完成此操作,如果可以,如何进行。
Luis Alvarado

我在单个PC帖子2个Internet连接中创建了一个答案。链接文档以在Ubuntu中绑定。
Lucio

@Lucio我可以将问题标记为重复,也可以将答案移至此处,然后将其标记为已接受。您还需要为13.04发行时做好准备,因为它将在Network Manager中包含绑定选项(目前仅有线绑定从属)。
Luis Alvarado

Answers:


11

我在使用Ubuntu 11.04的工作中做了类似的事情。我们运行Shorewall防火墙配置工具,该工具除了表现出色外,还提供了一些基本的ISP路由工具,这些工具可能会满足您的需求。您可以在此处找到有关它的一些文档:http : //www.shorewall.net/MultiISP.html

归结为,您不能为单个连接使用多个ISP ...事情不是那么简单。最好的办法是尝试在不同的提供程序之间平均分配新的连接。

这是一个复杂的问题。在调试完所有问题之前,您可能最终会撞到墙上(我当然做到了)。因此,正如其他张贴者所建议的那样,您可能应该明智地仔细考虑您的愿望有多强烈。


好的链接。非常好的教程。
路易斯·阿尔瓦拉多

让我们也看到这一点: debuntu.org/2006/02/23/...
Postadelmaga

8

您可以使用将ifenslave从属网络接口附加和分离到绑定设备的程序包来实现。

  1. 安装:

    sudo apt-get install ifenslave
    
  2. 负载绑定内核模块

    sudo modprobe bondingle
    
  3. 配置界面:

    sudo vi /etc/network/interfaces
    

    配置示例,将eth0和eth1合并为绑定接口的从属:

    #eth0 is manually configured, and slave to the "bond0" bonded NIC
    auto eth0
    iface eth0 inet manual
    bond-master bond0
    
    #eth1 ditto, thus creating a 2-link bond.
    auto eth1
    iface eth1 inet manual
    bond-master bond0
    
    # bond0 is the bonded NIC and can be used like any other normal NIC.
    # bond0 is configured using static network information.
    auto bond0
    iface bond0 inet static
    address 192.168.1.10
    gateway 192.168.1.1
    netmask 255.255.255.0
    # bond0 uses standard IEEE 802.3ad LACP bonding protocol 
    bond-mode 802.3ad
    bond-miimon 100
    bond-lacp-rate 1
    bond-slaves none
    
  4. 重新启动网络:

    sudo restart networking
    
  5. 上/下界接口:

    ifup bond0
    ifdown bond0
    

    我们使用几种绑定模式作为示例:

    bond-mode active-backup
    

    主动备份绑定方式说明

    主动备份策略:绑定中只有一个从节点处于活动状态。当且仅当活动的从站发生故障时,其他从站才变为活动状态。绑定的MAC地址在外部仅在一个端口(网络适配器)上可见,以避免混淆交换机。此模式提供容错能力。主要选项会影响此模式的行为。

    • 所有绑定模式的描述

    Ubuntu社区帮助Wiki上的源代码和更多信息。

绑定意味着将多个网络接口(NIC)组合到单个链路,以提供高可用性,负载平衡,最大吞吐量或它们的组合。资源


+1是我提出问题的原因之一。仍将等待创建虚拟网络主连接的方法,该连接是所有从(实际)连接的总和。最新内核版本中提供了诸如绑定之类的功能。
路易斯·阿尔瓦拉多

2
-1-绑定在第2层上运行时在LAN中起作用。问题是有关两个独立WAN的负载平衡
gertvdijk 2012年

@gertvdijk我不同意检查我的更新答案以发现绑定也可以实现负载平衡。
pl1nk 2012

1
@ pl1nk这是同一L2网络中两个NIC的第2层负载平衡。这与多ISP负载平衡不同!
gertvdijk 2012

3
@ pl1nk我的最后评论。显然,这个问题涉及多个独立的宽带连接。虽然它们可以是一个ISP,这不会改变在残疾层2来处理这
gertvdijk

6

这个问题有点老了,但是如果您仍然想知道..

有两种典型的情况,其中gertvdijk和pl1nk在答案之一中争论了什么:

您有一台具有2个公用IP(2个不同的ISP)的计算机,并连接到另一台主机(例如,数据中心中的服务器具有胖管道,该胖管道大于计算机的两个ISP连接的总带宽)。因此,您通过2个连接建立到主机的绑定连接,然后主机(服务器)通过其自己的Internet连接为您的流量提供服务。在这种情况下,您可以在单个连接的两个方向上获得几乎100%的组合带宽。

这是绑定/组合/链接聚合的特殊情况,其中多个第2层(同一网络)接口连接在一起。通过在从计算机到主机的每个ISP接口上建立VPN层2(tap)连接并将它们绑定在一起(循环模式)以具有单个接口,可以实现此目的。在这种情况下的限制因素是每个ISP连接到主机的延迟(ping)有多大不同。它们越相似和稳定,就越好。我们在其中一个安装中使用了它,效果很好。如果您想了解有关实施方法的详细信息,请告诉我。

然后,另一种情况是没有中间主机,即从您的ISP接口到世界各地各种Web服务器的直接连接。在这种情况下,最好的办法是在接口之间平均分配传出连接-即一个TCP会话完全通过一个ISP,第二个会话通过另一个ISP等。之所以如此,是因为当您建立TCP连接时,它具有每个数据包的原始IP地址和目标IP地址,并且当服务器从另一个未进行TCP握手的IP接收数据包时,它会将该数据包视为错误数据包并将其丢弃。由于每个ISP连接都有其自己的公用IP,因此对于同一TCP会话,您不能通过一个连接从一个IP发送一个数据包,而不能通过另一个连接与另一个IP的另一个连接发送数据包。

对于单台计算机,您将无法获得与第一种方案一样高的总带宽利用率,但是对于小型办公室,这可能是一个很好的解决方案。您可以做一点扩展来实现针对特定协议的自定义解决方案。例如,您可能在网关(可能是同一台计算机)上具有某种用于http下载的代理,并要求一个巨大的文件的不同部分通过不同的ISP接口建立不同的TCP会话。在这种情况下,最终的下载率将接近组合带宽的100%。就像将ReGet,GetRight和类似的下载程序卸载到网关一样。Google“ HTTP 206部分内容”。对于这种情况,我不知道有任何现成的开源解决方案,但是有一些硬件设备可以做到这一点:google'


哇!您的答案的第一部分正是我要寻找的。我在具有Ubuntu和快速连接的云中有一台服务器。而我在这里可以拥有的唯一互联网连接是300kbps的3G网络。您能否提供更多有关如何实现答案第一部分的信息,以便我可以购买许多3G软件狗并计划提高连接速度?
华孚

2
echo "bonding" >> /etc/modules echo -e "alias bond* bonding\noptions bonding max_bonds=10 mode=2 xmit_hash_policy=layer3+4 arp_interval=100 arp_ip_target=10.0.0.1" > /etc/modprobe.d/bonding.conf
阿纳托利

1
并将所有分流接口束缚到此绑定:用以下方法 echo "+tapX " >> /sys/class/net/bond0/bonding/slaves 检查其状态: cat /proc/net/bonding/bond0 在此阶段,所有Internet流量都应通过bond0流到数据中心中的服务器。在那里,您应该设置路由: echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf sysctl -p /etc/sysctl.conf iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE (eth0应该是互联网iface)
Anatoli

1
这种绑定配置(mode = 2 xmit_hash_policy = layer3 + 4)将使每个新连接基于哈希(根据连接所涉及的IP和端口计算)mod iface编号通过不同的底层VPN iface。更多信息:kernel.org/doc/Documentation/networking/bonding.txt。实际上,这更像是我的答案中的第二种解决方案,这是因为您需要非常相似的(非常低的抖动和相同的带宽)底层连接才能使轮询绑定正常工作(否则您将获得很多数据包重新排序),并且您说您的连接是3G。
阿纳托利

1
@Huafu,要获得第一个解决方案,只需更改绑定选项而不是mode=2 xmit_hash_policy=layer3+4y指定mode=0(请参阅链接@ kernel.org),但首先请检查3G链接的相似性。如果它们的ping时间相差超过2-3ms或抖动超过1ms,您将有很多数据包重新排序,从而有效降低了聚合链路的速度。您必须使用netstat -s(查找重传)和iperf -s/ 检查汇总的链接统计信息iperf -c <server_ip> -d。首先检查每个链接的性能,然后我们可以继续解决
Anatoli 2015年

0

我遇到了类似的问题..我对先生提出的第一种情况下的解决方案方法非常感兴趣。GTH和Anatoli,如果可能的话,我非常想请您布置基本的配置和脚本,以测试第一种情况中描述的配置。

现在,我使用此实用程序使用组合的tun / tap接口(它不是绑定,在答案#8中进行了解释)通过不同的ISP提供程序配置了vpn连接:

Net-ISP-Balance由Lincoln D. Stein

在两个或多个ISP之间平衡Internet连接的负载,以提高带宽和可靠性

项目主页:https//lstein.github.io/Net-ISP-Balance/

此程序包使您可以在两个或多个ISP之间平衡家庭或小型企业Internet连接的负载。您可以将其与连接到两个ISP的单个主机一起使用,或者在路由器/防火墙计算机上使用,以平衡整个LAN的负载。网络流量在两个ISP连接之间是平衡的,以增加上载和下载容量,并且如果一个ISP发生故障,其他ISP将自动接管。

带宽在每个连接级别上分配。这意味着您将看不到任何特定下载或速度基准上的合计带宽,但是当同时进行多个数据传输时(例如,当家庭中有几个人正在播放电影时),您将看到好处。此外,诸如BitTorrent之类的多连接文件传输协议将看到负载平衡的好处。

这是一个基于Perl的实用程序,用于在Linux中管理路由和iptables,非常适合我们的目的,实际上,首先为所有提供程序创建一个路由表,然后在提供程序之间平均分配所有LAN流量,以了解该实用程序的工作原理,建议考虑一个3 isp + 1 lan的小例子(测试配置)

 #cat /etc/network/balance.conf
 ##service    device   role     ping-ip           
 CABLE3       enp0s3   isp      10.0.2.2
 CABLE8       enp0s8   isp      10.0.3.2
 CABLE9       enp0s9   isp      10.0.4.2
 LAN          enp0s10  lan                        

 #cat /etc/network/interfaces
auto enp0s3
allow-hotplug enp0s3
iface enp0s3 inet dhcp

auto enp0s8
allow-hotplug enp0s8
iface enp0s8 inet dhcp

auto enp0s9
allow-hotplug enp0s9
iface enp0s9 inet dhcp

auto enp0s10
allow-hotplug enp0s10
iface enp0s10 inet static
    address 192.168.1.1/24

#Now work Net-ISP-Balance utility:

## Including rules from /etc/network/balance/pre-run/pre-run-script.pl ##
## Finished /etc/network/balance/pre-run/pre-run-script.pl ##
echo 0 > /proc/sys/net/ipv4/ip_forward
ip route flush all
ip rule flush
ip rule add from all lookup main pref 32766
ip rule add from all lookup default pref 32767
ip route flush table  2
ip route flush table  1
ip route flush table  3
ip route add  10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add  10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add  10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add  0.0.0.0/0 dev enp0s10 src 
ip route add default scope global nexthop via 10.0.4.2 dev enp0s9 weight 1 nexthop via 10.0.3.2 dev enp0s8 weight 1 nexthop via 10.0.2.2 dev enp0s3 weight 1
ip route add table 2 default dev enp0s3 via 10.0.2.2
ip route add table 2 10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add table 2 10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add table 2 10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add table 2 0.0.0.0/0 dev enp0s10 src 
ip rule add from 10.0.2.15 table 2
ip rule add fwmark 2 table 2
ip route add table 1 default dev enp0s8 via 10.0.3.2
ip route add table 1 10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add table 1 10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add table 1 10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add table 1 0.0.0.0/0 dev enp0s10 src 
ip rule add from 10.0.3.15 table 1
ip rule add fwmark 1 table 1
ip route add table 3 default dev enp0s9 via 10.0.4.2
ip route add table 3 10.0.2.0/24 dev enp0s3 src 10.0.2.15
ip route add table 3 10.0.3.0/24 dev enp0s8 src 10.0.3.15
ip route add table 3 10.0.4.0/24 dev enp0s9 src 10.0.4.15
ip route add table 3 0.0.0.0/0 dev enp0s10 src 
ip rule add from 10.0.4.15 table 3
ip rule add fwmark 3 table 3
## Including rules from /etc/network/balance/routes/01.local_routes ##
# enter any routing commands you might want to go in
# for example:
# ip route add 192.168.100.1 dev eth0 src 198.162.1.14

## Finished /etc/network/balance/routes/01.local_routes ##
## Including rules from /etc/network/balance/routes/02.local_routes.pl ##
## Finished /etc/network/balance/routes/02.local_routes.pl ##
iptables -F
iptables -t nat    -F
iptables -t mangle -F
iptables -X
iptables -P INPUT    DROP
iptables -P OUTPUT   DROP
iptables -P FORWARD  DROP

iptables -N DROPGEN
iptables -A DROPGEN -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "GENERAL: "
iptables -A DROPGEN -j DROP

iptables -N DROPINVAL
iptables -A DROPINVAL -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "INVALID: "
iptables -A DROPINVAL -j DROP

iptables -N DROPPERM
iptables -A DROPPERM -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "ACCESS-DENIED: "
iptables -A DROPPERM -j DROP

iptables -N DROPSPOOF
iptables -A DROPSPOOF -j LOG -m limit --limit 1/minute --log-level 4 --log-prefix "DROP-SPOOF: "
iptables -A DROPSPOOF -j DROP

iptables -N DROPFLOOD
iptables -A DROPFLOOD -m limit --limit 1/minute  -j LOG --log-level 4 --log-prefix "DROP-FLOOD: "
iptables -A DROPFLOOD -j DROP

iptables -N DEBUG
iptables -A DEBUG  -j LOG --log-level 3 --log-prefix "DEBUG: "
iptables -t mangle -N MARK-CABLE3
iptables -t mangle -A MARK-CABLE3 -j MARK     --set-mark 2
iptables -t mangle -A MARK-CABLE3 -j CONNMARK --save-mark
iptables -t mangle -N MARK-CABLE8
iptables -t mangle -A MARK-CABLE8 -j MARK     --set-mark 1
iptables -t mangle -A MARK-CABLE8 -j CONNMARK --save-mark
iptables -t mangle -N MARK-CABLE9
iptables -t mangle -A MARK-CABLE9 -j MARK     --set-mark 3
iptables -t mangle -A MARK-CABLE9 -j CONNMARK --save-mark
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate NEW -m statistic --mode random --probability 1 -j MARK-CABLE9
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate NEW -m statistic --mode random --probability 0.5 -j MARK-CABLE8
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate NEW -m statistic --mode random --probability 0.333333333333333 -j MARK-CABLE3
iptables -t mangle -A PREROUTING -i enp0s10 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i enp0s3 -m conntrack --ctstate NEW -j MARK-CABLE3
iptables -t mangle -A PREROUTING -i enp0s3 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i enp0s8 -m conntrack --ctstate NEW -j MARK-CABLE8
iptables -t mangle -A PREROUTING -i enp0s8 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -i enp0s9 -m conntrack --ctstate NEW -j MARK-CABLE9
iptables -t mangle -A PREROUTING -i enp0s9 -m conntrack --ctstate ESTABLISHED,RELATED -j CONNMARK --restore-mark
iptables -A INPUT  -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A INPUT -d 127.0.0.0/8 -j DROPPERM
iptables -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT   -p tcp --tcp-flags SYN,ACK ACK -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK ACK -j ACCEPT
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROPFLOOD
iptables -A INPUT   -i enp0s10 -s 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT  -o enp0s10 -d 0.0.0.0/0  -j ACCEPT
iptables -A OUTPUT  -o enp0s10 -d 255.255.255.255/32  -j ACCEPT
iptables -A OUTPUT  -p udp -s 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD  -i enp0s10 -o enp0s3 -s 0.0.0.0/0 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT   -o enp0s3                 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD  -i enp0s10 -o enp0s8 -s 0.0.0.0/0 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT   -o enp0s8                 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD  -i enp0s10 -o enp0s9 -s 0.0.0.0/0 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT   -o enp0s9                 ! -d 0.0.0.0/0 -j ACCEPT
iptables -A OUTPUT  -j DROPSPOOF
iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp0s8 -j MASQUERADE
iptables -t nat -A POSTROUTING -o enp0s9 -j MASQUERADE
## Including rules from /etc/network/balance/firewall/01.accept ##
## This file contains iptables statements that add additional firewall rules

# allow incoming domain packets -- needed for DNS resolution
iptables -A INPUT   -p udp --source-port domain -j ACCEPT
# allow incoming NTP packets -- needed for net time protocol
iptables -A INPUT   -p udp --source-port ntp -j ACCEPT
## Finished /etc/network/balance/firewall/01.accept ##
## Including rules from /etc/network/balance/firewall/01.accept.pl ##
iptables -A INPUT -p tcp -s 0.0.0.0/0 --syn --dport ssh -j ACCEPT
## Finished /etc/network/balance/firewall/01.accept.pl ##
## Including rules from /etc/network/balance/firewall/02.forward.pl ##
iptables -A FORWARD -p udp --source-port domain -d 0.0.0.0/0 -j ACCEPT
iptables -A FORWARD -p udp --source-port ntp    -d 0.0.0.0/0 -j ACCEPT
## Finished /etc/network/balance/firewall/02.forward.pl ##
echo 1 > /proc/sys/net/ipv4/ip_forward
## Including rules from /etc/network/balance/post-run/post-run-script.pl ##
## Finished /etc/network/balance/post-run/post-run-script.pl ##

请考虑删除此答案,并添加注释,要求对相应答案进行更多说明。这不是答案。谢谢。
Raffa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.