Блог - Балансування кількох каналів за допомогою 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 симплексного трафіку, що, як я вважаю, є непоганим досягненням.
Учасник конкурсуОлександр
Прохання всім, хто читає статті, що беруть участь у конкурсі, ставити оцінки.