自分で解決しました。Linux で実行できるネットワークに関する情報はほとんどないように思われるため、私の解決策を詳細に文書化して説明することにしました。これが私の最終設定です:
- 3 つの NIC:eth0 (ワイヤ)、wlan0 (組み込みの wifi、弱い)、wlan1 (usb wifiadapter、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 を送信する場合) には、特別な処理が必要です (質問の大きな引用を参照してください)。
/etc/network/interfaces
の最初のポストアップ 4 行 簡単で、説明はインターネットで見つけることができます。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
と入力できます 1 つの端末と ifdown eth0
で 別の。 ping
ifdown eth0
のため、まだ動作するはずです eth0
に関連するデフォルト ルートを削除します 、発信トラフィックは wlan1
に切り替わります .
ポストダウン行により、関連するルート テーブルがルーティング ポリシー データベースから削除されることが保証されます (ip rule show
) インターフェースがダウンしたとき、すべてを整然と保つために。
残っている問題は、eth0
からプラグを抜くときです。 eth0
のデフォルト ルート まだそこにあり、発信トラフィックは失敗します。インターフェースを監視し、ifdown eth0
を実行する何かが必要です インターフェイスに問題がある場合 (つまり、NIC の障害や誰かがプラグを抜いているなど)。
最後のステップ :ifplugd
を入力してください .これは、インターフェイスを監視して ifup/ifdown
を実行するデーモンです。 プラグを抜いた場合、または Wi-Fi 接続に問題がある場合 /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 アドレスを使用できます。
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 カーネルのドキュメント