複数のインターネット接続を1つにマージする方法は?


23

私のPCには合計4つのNIC、2つの有線ギガビットイーサネットネットワークカード、および2つのワイヤレスネットワークカードがあります。(プロプライエタリなドライバを備えたBroadcomと、オープンソースソフトウェアを備えたRalinkがあり、Broadcomよりもはるかに優れています。)

私の携帯電話はPCとワイヤレスで接続を共有できますが、有線インターネット接続もあります。そのため、インターネットにアクセスするために複数のインターネット接続があります。2つ以上の接続をマージしてバランスを取り、接続されたすべてのインターネット接続の合計である1つの統合されたインターネットエクスペリエンスを楽しむにはどうすればよいですか。

たとえば、1024kB / sのインターネット接続と512kB / sを提供するモデムと128kB / sを提供する小さなモデムを備えたモデムがある場合、すべての接続(ボンディングまたはチーミング)をロードバランシングおよびマージした後、たとえば、3つすべてのインターネット接続を1つとして使用する1664kB / sの速度。

この質問にはいつも興味をそそられました。


5
Ask Ubuntuの範囲をかなり超えているようです:)これは非常に複雑なネットワーク関連のものです。IMOでは、リンクが(一時的であっても)失われたパケットを考慮したり、一部のリンクが他のリンクよりも遅いためにパケットを並べ替えたりすることを考慮するまでに、その価値はほとんどありません。これを行う「ブラックボックス」ソリューションは知りませんが、興味深いプロジェクトになる可能性があります。
セシウム

9
質問は、ubuntuでこれを行うことができるかどうか、もしそうならどうするかです。
ルイスアルバラード

私が作成した答えをして、単一のPC上の2つのインターネット接続のポスト。Ubuntuでのバウンディングのためのドキュメントのリンク。
ルシオ

@Lucio質問を重複としてマークするか、回答をここに移動して承認済みとしてマークすることができます。また、13.04にはNetwork Managerにボンディングオプションが含まれるため(13.04がリリースされたときのために準備が必要です)(ワイヤードボンディングスレーブのみ)。
ルイスアルバラード

回答:


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
    

    アクティブ-バックアップボンディングモードの説明

    アクティブ-バックアップポリシー:ボンド内の1つのスレーブのみがアクティブです。アクティブなスレーブに障害が発生した場合にのみ、別のスレーブがアクティブになります。ボンドのMACアドレスは、スイッチの混乱を避けるために1つのポート(ネットワークアダプター)でのみ外部から見ることができます。このモードはフォールトトレランスを提供します。主なオプションは、このモードの動作に影響します。

    • すべてのボンディングモードの説明

    Ubuntuコミュニティのソースと詳細情報はwikiを助けます

ボンディングとは、複数のネットワークインターフェイス(NIC)を単一のリンクに結合し、高可用性、負荷分散、最大スループット、またはこれらの組み合わせを提供することを意味します。ソース


+1は私の質問の理由の1つです。すべてのスレーブ(実際の)接続の合計である仮想ネットワークマスター接続を作成する方法を待ちます。最新のカーネルバージョンに含まれるボンディングのようなもの。
ルイスアルバラード

2
-1-レイヤー2で動作しているLANでボンディングが機能します。問題は、2つの独立したWANの負荷分散に関するものです。
gertvdijk

@gertvdijk更新の答えを確認して、ボンディングが負荷分散も行うことを確認することに同意しません。
pl1nk

1
@ pl1nkこれは、同じL2ネットワーク内の2つのNICのレイヤー2ロードバランシングです。これは、マルチISPロードバランシングとは異なります。
gertvdijk

3
@ pl1nk最後のコメント。問題は明らかに、複数の独立したブロードバンド接続に関するものです。彼らは1つのISPかもしれないが、これはレイヤ2でこれを処理するために、障害者を変更しない
gertvdijk

6

少し古い質問ですが、まだ知りたい場合は..

gertvdijkとpl1nkが答えの1つで議論していた2つの典型的なシナリオがあります。

2つのパブリックIP(2つの異なるISP)を持つコンピューターがあり、別のホスト(コンピューターの両方のISP接続の合計帯域幅よりも大きい太いパイプを持つデータセンター内のサーバーなど)に接続します。したがって、2つの接続を介してホストへのボンディング接続を確立すると、ホスト(サーバー)は独自のインターネット接続を介してトラフィックを処理します。このシナリオでは、単一の接続で両方向の合計帯域幅のほぼ100%を取得できます。

これは、複数のレイヤー2(同じネットワーク)インターフェースが結合されているボンディング/チーミング/リング集約の特定のケースです。これは、コンピューターからホストへの各ISPインターフェイスでVPNレイヤー2(タップ)接続を確立し、それらを結合して(ラウンドロビンモード)単一のインターフェイスにすることで実現できます。このシナリオの制限要因は、ホストへの各ISP接続での遅延(ping)の違いです。それらがより類似して安定しているほど、より優れています。いずれかのインストールで使用しますが、うまく機能します。実装方法の詳細を知りたい場合は、お知らせください。

