アウトバウンド接続に複数のデフォルトゲートウェイを使用することはできますか?


15

同じサブネットに複数のNIC(eth0およびwlan0)を配置し、NICの1つに障害が発生した場合にホスト上のアプリケーションのバックアップとして機能させたいと考えています。このため、追加のルーティングテーブルを作成しました。これはどのように/etc/network/interfaces見えるかです:

iface eth0 inet static
address 192.168.178.2
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.2
    post-up ip route add default via 192.168.178.1 dev eth0
    post-up ip rule add from 192.168.178.2/32
    post-up ip rule add to 192.168.178.2/32

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.3
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.3 table rt2
    post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
    post-up ip rule add from 192.168.178.3/32 table rt2
    post-up ip rule add to 192.168.178.3/32 table rt2

これはホストに接続するために機能します。インターフェースの1つが失敗した場合でも、ホストにSSHで接続できます。ただし、ホスト上のアプリケーションは、eth0ダウンしている場合、外部への接続を初期化できません。それが私の問題です。

私はそのトピックを調査し、次の興味深い情報を見つけました。

プログラムがアウトバウンド接続を開始するとき、通常はワイルドカードの送信元アドレス(0.0.0.0)を使用します。これは、関連する宛先アドレスに到達できる場合、どのインターフェースを使用するかについての優先順位がないことを示します。これは、ルーティングの決定が行われるまで、特定の送信元アドレスに置き換えられません。したがって、このような接続に関連付けられたトラフィックは、上記のポリシールールのいずれにも一致せず、新しく追加されたルーティングテーブルのいずれにも送信されません。それ以外の点で通常の構成を想定すると、代わりにメインルーティングテーブルにフォールスルーします。 http://www.microhowto.info/howto/ensure_symmetric_routing_on_a_server_with_multiple_default_gateways.html

メインルートテーブルは(上の1つ以上のデフォルトゲートウェイを持つようにするために何が欲しいのですeth0と1上のwlan0)を介して、デフォルトゲートウェイに移動するにはeth0、デフォルトではとを経由してwlan0いる場合eth0ダウンしています。

それは可能ですか?そのような機能を実現するには何をする必要がありますか?


簡単に説明すると、いくつかのデフォルトルートが1つのインターフェイスをランダムに選択します。これにより、割り当てられたIPが異なるため、問題が発生します。何がされたいマルチホーミングまたはバンドル行うことは困難である、などを参照してくださいここに
dirkt

1
動的フェイルオーバーをボンディングとともに使用できます。デフォルトルートをいじる必要はありません。
インゴ

回答:


17

自分で解決しました。Linuxでできるネットワーク関連の情報はほとんどないようですので、ソリューションを詳細に文書化して説明することにしました。これが私の最終的なセットアップです。

  • 3 NIC:eth0(ワイヤー)、wlan0(ビルトインwifi、弱い)、wlan1(usb wifiアダプター、wlan0より強い信号)
  • それらはすべて単一のサブネット上にあり、それぞれが独自のIPアドレスを持ちます。
  • eth0は、デフォルトで着信トラフィックと発信トラフィックの両方に使用する必要があります。
  • eth0が失敗した場合、wlan1を使用する必要があります。
  • wlan1が失敗した場合、wlan0を使用する必要があります。

最初の手順:のすべてのインターフェイスに新しいルートテーブルを作成します/etc/iproute2/rt_tables。それらをrt1、rt2およびrt3と呼びましょう

#
# reserved values
#
255 local
254 main
253 default
0 unspec
#
# local
#
#1  inr.ruhep
1 rt1
2 rt2
3 rt3

第2ステップ/etc/network/interfaces。これが主要な部分であり、できる限り説明しようと思います。

auto eth0 wlan0
allow-hotplug wlan1

iface lo inet loopback

