Домашній інтернет маршрутизація двох (і більше) провайдерів на основі Bird Routing Daemon

Напевно, багато користувачів домашнього інтернету стикалися з тим, як розпаралелити два та більше інтернет-каналів у домашній мережі. Цю проблему можна вирішити і хардварно (використовуючи будь-яке дешеве або дороге обладнання) та софтверно. Яку модель маршрутизації вибрати? Відразу можна відкинути RIP/OSPF/BGP, так як це домашній інтернет і більше ніж впевнений (у моєму випадку і перевірено), що вам не захочуть підтримувати сторону провайдера безкоштовно. Зупинив вибір на bird.

Отже, вихідна позиція:

  • Домашній раутер із Debian GNU/Linux 6.0.5 (squeeze) на борту
  • 2 інтернет канали (ISP1 та ISP2)
  • 2 прямі руки
  • горнятко кави
Конфігурація моєї мережі:
  • eth0 - Провайдер 'ISP1':
  • IP: 10.10.10.106
  • Netmask: 255.255.255.0
  • Gateway: 10.10.10.1
  • eth1 - Локальна мережа:
  • IP: 192.168.254.254
  • Netmask: 255.255.255.0
  • eth2 - Провайдер 'ISP2':
  • IP: 172.17.5.105
  • Netmask: 255.255.255.0
  • Gateway: 172.17.5.1
  • Я любитель apt, але виявилося, що в апті лежить досить застаріла версія bird (1.2.5-1) і там немає підтримки multipath. Доведеться зібрати це руками. Наперед навмисно опускаю всякий флейм, як не перетворити debian на slackware.

    Стартап-скрипт готовий, додаємо в авто-запуск:

    Створимо директорію для логфайлу:

    Тепер приступаємо до конфігурування самого bird.

    Для початку бакапимо оригінальний конфіг і створюємо новий:

    Потім відкриваємо його на редагування:

    Тепер створюємо директорію для мануальних конфігів і для прикладу вносимодеякі маршрути:

    Все, налаштування bird закінчене. Тепер переходимо до налаштування таблиць маршрутизації.

    Додаємо таблиці до /etc/iproute2/rt_tables:

    Тепер потрібно зробити так, щоб при запиті з мережі ISP1 пакети йшли назад в ISP1, а не за іншим інтерфейсом. Для цього потрібно додати ip rule(s): Для цього створюємо скрипти iprules:

    Ставимо прапорець +x:

    Тепер все ребутімзапускаємо:

    Щоб не копіпастити команди, зробимо хитрішими:

    Тепер висмикуємо шнурок відключаємо мережевий кабель від ISP1 (eth0), дивимося, що змінилося:

    Тобто, якщо один з провайдерів випадково відключився, трафік піде через інший, відключений провайдер моніториться кожні 20 секунд (див. опцію scan time 20 в протоколах kernel) і при появі автоматично прибере 'dead'.

    На закінчення: таким же чином можна додати і 10 провайдерів.

    Хардкорна конфа за С++. Ми запрошуємо лише профі.