VRRP в Linux | ||
Сети > Маршрутизация У одного молодого развивающегося провайдера на заре становления организации доступа для физ. лиц была принята следующая архитектура для сети:
По мере роста абонентской базы все проблемы из первых трех пунктов решались успешно. А с последним прогнозировались небольшие проблемы:
Если бы технология была PPPoE или PPTP/L2TP все бы решилось простым добавлением сервера (PPPoE) и прописывание round-robin DNS записи для PPTP/L2TP сервера (немного не силен в данной теме, может что и напутал). Для нашей технологии доступа единственным вариантом оставался VRRP. Взять можно здесь. Установку описывать не буду, нет ничего специфичного. Вкратце о VRRP: Создается виртуальный интерфейс на каждом сервере. Один из серверов становится MASTER, другой — BACKUP, причем весь траффик идет через MASTER-сервер. MASTER-сервер отвечает на arp-запросы, BACKUP-сервер молчит. Два сервера обмениваются специальными пакетами, определяющими кто из них является MASTER и его доступность, чтобы BACKUP-сервер в случае недоступности MASTER-сервера сам перешел в состояние MASTER. На страничке про VRRP указан способ балансировки нагрузки, когда поднимаются два виртуальных интерфейса, а по DHCP отдаются разные адреса шлюзов. Я решил использовать другой способ. Т.к. на этих же серверах должны терминироваться vlan-ы, то для каждого из vlan-ов будет один вируальный интерфейс, только для нечетного номера vlan MASTER-ом будет сервер №1, а сервер №2 будет BACKUP. Для четных номеров vlan всё будет с точностью до наоборот — сервер №1 будет BACKUP, а №2 — MASTER. Т.к. интерфейсов достаточно много, то маршрутизируемый траффик будет делиться примерно поровну. Итак, готовое решение: Интерфейсы сервера №1 (номер vlan, ip-адрес интерфейса, статус в VRRP): 1 10.0.1.2 MASTER 2 10.0.2.2 BACKUP 3 10.0.3.2 MASTER ... 254 10.0.254.2 BACKUP 255 10.0.255.2 MASTER Сервер №2 (номер vlan, ip-адрес интерфейса, статус в VRRP): 1 10.0.1.3 BACKUP 2 10.0.2.3 MASTER 3 10.0.3.3 BACKUP ... 254 10.0.254.3 MASTER 255 10.0.255.3 BACKUP Виртуальные же интерфесы будут иметь адреса (номер vlan, ip-адрес): 1 10.0.1.1 2 10.0.2.1 3 10.0.3.1 ... 254 10.0.254.1 255 10.0.255.1 Как настраивать физические интерфейсы описывать не буду — материала по этой теме полно. Для автоматической загрузки vrrp при запуске системы в /etc/init.d/ создаем стартовый скрипт (можно написать свой или воспользоваться готовыми шаблонами в интернете, благо легко находятся). Суть в том, чтобы запустить по одному процессу для каждого интерфейса. На bash наваял простенький скриптик который генерит что-то подобное для сервера №1: /bin/vrrpd -i eth1.1 -v 1 10.0.1.1 -p 255 /bin/vrrpd -i eth1.2 -v 2 10.0.2.1 -p 100 /bin/vrrpd -i eth1.3 -v 3 10.0.3.1 -p 255 ... /bin/vrrpd -i eth1.254 -v 254 10.0.254.1 -p 100 /bin/vrrpd -i eth1.255 -v 255 10.0.255.1 -p 255 И для сервера №2: /bin/vrrpd -i eth1.1 -v 1 10.0.1.1 -p 100 /bin/vrrpd -i eth1.2 -v 2 10.0.2.1 -p 255 /bin/vrrpd -i eth1.3 -v 3 10.0.3.1 -p 100 ... /bin/vrrpd -i eth1.254 -v 254 10.0.254.1 -p 255 /bin/vrrpd -i eth1.255 -v 255 10.0.255.1 -p 100 В этих примерах: /bin/vrrpd — путь для исполняемого файла -i eth1.1 — физический интерфейс, на котором будет поднят виртуальный -v 1 — id группы vrrp (групп может быть не больше 255) 10.0.1.1 — ip-адрес виртуального интерфейса -p 255 — приоритет сервера, чем больше, тем приоритетнее. По-умолчанию принято, что приоритет 255 у сервера который является MASTER-ом. После того как запустится vrrp у виртуального интерфейса MAC-адрес будет 00:00:5E:00:01:xx, где xx — id группы VRRP. Также маршрутизаторы начнут обмениваться пакетами объявляющими свое состояние. Эти пакеты мультикастовые, надо следить чтобы в коммутаторах через которые соединены эти два сервера не фильтровались мультикасты на адрес 224.0.0.18. И теперь сконфигурируем iptables для того, чтобы сам сервер не фильтровал нужные пакеты. Добавим следующие строки в файл /etc/sysconfig/iptables: :allow_vrrp - [0:0] # Создадим отдельную цепочку для протокола vrrp -A RH-Firewall-1-INPUT -p 112 -j allow_vrrp # Перенаправляем пакеты с номером протокола 112 (номер протокола vrrp) в созданную цепочку -A allow_vrrp -s 10.0.1.0/30 -j ACCEPT # разрешаем прохождение пакетов только для подсети серверов -A allow_vrrp -s 10.0.2.0/30 -j ACCEPT -A allow_vrrp -s 10.0.3.0/30 -j ACCEPT ... -A allow_vrrp -s 10.0.254.0/30 -j ACCEPT -A allow_vrrp -s 10.0.255.0/30 -j ACCEPT -A allow_vrrp -j LOG --log-level notice # логгируем всё лишнее -A allow_vrrp -j DROP # и отбрасываем Всё. Результат:
Особо дотошные абоненты заметили только странность при трассировке удаленных хостов. Странность выглядит примерно так: tracert ya.ru 0 10.0.34.35 # ip абонента 1 10.0.34.3 # ip заканчивается на .3, хотя шлюз в системе стоит оканчивающийся на .1 P.S. Вообще-то при внедреннии в продакшн этой пары серверов мною были освоены и другие технологии, с которыми я раньше не имел дела (LACP, OSPF), но больше всего было интересно разбираться именно с VRRP. Источник: http://habrahabr.ru/blogs/linux/128770/ |
||
Комментарии | ||