iface eth0 inet static
address 192.168.178.99
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev eth0 src 192.168.178.99 table rt1
    post-up ip route add default via 192.168.178.1 dev eth0 table rt1
    post-up ip rule add from 192.168.178.99/32 table rt1
    post-up ip rule add to 192.168.178.99/32 table rt1
    post-up ip route add default via 192.168.178.1 metric 100 dev eth0
    post-down ip rule del from 0/0 to 0/0 table rt1
    post-down ip rule del from 0/0 to 0/0 table rt1

iface wlan0 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.97
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan0 src 192.168.178.97 table rt2
    post-up ip route add default via 192.168.178.1 dev wlan0 table rt2
    post-up ip rule add from 192.168.178.97/32 table rt2
    post-up ip rule add to 192.168.178.97/32 table rt2
    post-up ip route add default via 192.168.178.1 metric 102 dev wlan0
    post-down ip rule del from 0/0 to 0/0 table rt2
    post-down ip rule del from 0/0 to 0/0 table rt2

iface wlan1 inet static
wpa-conf /etc/wpa_supplicant.conf
wireless-essid xyz
address 192.168.178.98
netmask 255.255.255.0
dns-nameserver 8.8.8.8 8.8.4.4
    post-up ip route add 192.168.178.0/24 dev wlan1 src 192.168.178.98 table rt3
    post-up ip route add default via 192.168.178.1 dev wlan1 table rt3
    post-up ip rule add from 192.168.178.98/32 table rt3
    post-up ip rule add to 192.168.178.98/32 table rt3
    post-up ip route add default via 192.168.178.1 metric 101 dev wlan1
    post-down ip rule del from 0/0 to 0/0 table rt3
    post-down ip rule del from 0/0 to 0/0 table rt3

入力ip rule showすると、次のように表示されます。

0:  from all lookup local 
32756:  from all to 192.168.178.98 lookup rt3 
32757:  from 192.168.178.98 lookup rt3 
32758:  from all to 192.168.178.99 lookup rt1 
32759:  from 192.168.178.99 lookup rt1 
32762:  from all to 192.168.178.97 lookup rt2 
32763:  from 192.168.178.97 lookup rt2 
32766:  from all lookup main 
32767:  from all lookup default 

これは、IPアドレス「192.168.178.99」からの着信または発信トラフィックがrt1ルートテーブルを使用することを示しています。ここまでは順調ですね。ただし、ローカルで生成されたトラフィック(たとえば、マシンから別の場所にpingまたはsshする)には特別な処理が必要です(質問の大きな引用を参照)。

の最初の4つのポストアップ行/etc/network/interfacesは簡単で、説明はインターネットで見つけることができます。5番目と最後のポストアップ行は魔法を起こすものです。

post-up ip r add default via 192.168.178.1 metric 100 dev eth0

このポストアップラインのルートテーブルを指定していないことに注意してください。ルートテーブルを指定しない場合、情報はでmain見たルートテーブルに保存されip rule showます。このポストアップ行は、着信トラフィックへの応答ではないローカルで生成されたトラフィックに使用される「メイン」ルートテーブルにデフォルトルートを配置します。(たとえば、サーバー上のMTAが電子メールを送信しようとしています。)

3つのインターフェイスはすべて、メトリックが異なりますが、メインルートテーブルにデフォルトルートを配置します。mainルートテーブルを見てみましょうip route show

default via 192.168.178.1 dev eth0  metric 100 
default via 192.168.178.1 dev wlan1  metric 101 
default via 192.168.178.1 dev wlan0  metric 102 
192.168.178.0/24 dev wlan0  proto kernel  scope link  src 192.168.178.97 
192.168.178.0/24 dev eth0  proto kernel  scope link  src 192.168.178.99 
192.168.178.0/24 dev wlan1  proto kernel  scope link  src 192.168.178.98

メインルートテーブルには、メトリックは異なりますが、3つのデフォルトルートがあることがわかります。メトリック番号が小さいほど優先順位が高いため、最高の優先順位はeth0、次にwlan1、次にwlan0です。eth0メトリックが最も低いため、これは稼働している限り使用されるデフォルトのルートですeth0。場合はeth0ダウンし、発信トラフィックがに切り替わりますwlan1

