自分で解決しました。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
別の端末で入力できます。ping
にifdown 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アドレスを使用できます。