その後、別のシナリオでは、中間宿主なしで世界中の様々なWebサーバへのあなたのISPインタフェースから、すなわち直接接続になります。この場合、インターフェース間で発信接続を均等に分散させることが最善です。つまり、1つのTCPセッションが1つのISPを経由し、2つ目のセッションが別のISPを経由するなどです。これは、TCP接続を確立すると、各パケットの発信元と宛先のIPアドレスがあり、サーバーがTCPハンドシェイクが実行されていない別のIPからパケットを受信すると、そのパケットをエラーと見なしてドロップするためです。各ISP接続には独自のパブリックIPがあるため、同じTCPセッションに対して、あるIPからの接続を介して1つのパケットを送信し、別のIPとの別の接続を介して別のパケットを送信することはできません。

最初のシナリオのように単一のコンピューターの総帯域幅使用率を高くすることはできませんが、小規模なオフィスの場合は適切なソリューションになる可能性があります。少し拡張するためにできることは、特定のプロトコル用のカスタムソリューションを実装することです。たとえば、httpダウンロード用のゲートウェイ(同じコンピューターである可能性があります)に何らかのプロキシを設定し、異なるISPインターフェイスを介して異なるTCPセッションを確立する巨大なファイルの異なる部分を要求できます。この場合、結果のダウンロードレートは、合計帯域幅の100%近くになります。これは、ReGet、GetRight、および同様のダウンローダーが行うことをゲートウェイにオフロードするようなものです。Google 'HTTP 206 Partial Content'。このシナリオですぐに使えるオープンソースソリューションはわかりませんが、まさにこれを行うハードウェアアプライアンスがあります:google '


うわー!あなたの答えの最初の部分はまさに私が探しているものです。Ubuntuと非常に高速な接続を備えたクラウドにサーバーがあります。そして、私がここで持つことができる唯一のインターネット接続は、制限された3Gで300kbpsです。多くの3Gドングルを購入して接続速度を改善する計画を立てるために、回答の最初の部分を達成する方法についての詳細を教えてください。
-Huafu

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
そして、すべてのタップifacesをこのボンドに奴隷化します。echo "+tapX " >> /sys/class/net/bond0/bonding/slaves その状態を次のように 確認し cat /proc/net/bonding/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であることになっています)
アナトリ

1
このボンド構成(mode = 2 xmit_hash_policy = layer3 + 4)は、ハッシュ(接続に関係するIPとポートから計算された)mod iface番号に基づいて、それぞれの新しい接続を異なる基になるVPN iface経由にします。さらに詳しい情報:kernel.org/doc/Documentation/networking/bonding.txt。これは実際には私の答えの2番目のソリューションに似ています。ラウンドロビンボンディングが正しく機能するために非常に類似した(非常に低いジッターと同じ帯域幅の)基礎となる接続が必要であるためです(そうでなければ、多くのパケットの並べ替えを取得します)接続が3Gであること。
アナトリ

1
@Huafu、最初の解決策を得るには、mode=2 xmit_hash_policy=layer3+4yを指定する代わりにボンディングオプションを変更する必要がありますmode=0(@ kernel.orgのリンクを参照)が、最初に3G経由のリンクがどれだけ似ているかを確認します。ping時間の差が2〜3ミリ秒を超える場合、またはジッタが1ミリ秒を超える場合、多くのパケットの順序変更が行われ、集約リンクの速度が効果的に低下します。集約されたリンク統計をnetstat -s(再送信を探す)およびiperf -s/で確認する必要がありますiperf -c <server_ip> -d。最初に各リンクのパフォーマンスを確認してから、ソリューションを続行できます
Anatoli

0

私は同様の問題に直面しました..私は、mr。GTHとAnatoli、最初のシナリオで説明した構成をテストするために、可能であれば、基本的な構成とスクリプトをレイアウトするようお願いします。

今、私はこのユーティリティで結合されたトンネル/タップインターフェース(ボンディングではない、回答#8で説明されているもの)を使用して、異なるISPプロバイダーを介してVPN接続を設定しました:

リンカーンD.スタインによるNet-ISP-Balance

帯域幅と信頼性を向上させるために、2つ以上のISPでインターネット接続の負荷を分散します

プロジェクトホーム:https : //lstein.github.io/Net-ISP-Balance/

このパッケージを使用すると、2つ以上のISPで家庭または小規模ビジネスのインターネット接続の負荷を分散できます。2つのISPに接続された単一のホスト、またはルーター/ファイアウォールマシンで使用して、LAN全体の負荷を分散できます。ネットワークトラフィックは両方のISP接続でバランスが取れており、アップロードとダウンロードの容量が増加します。1つのISPに障害が発生すると、他のISPが自動的に引き継ぎます。

帯域幅は接続ごとのレベルで分配されます。つまり、特定のダウンロードまたは速度のベンチマークで帯域幅の総計は表示されませんが、家庭内の複数の個人が映画をストリーミングしている場合など、複数のデータ転送が同時に発生している場合はメリットがあります。さらに、BitTorrentなどのマルチ接続ファイル転送プロトコルには、負荷分散の利点があります。

これは、Linuxでルーティングとiptablesを管理するためのPerlベースのユーティリティです。実際には、最初にすべてのプロバイダーのルーティングテーブルを作成し、次にプロバイダー間ですべての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 ##

代わりに、この回答を削除して、対応する回答にさらに説明を求めるコメントを追加することを検討してください。これは答えではありません。ありがとうございました。
ラファ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.