Можно ли иметь несколько шлюзов по умолчанию для исходящих соединений?

15

Я хотел бы иметь несколько сетевых адаптеров (eth0 и wlan0) в одной подсети и служить резервной копией для приложений на хосте в случае сбоя одного из сетевых адаптеров. По этой причине я создал дополнительную таблицу маршрутизации. Вот как /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

Это работает для подключения к хосту: я все еще могу подключиться к нему по SSH, если один из интерфейсов выходит из строя. Однако приложения на хосте не могут инициализировать соединение с внешним миром, если eth0не работает. Это моя проблема.

Я исследовал эту тему и нашел следующую интересную информацию:

Когда программа инициирует исходящее соединение, она обычно использует подстановочный адрес источника (0.0.0.0), который не указывает, какой интерфейс используется, при условии, что соответствующий адрес назначения доступен. Он не заменяется конкретным адресом источника до тех пор, пока не будет принято решение о маршрутизации. Поэтому трафик, связанный с такими соединениями, не будет соответствовать ни одному из приведенных выше правил политики и не будет перенаправлен ни в одну из вновь добавленных таблиц маршрутизации. Предполагая, что в остальном нормальная конфигурация, он вместо этого провалится к основной таблице маршрутизации. http://www.microhowto.info/howto/ensure_symmetric_routing_on_a_server_with_multiple_default_gateways.html

Я хочу, чтобы в основной таблице маршрутов было более одного шлюза по умолчанию (один включен eth0и один включен wlan0) и чтобы он шел к стандартному шлюзу через eth0по умолчанию и через wlan0if, если eth0он выключен.

Это возможно? Что мне нужно сделать, чтобы достичь такой функциональности?

rosix
источник
Очень кратко: несколько маршрутов по умолчанию выберут один интерфейс случайным образом, что приводит к проблемам, потому что назначенный IP-адрес отличается. То, что вам нужно, это множественная адресация или пакетирование , что трудно сделать, см., Например, здесь
dirkt
1
Вы можете использовать динамическое переключение при сбое . Там нет необходимости возиться с маршрутами по умолчанию.
Инго

Ответы:

17

Решил это сам. Кажется, что очень мало информации о сетевых вещах, которые вы можете делать с 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.

rosix
источник
Попробуйте установить соединение, которое занимает больше времени (например, scp большого файла), посмотрите, какой сетевой интерфейс он использует, отключите этот интерфейс и посмотрите, что произойдет.
17
scpСессия будет перерыв , так как IP - адрес меняется. Вы можете попробовать использовать, withsctpчтобы сохранить соединение в таком случае, или использовать rsyncвместо того, scpчтобы ограничить передачу от точки, где оно остановилось.
rosix
Суть в том, что: если он ломается, в чем преимущество вашей сложной настройки по сравнению с наличием только одного маршрута по умолчанию, скажем, на самом быстром сетевом интерфейсе в настоящее время? withsctpтакже будет работать только для одного маршрута по умолчанию.
Диркт
1
«В чем преимущество вашей сложной настройки по сравнению с одним единственным маршрутом по умолчанию, скажем, на самом быстром сетевом интерфейсе в настоящее время?» >> Это именно то, что делает моя установка. По умолчанию используется только самый быстрый маршрут по умолчанию (eth0). Пожалуйста.
rosix
10

Linux предлагает лучшее решение, чем обходной сценарий: соединение активных резервных копий.

Таким образом, ваша машина будет иметь только один IP-адрес (и один MAC-адрес) и автоматически и прозрачно переключать интерфейсы, если один интерфейс станет недоступным. Нет прерывания любого соединения TCP (ни к вашей внутренней сети, ни к Интернету).

Я сам использую эту настройку для автоматического перехода с eth0 на wlan0 на своем ноутбуке Debian, когда я отключаю свой ноутбук от док-станции.

Мой / 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.

И (конечно) документация по ядру Linux на https://www.kernel.org/doc/Documentation/networking/bonding.txt

Тило
источник