我的电脑一共有 4 个网卡,2 个有线千兆以太网卡,还有 2 个无线网卡。(一个是 Broadcom 的,带专有驱动程序,另一个是 Ralink 的,带开源软件,效果比 Broadcom 好得多。)
我的手机可以无线共享连接到我的电脑,但我也有有线互联网连接。所以我有多个 Internet 连接访问互联网。如何合并 2 个或多个连接并平衡让他们享受统一的互联网体验,即所有连接到它的互联网连接的总和。
例如,如果我有一个互联网连接速度为 1024kB/s 的调制解调器,另一个提供 512kB/s 的调制解调器和一个提供 128kB/s 的小调制解调器,在负载平衡和合并所有连接(绑定或组合)之后,我可以使用这 3 个互联网连接作为一个连接以 1664kB/s 的速度下载。
这个问题一直令我好奇。
答案1
我在工作中使用 Ubuntu 11.04 做过类似的事情。我们运行 Shorewall 防火墙配置工具,它除了工作出色之外,还提供了一些基本的多 ISP 路由工具,可能适合您的需求。您可以在此处找到一些有关它的文档:http://www.shorewall.net/MultiISP.html
但归根结底,您不能使用多个 ISP 进行单个连接……事情没那么简单。您能做的最好的事情就是尝试在不同的提供商之间均匀地引导新连接。
这是一个复杂的问题。在调试完每个问题之前,你很可能会绞尽脑汁(我就是这样的)。所以,正如其他发帖人所建议的那样,你最好仔细考虑一下你的愿望有多强烈。
答案2
ifenslave
您可以使用将从属网络接口附加到绑定设备并从绑定设备分离的软件包来实现此目的。
安装:
sudo apt-get install ifenslave
加载bonding内核模块
sudo modprobe bondingle
配置您的接口:
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
重启网络:
sudo restart networking
启动/关闭有界接口:
ifup bond0 ifdown bond0
我们使用以下几种粘合模式作为示例:
bond-mode active-backup
主备绑定模式说明:
主动备份策略:绑定中只有一个从属设备处于活动状态。当且仅当活动从属设备发生故障时,另一个从属设备才会变为活动状态。绑定的 MAC 地址仅在一个端口(网络适配器)上可见,以避免交换机混淆。此模式提供容错能力。主要选项会影响此模式的行为。
- 描述所有粘合模式。
来源及更多信息Ubuntu 社区帮助维基。
粘合,意味着将多个网络接口(NIC)组合到单个链路,提供高可用性、负载平衡、最大吞吐量或这些的组合。来源
答案3
这是一个有点老的问题,但如果你仍然想知道......
有两种典型的情况,这也是 gertvdijk 和 pl1nk 在其中一个答案中争论的:
您有一台具有 2 个公共 IP(2 个不同的 ISP)的计算机,并且您连接到另一台主机(例如数据中心中的服务器,其带宽大于您计算机的两个 ISP 连接的总带宽)。因此,您通过 2 个连接与主机建立绑定连接,然后主机(服务器)通过其自己的互联网连接为您的流量提供服务。在这种情况下,您可以通过单个连接在两个方向上获得几乎 100% 的总带宽。
这是绑定/组合/链路聚合的一个特殊情况,其中多个第 2 层(同一网络)接口连接在一起。可以通过在从计算机到主机的每个 ISP 接口上建立 VPN 第 2 层(tap)连接并将它们绑定在一起(循环模式)以具有单个接口来实现。此场景中的限制因素是每个 ISP 连接到主机的延迟(ping)有多大差异。它们越相似和稳定越好。我们在我们的一个安装中使用它,效果很好。如果您想了解如何实施它的详细信息,请告诉我。
然后另一种情况不需要中间主机,即从您的 ISP 接口直接连接到世界各地的各种网络服务器。在这种情况下,您能做的最好的事情就是在接口之间均匀分布传出连接 - 即一个 TCP 会话完全通过一个 ISP 进行,第二个会话通过另一个 ISP 进行,依此类推。之所以如此,是因为当您建立 TCP 连接时,它具有每个数据包的来源和目标 IP 地址,并且当服务器从另一个 IP 收到未执行 TCP 握手的数据包时,它会将该数据包视为错误并丢弃。由于每个 ISP 连接都有自己的公网 IP,因此对于同一个 TCP 会话,您不能通过一个连接从一个 IP 发送一个数据包,而通过另一个连接从另一个 IP 发送另一个数据包。
您无法像第一种情况那样在单台计算机上实现较高的总带宽利用率,但对于小型办公室来说,这可能是一个不错的解决方案。您可以稍微扩展一下,即为特定协议实施自定义解决方案。例如,您可以在网关(可以是同一台计算机)上安装某种代理以进行 http 下载,并通过不同的 ISP 接口建立不同的 TCP 会话来请求大文件的不同部分。在这种情况下,最终的下载速率将接近总带宽的 100%。这就像将 ReGet、GetRight 和类似下载程序的工作卸载到网关。谷歌搜索“HTTP 206 部分内容”。我不知道这种情况下有任何现成的开源解决方案,但有硬件设备可以做到这一点:谷歌搜索“蘑菇网络”。
答案4
我遇到了类似的问题。我对 GTH 先生和 Anatoli 先生根据第一个场景提出的解决方案非常感兴趣,如果可能的话,我非常请求您列出基本的配置和脚本,以测试第一个场景中描述的配置。
现在我通过不同的 ISP 提供商配置了 vpn 连接,使用组合的 tun/tap 接口(它不是绑定,在答案#8 中有解释)和此实用程序:
互联网服务提供商 (ISP) 余额作者:林肯·D·斯坦
在两个或多个 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 ##