Блог - Балансування кількох каналів за допомогою O-VPN і Bonding у ROS

Дуже часто в IT-середовищі зустрічаються запити на побудову агрегації декількох каналів зв'язку, пов'язані з тим, що одинISP працює не стабільно та/або потрібно отримати більшу пропускну здатність. Мрії та поєднання цих двох факторів, як отримання стабільності та одночасне збільшення пропускної спроможності каналу за рахунок агрегації так і залишаються мріями, але деякий рух у цьому напрямку все ж таки можна здійснити.

Припустимо, як часто буває — у вас вдома підключено кілька інтернет-провайдерів і налаштовано автоматичне перекидання активного каналу, якщо один ізISP раптом перестав працювати. Схема цілком життєздатна, але має один недолік - один чи більше каналів залишаються незадіяними. Що можна зробити у цьому випадку? Зважаючи на те, що у нашому розпорядженні немає динамічної маршрутизації, нам залишається два варіанти — статично розкидати маршрути каналами або будувати агрегацію із зовнішнім роутером, що знаходиться, наприклад, у вас на роботі або в дата-центрі. Перший варіант відразу закреслює гнучкість функціоналу резервування, а ось про друге ми поговоримо детальніше.

Особисто я сам прихильник kernel-space транспорту в софт-роутерах, включаючиROS, тобто драйвер повинен перебувати в просторі ядра (ko), щоб забезпечити найбільшу продуктивність. Отже, при виборі технологій агрегації в рамках ROS, здавалося б, ми повинні розглядати EoIP, GRE і т.д. Однак, трапляються такі випадки, коли стабільність окремого каналу починає кульгати, з'являються втрати. Тоді "бондинг " або "бриджинг " не можуть адекватно відстежити таку поведінку і доводиться вручну вимикати тимчасово несправний канал, що вкрай не зручно. Як можна парирувати цей недолік? Потрібно ввестинадмірну перевірку працездатності тунелю. І тут нам на допомогу приходить OpenVPN, щедро перевіряючи свою життєздатність keep-alive пакетами.

Чудово! Почнемо.

/ip address add address=1.1.1.2/24 interface=ether1/ip address add address=1.1.1.3/24 interface=ether1/ ip route add dst-address=0.0.0.0/0 gateway=1.1.1.1

/ip route add dst-address=1.1.1.2/32 gateway=1.1.2.1/ip route add dst-address=1.1.1.3/32 gateway=1.1.3.1

У налаштуванняхR1 у нас фігурує два шлюзи1.1.2.1 та1.1.3.1. Нехай, це будуть шлюзи провайдерів дляR1. Таким чином, ми позначили, що до1.1.1.2 ми йдемо через1.1.2.1, а до1.1.1.3 ми йдемо через1.1.3.1 .

Далі переступимо до налаштувань базових тунелівOpenVPN.

/ppp profile add name=light-ovpn only-one=yes use-compression=no use-encryption=no use-mpls=no/ppp secret add local-address=1.1 .4.1 name=ovpn-over-isp1 password=YOURPASS profile=light-ovpn remote-address=1.1.4.2 service=ovpn/ppp secret add local-address=1.1.4.3 name=ovpn -over-isp2 password=YOURPASS profile=light-ovpn remote-address=1.1.4.4 service=ovpn/interface ovpn-server server set auth="" certificate=none cipher="" default -profile=light-ovpn enabled=yes keepalive-timeout=360 mode=ethernet port=8085 require-client-certificate=no/interface ovpn-server add name=ovpn-over-isp1 user =ovpn-over-isp1/interface ovpn-server add name=ovpn-over-isp2 user=ovpn-over-isp2

Приступимо до налаштування R1, нам потрібно буде дзеркально відобразити всі тунелі в розділі клієнтаOpenVPN.

/ppp profile add name=light-ovpn only-one=yes use-compression=no use-encryption=no use-mpls=no/interface ovpn-client add add-default-route=no auth=none certificate=none cipher=none connect-to=1.1.1.2 max-mtu=1500 mode=ethernet name =ovpn-over-isp1 password=YOURPASS port=8085 profile=light-ovpn user=ovpn-over-isp1/interface ovpn-client add add-default-route=no auth=none certificate =none cipher=none connect-to=1.1.1.3 max-mtu=1500 mode=ethernet name=ovpn-over-isp2 password=YOURPASS port=8085 profile=light-ovpn user=ovpn-over-isp2

Чудово! Тунелі підняті, їхній стан можна відстежити у відповідних розділах, настав час агрегації. розвести відповідним чином ваги таpath-cost. Проте, випробувавши повноцінну агрегацію наOpenVPN, я залишився задоволений результатом і пропоную свою схему в цій статті.

/interface bonding add link-monitoring=none mode=balance-rr mtu=1500 name=BOND-OVPN primary=none slaves=ovpn-over-isp1,ovpn-over-isp2

