Решил это сам. Кажется, что очень мало информации о сетевых вещах, которые вы можете делать с Linux, поэтому я решил документировать и подробно объяснить свое решение. Это моя последняя настройка:
- 3 сетевых адаптера: eth0 (проводной), wlan0 (встроенный Wi-Fi, слабый), wlan1 (USB-адаптер Wi-Fi, более сильный сигнал, чем 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
если есть проблемы с интерфейсом (например, сбой сетевой платы или кто-то тянет за вилку).
Последний шаг : введите 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
. Ваш сервер будет оставаться в сети до тех пор, пока работает любой из трех интерфейсов. Для подключения к вашему серверу вы можете использовать IP-адрес eth0, а в случае сбоя - ip-адрес wlan1 или wlan0.