Динамічне перенаправлення мережевого трафіку

Мова в статті піде про те, як організувати можливість динамічного перемикання між мережевими інтерфейсами.
Коріння питання почали зростати з попереднього проекту socmetr.ru, де потрібно збирати великий обсяг інформації з соціальних мереж, і таким чином забиваючи єдиний канал з інтернетом. Аналіз показав, що навіть при наявності стиснення, обсяг інформації, що надходить так великий, що відбувається його блокування, при цьому потужності CPU і Memory не задіяні і на 20%, а дискова підсистема майже весь час простоює, тобто ми вперлися в ширину каналу, яку нам надає провайдер.
Перша думка була піти екстенсивним шляхом і просто збільшити його можливості, трохи охолонувши і призадумавшись, зрозуміли, що перекладаємо проблему на майбутнє. Само собою, виникло запитання: "Яким шляхом підемо, товариші?". В результаті реалізували наступну ідею:
image

Налаштування сервера

Оскільки конфігурація виглядає одноманітно, має сенс ввести символьні позначення, нехай:
    A1 це перший мережевий інтерфейс, A2 — другий… AN — останній
    IP1 це IP-адреса пов'язаний з мережевим інтерфейсом A1, IP2 — адреса пов'язаний з A2… IPN — адреса пов'язаний c AN
    GW1 це IP-адреса шлюзу провайдера P1 (Provider 1), GW2 — адреса шлюзу провайдера P2… GWN — адреса шлюзу PN
    GW1_NET це IP-адреса мережі провайдера P1, GW2_NET IP-адреса мережі провайдера P2… GWN_NET IP-адреса мережі провайдера PN
Тоді настройку можна здійснити наступним чином:
Створюємо N-таблиць маршрутизації (де N - це кількість підведених каналів з інтернетом)
ip route add {GW1_NET} dev {A1} src {IP1} table T1
ip route add default via {GW1} table T1
...
ip route add {GWn_NET} dev {An} src {IPn} table Tn
ip route add default via {GWn} table Tn

Описуємо маршрути в основній таблиці маршрутизації:
ip route add {GW1_NET} dev {A1} src {IP1}
...
ip route add {GWn_NET} dev {An} src {IPn}
ip route add default via {GW1}

Описуємо правила:
ip rule add from {IP1} table T1
...
ip rule add from {IPn} table Tn 

І справа в капелюсі, отримуємо конфігурацію, яка гарантує, що всі запити до конкретного інтерфейсу отримають від нього відповідь.

Використання

Для того щоб звернутися до різним мережним адаптерам, необхідно задіяти конструкції конкретної мови програмування, або використовувати сторонні бібліотеки. В Java, це можна зробити через сокети, наприклад:
socket.bind(new InetSocketAddress(InetAddress.getByName("network adapter"), port));

Реалізувавши зазначену схему, була отримана можливість управляти смугою інтернет каналу в залежності від бізнес-процесів і логіки, що відбуваються на серверах, на різних стадіях життєвого циклу інформаційних систем.
Плюси:
  • можливість гнучкого масштабування інтернет-каналу (ми отримуємо можливість у будь-який момент збільшити або зменшити загальний інтернет канал, як за рахунок підключення нових провайдерів, так і за рахунок збільшення смуги пропускання поточних, з'являється можливість планувати і прогнозувати його потужність)
  • можливість управління навантаженням, кожного з них
  • можливість використання будь-якого каналу або їх послідовності в будь-який момент часу будь підсистемою
Мінуси:
  • початкові витрати на придбання відповідного обладнання
  • обов'язкова наявність безлічі провайдерів інтернет-послуг
Можливо, хтось вже стикався з подібною проблемою, і ми побудували велосипед, так що критика рішення тільки вітається.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.