同じサブネット内に複数の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
経由でデフォルトゲートウェイに移動するために必要なのはwlan0
eth0
がダウンしている場合。
それは可能ですか?このような機能を実現するにはどうすればよいですか?
自分で解決しました。 Linuxで実行できるネットワーキングに関する情報はほとんどないようです。そのため、私のソリューションを詳細に文書化して説明することにしました。これは私の最終的なセットアップです:
最初のステップ:/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 eth0
がeth0
に関連するデフォルトルートを削除するため、送信トラフィックが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アドレスを使用できます。
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カーネルのドキュメント