MikroTik, load balancing, ECMP, recursive failover, port source route
MikroTik, load balancing, ECMP, recursive failover, port source route
Никога не съм бил привърженик на load balancing но истината е, че по някой път се налага. Обикновенно това се случва в домашни условия или в малък офис. Решението да имаш два независими един от друг доставчика на Интернет винаги е било по добро от един на бизнес тарифа защото въпроса обикновенно освен до добра свързаност към глобалната мрежа опира и до отказоусточивост. Естествено това което ще покажа тук не е идеално решение защото според мен в load balancing такова няма, но е база в която ако се пипне тук там може да задоволи малък брой потребители.
конфигуриране на DNS
Като начало трябва да добавим DNS сървъри които са независими и от двата ни доставчика на Интернет защото ако падне някой от тях или ще ни се влоши връзката или въобще няма да имаме Интернет. В случая ще използваме сървърите на open dns като вече доказали се с надежност.
/ip dns set allow-remote-requests=yes servers=208.67.222.222,208.67.220.220 |
маркиране на изходящия трафик с routing mark
Тъй като за load balancing ще използваме ECMP което не е най интелигентното решение но за сметка на това пък е много просто трябва да маркираме част от изходящия трафик. Трафик който трябва да сме сигурни, че излиза през единия ни доставчик за да нямаме проблем с протоколи като www,ssl,mail,voip,ssh и др които изискват аутентикация или пък следят източника на пакети. Разбира се в тези правила може да се добавят и портове на игри или други приложения ако е нужно това.
/ip firewall mangle add action=mark-routing chain=prerouting dst-port=20-23,25,80-81,110,143,443,465,585,587 new-routing-mark=SRC-ROUTE1 protocol=tcp add action=mark-routing chain=prerouting dst-port=993,995,2222,2526,4444,5060-5061,8080,8291 new-routing-mark=SRC-ROUTE1 protocol=tcp add action=mark-routing chain=prerouting dst-port=5060-5061,10000-20000 new-routing-mark=SRC-ROUTE1 protocol=udp |
конфигуриране на NAT
Стандартно трябва да маскираме и двата ни доставчика на Интернет.
/ip firewall nat add action=masquerade chain=srcnat out-interface=ether1 add action=masquerade chain=srcnat out-interface=ether2 |
конфигуриране на load balancing
Часта с routinga идва малко сложна поради което ще и обърна малко по сериозно внимание защото освен ECMP ще използваме и recursive failover както и на самият load balancing така и на изходящия трафик който маркирахме да минава само през единия доставчик. Идеята вече я споменах ОТКАЗОУСТОЧИВОСТ. При правилна конфигурация ако падне единия доставчик свързаноста ще се изгуби за 10-20 секунди което е в рамките на търпимото.
/ip route add distance=1 dst-address=8.8.4.4/32 gateway=10.125.3.1 scope=10 add distance=1 dst-address=8.8.8.8/32 gateway=85.118.95.33 scope=10 add check-gateway=ping distance=1 gateway=8.8.4.4,8.8.8.8 |
В първите два реда рутираме двата хоста на google през двата ни доставчика за да знае рутера ни къде се намират те. Респективно 8.8.8.8 през първия и 8.8.4.4 през втория ни доставчик. В третия ред правим три неща едновременно:
1. с gateway=8.8.4.4,8.8.8.8 създаваме load balancing с политика ECMP.
3. тъй като маршрута по подразбиране gateway е 8.8.4.4,8.8.8.8 а не на доставчиците ние създадохме recursive route
2. с check-gateway=ping следим дали ще падне някой от хостовете на google които на практика вече са нашите маршрути по подразбиране.
Допълнително подсигуряване с маршрут по подразбиране
Какво ще стане обаче ако по някаква причина изгубим достъп и до двата хоста на google ? Ясно е, че Интернет ще има след рутера а ние не, защото ще ни паднат маршрутите по подразбиране. Затова трябва да се подсигурим с още един такъв с по висока метрика distance=2 който ще се активира само ако паднат google хостовете които са с метрика distance=1.
/ip route add distance=2 gateway=85.118.95.33 |
failover на маркирания трафик
/ip route add check-gateway=ping distance=1 gateway=8.8.8.8 routing-mark=SRC-ROUTE1 add check-gateway=ping distance=2 gateway=8.8.4.4 routing-mark=SRC-ROUTE1 add distance=3 gateway=85.118.95.33 routing-mark=SRC-ROUTE1 |
Последното което трябва да направим е същото но с маркирания изходящ трафик който конфигурирахме в ip firewall mangle с routing-mark=SRC-ROUTE1. Тук трябва да следим само метриките, първия ред е маршрут на изходящия трафик по подразбиране, втория ще се активира ако падне първия а третия ако паднат двата google хоста. По този начин имаме failover не само на load balancing но и на маркирания трафик.
Тест на конфигурацията
На срииншота по долу виждаме зона 1 bridge което е LAN мрежата на рутера а в зона 2 трафика който преминава и през двата ни доставчика ether1 и ether2.
по тънки настройки
Може би някой ще зададе въпроса какво ще стане ако единия доставчик предлага два пъти по голяма скорост от другия ?. В ECMP има решение за този казус, нарича се тежест (weight). В реда с маршрута по подразбиране трябва да повторим два пъти gateway по този начин.
/ip route add check-gateway=ping distance=1 gateway=8.8.4.4,8.8.4.4,8.8.8.8 |
В случая през доствчик 2 с маршрут 8.8.4.4 ще преминават два пъти повече пакети от 8.8.8.8 като това няма да засяга маркирания трафик.
тест от страна на потребителя
При изходящ порт 80 винаги трябва да излизам с адреса на първия доставчик.

още маршрути от рутера
Тъй като споменах, че ECMP е малко „прост“ в случай, че отвън искам да достъпя рутера ще се появи проблем от рода на постоянно появяване и изчезване. Това е така защото той разпределя пакетите според тежеста която сме му задали. За да гарантирам, че определен хост в случая 85.118.95.126 ще го вижда безпроблемно в Интернет ще създам още един маршрут.
ip route add dst-address=85.118.95.126 gateway=85.118.95.33 |
конфигурирне на DMZ
Често попадаме в ситуация в която имаме нужда от пренасочване на портове или от DMZ. Видеонаблюдения, локален сървър който искаме да достъпваме от Интернет и др. ИП адреса който ще използвам от локалната мрежа ще е 192.168.1.42 рутирайки го към доставчик 1 същия през който маркирахме изходящия трафик.
/ip firewall mangle add action=mark-routing chain=prerouting new-routing-mark=SRC-ROUTE1 src-address=192.168.1.42 |
Мисля, че е важно да добавя, че изходящия трафик на адреса 192.168.1.42 винаги ще излиза през първия доставчик и за да e достъпен той например на порт 10000 от интернет трябва да добавим правило в NAT.
/ip firewall nat add chain=dstnat in-interface=ether1 protocol=tcp dst-port=10000 action=dst-nat to-addresses=192.168.1.42 to-ports=10000 |