この設定ではping 8.8.8.8、ある端末とifdown eth0別の端末で入力できます。pingifdown eth0関連するデフォルトルートが削除されるためeth0、発信トラフィックはに切り替わるため、まだ動作するはずですwlan1

ポストダウン行ip rule showは、すべてが整頓された状態を維持するために、インターフェイスがダウンしたときに、関連するルートテーブルがルーティングポリシーデータベース()から削除されるようにします。

残っている問題はeth0、デフォルトルートからプラグをプルしたときeth0に、まだそこにあり、発信トラフィックが失敗することです。インターフェイスを監視し、インターフェイスにifdown eth0問題がある場合(NICの障害またはプラグを抜く人)に実行するために何かが必要です。

最後のステップ:を入力しifplugdます。それはインターフェースを監視しifup/ifdown、プラグを抜くか、wifi接続に問題がある場合に実行するデーモンです/etc/default/ifplugd

INTERFACES="eth0 wlan0 wlan1"
HOTPLUG_INTERFACES=""
ARGS="-q -f -u0 -d10 -w -I"
SUSPEND_ACTION="stop"

これでプラグをオンにできeth0、発信トラフィックはに切り替わりwlan1、プラグを元に戻すと発信トラフィックはに戻りeth0ます。3つのインターフェイスのいずれかが機能している限り、サーバーはオンラインのままです。サーバーに接続するには、eth0のIPアドレスを使用できます。それが失敗した場合は、wlan1またはwlan0のIPアドレスを使用できます。


時間がかかる接続を作成してみて(たとえば、大きなファイルをscp)、使用するネットワークインターフェイスを監視し、そのインターフェイスを無効にして、何が起こるかを確認します。
dirkt

scpIPアドレスが変更されるため、セッションが中断します。withsctpそのような場合は、接続を維持するために使用するか、停止した場所から転送を継続するrsync代わりに使用してみてくださいscp
rosix

要点:壊れた場合、単一のデフォルトルートだけでなく、現在起動している最速のネットワークインターフェースでの複雑なセットアップの利点は何ですか?withsctpまた、1つのデフォルトルートに対してのみ機能します。
dirkt

1
「現在起動している最速のネットワークインターフェイスで、単一のデフォルトルートだけでなく、複雑なセットアップの利点は何ですか?」>>それがまさに私のセットアップが行っていることです。デフォルトでは、最速のデフォルトルート(eth0)のみが使用されます。どういたしまして。
rosix

10

Linuxは、スクリプト化された回避策であるアクティブバックアップボンディングよりも優れたソリューションを提供します。

このようにして、マシンは1つの IPアドレス(および1つのMACアドレス)のみを持ち、1つのインターフェースが使用できなくなった場合に自動的かつ透過的にインターフェースを切り替えます。TCP接続の中断はありません(内部LANとインターネットのどちらにも)。

私はこのセットアップを自分で使って、ラップトップをドッキングステーションから切断すると、debianラップトップでeth0からwlan0に自動的にフェールオーバーします。

私の/ etc / network / interfaces:

# The primary network interface
allow-hotplug eth0
iface eth0 inet manual
        bond-master bond0
        bond-primary eth0

# The secondary network interface
allow-hotplug wlan0
iface wlan0 inet manual
        pre-up sleep 5
        wpa-conf /etc/wpa_supplicant.conf
        bond-master bond0
        bond-primary eth0

# The bonding interface
allow-hotplug bond0
iface bond0 inet dhcp
        bond-slaves eth0 wlan0
        bond-primary eth0
        bond-mode active-backup
        bond-miimon 10
        bond_downdelay 10
        bond_updelay 4000

このセットアップを簡単に拡張して、複数のwlanデバイスを含めることができます。 primary_reselectオプションをbetter(最速のリンクを自動的に選択する)に設定すると、ここで役立ちます。

詳細については、https://wiki.linuxfoundation.org/networking/bondingおよびhttps://wiki.debian.org/Bondingを参照してください

そして(もちろん)https://www.kernel.org/doc/Documentation/networking/bonding.txtにあるLinuxカーネルのドキュメント

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.