Вирішив це сам. Здається, дуже мало інформації про мережеві речі, які ви можете зробити з 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
Другий крок : налаштування мережі в /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. Все йде нормально. Але трафік, який генерується в локальному масштабі (наприклад, ви хочете пінг або ssh з машини в інше місце), потребує спеціального лікування (див. Велику цитату в запитанні).
Перші чотири рядки після публікації /etc/network/interfaces
є простими, і пояснення їх можна знайти в Інтернеті, п'ята та остання рядки після доплати - це те, що робить магію:
post-up ip r add default via 192.168.178.1 metric 100 dev eth0
Зверніть увагу, як ми не вказали таблицю маршруту для цієї післяпланової лінії. Якщо не вказати таблицю маршруту, інформація буде збережена в main
таблиці маршрутів, яку ми бачили ip rule show
. Цей рядок розміщення маршруту за замовчуванням ставить у основну таблицю маршрутів, яка використовується для локально генерованого трафіку, який не є відповіддю на вхідний трафік. (Наприклад, MTA на вашому сервері, що намагається надіслати електронну пошту.)
Усі три інтерфейси ставлять маршрут за замовчуванням у головній таблиці маршрутів, хоча і з різними показниками. Давайте розглянемо 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
Ми бачимо, що основна таблиця маршрутів має три маршрути за замовчуванням, хоча і з різними показниками. Найвищий пріоритет - 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
. Ваш сервер залишатиметься в Інтернеті, поки працює будь-який з трьох інтерфейсів. Для підключення до вашого сервера ви можете використовувати ip адресу eth0, а якщо це не вдається, ip адресу wlan1 або wlan0.