web-dev-qa-db-ja.com

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

同じサブネット内に複数のNIC(eth0およびwlan0)を配置し、いずれかのNICに障害が発生した場合にホスト上のアプリケーションのバックアップとして機能させたい。このため、追加のルーティングテーブルを作成しました。これは/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

メインルートテーブルに複数のデフォルトゲートウェイ(eth0に1つとwlan0に1つ)があり、デフォルトでeth0経由でデフォルトゲートウェイに移動するために必要なのはwlan0eth0がダウンしている場合。

それは可能ですか?このような機能を実現するにはどうすればよいですか?

18
rosix

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

  • NIC 3枚:eth0(ワイヤー)、wlan0(内蔵wifi、弱い)、wlan1(usb wifiアダプター、wlan0より強い信号)
  • すべてが1つのサブネット上にあり、それぞれに独自の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を実行したい)には特別な処理が必要です(質問の大きな引用を参照)。

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

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

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

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

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に切り替わります。

この設定で、1つのターミナルにping 8.8.8.8を入力し、別のターミナルにifdown eth0を入力できます。 pingは引き続き機能します。これは、ifdown eth0eth0に関連するデフォルトルートを削除するため、送信トラフィックがwlan1に切り替わるためです。

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

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

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

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

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

20
rosix

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

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

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

My/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カーネルのドキュメント

12
Thilo