У цьому прикладі ми створили інтерфейс, що поєднує кілька каналівovpn-over-isp1 іovpn-over-isp2 за принципомRoundRobin (balance-rr). Це означає, що кожен пакет, що надходить в інтерфейсBOND-OVPN, буде йти спочатку вovpn-over-isp1, а потім уovpn-over-isp2, рівномірно завантажуючи обидва канали.

Чудово! Ми практично у мети. Залишилось зовсім небагато.

Не слід забувати, що на каналахISP1 іISP2 можуть спостерігатися різні затримки в проходженні пакетів, а отже, для чутливих до реордингу протоколів можуть настати несприятливі часи.

Ми можемо завершити наш процес збирання тунелів створеннямодного додаткового тунелю в режиміTCP, що працює поверхBOND-OVPN.

/ip address add address=1.1.5.2/30 interface=BOND-OVPN

/ip address add address=1.1.5.1/30 interface=BOND-OVPN

/ppp secret add local-address=1.1.6.1 name=ovpn-mainchannel password=YOURPASS profile=light-ovpn remote-address=1.1.6.2 service=ovpn/interface ovpn- server add name=ovpn-mainchannel user=ovpn-mainchannel

/interface ovpn-client add add-default-route=no auth=none certificate=none cipher=none connect-to=1.1.5.1 max-mtu=1500 mode=ethernet name=ovpn-mainchannel password=YOURPASS port= 8085 profile=light-ovpn user=ovpn-mainchannel

Слід зазначити, що якщо ви плануєте передавати з ДЦ мультисервісні послуги, наприклад,multicast таIP, тоovpn-mainchannel можна розділити за допомогоюVLAN, наприклад:

/interface vlan add interface=ovpn-mainchannel name=MainChannel-Internet vlan- >/interface vlan add interface=ovpn-mainchannel name=MainChannel-IPTV vlan- >

І ось ми отримали робочий варіант агрегації та невелику стійкість до відмов, залишилося пригнати всі сервіси. Тут постараюся не приділяти особливої ​​уваги деталі, т.к. вони повинні бути зрозумілими, якщо ви збираєтеся налаштовувати подібні схеми.

/ip address add address=1.1.7.1/30 interface=MainChannel-Internet/ip address add address=1.1.8.1/30 interface=MainChannel-IPTV/ip route add dst-address=1.1.1.4/32 gateway=1.1.7.2

У цьому випадку ми ведемо наR1 IP, що надається намДЦ1.1.1.4.

/ip address add address=1.1.7.2/30 interface=MainChannel-Internet /ip address add address=1.1.8.2/30 interface=MainChannel-IPTV /interface br >/ipaddress add address=1.1.1.4/32 interface=Loopback /ip route add dst-address=0.0.0.0/0 gateway=1.1.7.1 pref-src=1.1.1.4 /ip firewall nat add action= src-nat chain=srcnat out-interface=Loopback src-address=192.168.0.0/16 to-addresses=1.1.1.4

Тут ми «приземляємо» отриманий намиIP на створенийLoopback з бриджу і запускаємоNAT на вказанийIP.

Ремарка : у правилі/ip firewall nat add action = src-nat chain = srcnat out-interface = Loopback src-address = 192.168.0.0/16 to-addresses = 1.1.1.4 значенняout-interface може бути різним залежно від версіїROS (iptables). Це може бути Loopback на старих версіях ROS (5.x) і може бутиMainChannel-Internet на нових версіяхROS (6.x).

Ну і коли ми заговорили проIPTV.

/routing igmp-proxy interface add alternative-subnets=0.0.0.0/0 interface=MainChannel-IPTV upstream=yes /routing igmp-proxy interface add interface=ether2

/routing igmp-proxy interface add alternative-subnets=0.0.0.0/0 interface=ether2 upstream=yes /routing igmp-proxy interface add interface=MainChannel-IPTV

Висновок

Звичайно, створена схема жодною мірою не претендує наEnterprise рішення, проте в домашніх умовах, коли простий не допустимо, вона зарекомендувала себе чудово. Також, довгий час я намагався вирішити питання з резервуванням за коштамиEoIP тунелів, об'єднаних уBridge, але це не давало необхідної стабільності. Наставали моменти, коли в мережі одного з операторів виникали «дропи» величиною 10-15%, що зводило з розуму бридж. І тоді єдиним рішенням здававсяOpenVPN. Щоправда, варто зазначити, що на момент написання статті уEoIP вже також з'явивсяkeep-alive, але я настільки звик до позначеної схеми через утилізаціюTCP і можливість зміни робочого порту, що навряд чи перейду назад наEoIP. Тим більше, що в моєму випадку на старому Intel Atom вдалося отримати близько 210 Mbit/s симплексного трафіку, що, як я вважаю, є непоганим досягненням.

Учасник конкурсуОлександр

Прохання всім, хто читає статті, що беруть участь у конкурсі, ставити оцінки.