Чи можливо мати декілька шлюзів за замовчуванням для вихідних з'єднань?


15

Я хотів би мати декілька NIC (eth0 і wlan0) в одній підмережі і служити резервним копією для додатків на хості, якщо один з NIC не працює. З цієї причини я створив додаткову таблицю маршрутизації. Ось як /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за замовчуванням через за замовчуванням та через, wlan0якщо eth0він не працює.

Це можливо? Що мені потрібно зробити для досягнення такої функціональності?


Дуже коротко: кілька маршрутів за замовчуванням виберуть один інтерфейс навмання, що призводить до неприємностей, оскільки призначений IP відрізняється. Те, що ви хочете, - це багатомобільний зв'язок чи зв'язування , що важко зробити, дивіться, наприклад, тут
dirkt

1
Ви можете використовувати динамічний відмову з прив’язкою . Немає необхідності пограбувати з типовими маршрутами.
Інго

Відповіді:


17

Вирішив це сам. Здається, дуже мало інформації про мережеві речі, які ви можете зробити з 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.


Спробуйте встановити з'єднання, яке займе більше часу (наприклад, скапіруйте великий файл), подивіться, який мережевий інтерфейс він використовує, відключіть цей інтерфейс і подивіться, що відбувається.
dirkt

scpСесія буде перерва , так як IP - адреса змінюється. Ви можете спробувати використати withsctpдля збереження зв’язку живим у такому випадку або використовувати rsyncзамість того, scpщоб продовжувати передачу з тієї точки, де вона припинилась.
rosix

Сенс у тому, що: якщо він не працює, то яка перевага вашої складної установки над тим, що ви маєте лише один маршрут за замовчуванням, скажімо, на найшвидшому мережевому інтерфейсі, що наразі працює? withsctpтакож працюватиме лише для одного маршруту за замовчуванням.
dirkt

1
"у чому полягає перевага вашої складної установки в тому, що ви маєте лише один маршрут за замовчуванням, скажімо, на найшвидшому мережевому інтерфейсі, який зараз працює?" >> Саме це і робить моя установка. За замовчуванням використовується лише найшвидший маршрут за замовчуванням (eth0). Ласкаво просимо.
rosix

11

Linux надає краще рішення, ніж сценарій, що вирішується за сценарієм: активне резервне копіювання.

Таким чином, ваша машина матиме лише одну ip-адресу (та одну mac-адресу) та автоматично та прозоро перемикатиметься інтерфейсами, якщо один інтерфейс стане недоступним. Ніяких перерв у будь-якому TCP-з'єднанні (ні до вашого внутрішнього мережі, ні до Інтернету).

Я використовую цю настройку самостійно, щоб автоматично переходити з et0 на wlan0 на своєму ноутбуку Debian, коли відключаю ноутбук від док-станції.

Мій / і т.д. / мережа / інтерфейси:

# 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.