Налаштування роботи сервера на CentOS з 2 шлюзами і балансування між ними

Замість вступу

За основу взята більш рання прочитана мною стаття на Хабрі , якої особисто мені виявилося достатньо для розуміння механізму policy routing в цілому — і катастрофічно мало для реалізації цього типу маршрутизації на сервері компанії. Було 2 серйозних підводних каменя, над якими довелося працювати самостійно, і які не можна залишити без уваги: ​​
 
 
     
  • Збереження налаштувань в цілому
  •  
  • Перебивання налаштувань утилітою Network Manager
  •  
 
Свою статтю я напишу у вигляді тієї інструкції, яку написав для майбутніх поколінь айтішників у своїй фірмі — так що деякі пункти з основної статті буду приводити або в незмінному, або в переказаний для себе вигляді. Їх буду виділяти курсивом . Для повного розуміння того, що тут написано, рекомендую ознайомитися з нею повністю.
 
 
Трохи практики, або чого ми хочемо
А хочемо ми отримати маршрутизацію, яка:
 
 
     
  • буде відправляти дані на той же шлюз, з якого прийшов запит
  •  
  • буде контрольовано балансувати навантаження між шлюзами, використовуючи т.зв. «Вагу» (weight) шлюзів
  •  
Для цих цілей будемо використовувати утиліту iproute2, що входить в стандартну поставку всіх дистрибутивів Linux.
 
 Видаємо IP-адреси:

 
ip a a 11.11.11.11/22 dev eth6
ip a a 22.22.22.22/28 dev eth5

 
 Визначаємо таблиці:
Для використання більш ніж одного маршруту, статичної маршрутизації вже недостатньо. Для OSPF наша схема занадто проста, тому зупинимося на динамічної маршрутизації з використанням таблиць.

 
 
ip route add default via 22.22.22.17 table 101
ip route add default via 11.11.8.1 table 102

 
 Загортаємо вихідний трафік, на шлюзи, з яких прийшов входить:
 
 
ip rule add from 22.22.22.17 table 101
ip rule add from 11.11.8.1 table 102

 
 Думаю тепер уже пояснювати суть цих рядків не треба. Аналогічним чином можна зробити доступність сервера по більш ніж двом шлюзам.
 
 Балансування трафіку між АПЛІНК
 Робиться однієї елегантною командою:
 
 
ip route replace default scope global \
nexthop via 22.22.22.17 dev eth5 weight 3 \
nexthop via 11.11.8.1 dev eth6 weight 7

 
 Ця запис замінить існуючий default-роутинг в таблиці main. При цьому маршрут буде вибиратися залежно від ваги шлюзу (weight). Наприклад, при вказівці ваг 7 і 3, через перший шлюз буде йти 70% з'єднань, а через другий — 30%. Є один момент, який при цьому треба враховувати: ядро ​​кешируєт маршрути, і маршрут для будь-якого хоста через певний шлюз буде висіти в таблиці ще деякий час після останнього звернення до цього запису. А маршрут до часто використовуваних хостів може не встигати скидатися і буде постійно оновлюватися в кеші, залишаючись на одному і тому ж шлюзі. Якщо це проблема, то можна іноді очищати кеш вручну командою ip route flush cache.
 
 Результат
Після виконання даної команди можна перевіряти доступність сервера. В принципі, можна було сказати, що на цьому наша робота закінчилася. Однак є одна проблема — після перезавантаження всі налаштування скинуться.
 
 
Збереження налаштувань в цілому
Тепер необхідно змусити систему застосовувати отримані настройки після перезавантаження.
 
 IP-адреси
Для початку з'ясовуємо, який mac-address якого інтерфейсу належить. Виконуємо команду:
 
 
ip a

 
 І бачимо налаштування адаптерів (mac-адреси складаються з літер a або b):
2: eth6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether aa:aa:aa:aa:aa:aa brd ff:ff:ff:ff:ff:ff
    inet 11.11.11.11/22 brd 11.11.11.255 scope global eth6
3: eth5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether bb:bb:bb:bb:bb:bb brd ff:ff:ff:ff:ff:ff
    inet 22.22.22.22/28 brd 22.22.22.31 scope global eth5

Далі створюємо конфігураційні файли налаштувань ifconfig з використанням отриманих mac-адрес. Для цього створюємо файли з приставкою ifcfg і назвою інтерфейсу в папці
 
 / etc / sysconfig / network-scripts:
# cat /etc/sysconfig/network-scripts/ifcfg-eth5
DEVICE=eth5
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPV6INIT=no
IPADDR=22.22.22.22
PREFIX=28
HWADDR=bb:bb:bb:bb:bb:bb
GATEWAY=22.22.22.17
DEFROUTE=yes
NAME=eth5

# cat /etc/sysconfig/network-scripts/ifcfg-eth6
DEVICE=eth6
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPV6INIT=no
IPADDR=11.11.11.11
PREFIX=22
HWADDR=aa:aa:aa:aa:aa:aa

 
 
 Створюємо таблиці маршрутизації
Далі необхідно створити постійні таблиці, присвоїти їм імена (щоб було простіше орієнтуватися) і прописати правила використання цих таблиць:
 
 
cd /etc/iproute2/ 
echo "101 int" >> rt_tables
echo "102 ext" >> rt_tables

 
Тепер повертаємося в каталог
/etc/sysconfig/network-scripts
і продовжуємо працювати там.
Створюємо вміст таблиць:
 
 
# cat route-eth5
default via 22.22.22.17 table ext
# cat route-eth6
default via 11.11.8.1 table int

 
Створюємо правила обробки цих таблиць:
 
 
# cat rule-eth5
from 22.22.22.22 lookup ext
# cat rule-eth6
from 11.11.11.11 lookup int

 
 Балансування
Далі замінюємо статику динамікою. Не обійшлося без напилка, т.к. стартап-скрипти, описані вище, прив'язуються до інтерфейсів, а в нашому випадку правило пишеться відразу про 2 інтерфейсу. Тому вирішено було створити окремий скрипт і прописати його в автозавантаження, використовуючи стандартний механізм автозапуску Linux —
/etc/rc.local
. Вміст скрипта:
 
 
# cat /etc/network.sh
#!/bin/bash
/sbin/ip route replace default scope global nexthop via 11.11.8.1 dev eth6 weight 7 nexthop via 22.22.22.17 dev eth5 weight 3
exit 0

 
Його шлях в автозавантаженні:
 
 
# cat /etc/rc.local
#!/bin/sh
touch /var/lock/subsys/local
/bin/bash /etc/network.sh

 
 В результаті після перезавантаження ми отримуємо робочу систему з використанням 2 незалежних АПЛІНК, трафік між якими балансується за допомогою weight. А тепер сумна новина: нічого цього працювати не буде.
 
 
Перебивання налаштувань утилітою Network Manager
Менша проблема з тих, що були на моєму шляху, але яка тим не менш, неабияк попсувала мені нерви. Проблема даної утиліти в тому, що вона зберігає і використовує настройки не з основних конфігураційних файлів системи, а зі своїх внутрішніх. Оскільки стартує вона разом з X11, тобто в саму останню чергу, коли мережа вже запущена, вона перезаписує налаштування мережі, і якихось складних конфігурацій на ній побудувати не вийде.
 
Щоб її відключити, необхідно виконати в консолі:
 
 
sudo /etc/init.d/NetworkManager stop
chkconfig NetworkManager off

 
 Результат
І ось після виконання цієї дії і перезавантаження ми отримуємо робочу систему з використанням 2 незалежних АПЛІНК, трафік між якими балансується за допомогою weight.

Джерело: Хабрахабр

0 коментарів

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