В определенный момент домашняя лаба (бесшумная - ищите по запросу "Totally silent (fanless) LAB") доросла до потребности в RR (route-reflector) - чтобы не поднимать сессии между всеми устройствами, - не разводить в квартире full-mesh , а поднять c каждого устройства лишь одну сессию - с RR.
Было решено использовать Juniper VRR - крутиться он может на чём угодно, подойдет (относительно) старый комп или ноут, где есть хотя бы 6GB RAM.
Данная статья является пошаговым руководством по установке Juniper VRR на KVM в Linux Centos или Ubuntu. VRR будет смотреть в локальную сеть, поэтому с ним можно будет поднять соседство с железных (или других виртуальных) сетевых устройств.
Сеть будет настроена с помощью macvtap-бриджа в LAN. Будет также создан скрипт qemu, включающий мультикаст на macVtap-интерфейсах, возникающих при старте виртуальной машины, благодаря чему с ней можно будет поднять OSPF, чтобы затем поднять BGP (чтобы в лабе было как в жизни: у BGP был маршрут до соседей не статикой, - а динамически от OSPF).
Centos или Ubuntu могут быть реальными или виртуальными.
В данном примере:
subnet = 172.24.224.0/27
GW = 172.24.224.10
Linux with KVM ip = 172.24.224.18/27
VRR 20 ipv4 = 172.24.224.26/27
Linux user = “avk”
1. Устанавливаем Сentos или Ubuntu.
А) Вариант с Centos.
Ставим CentOS-7-x86_64-Minimal-1511.iso - например, в VMWARE.
После установки в Centos необходимо сначала сделать DISABLE SELINUX:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
Проверяем, должно ответить, что SELinux status: disabled:
sestatus
Удаляем NetworkManager:
yum remove NetworkManager
В случае лабы можно сделать:
systemctl disable firewalld
systemctl stop firewalld
systemctl status firewalld
*Либо не выключаем, но тогда разрешаем всё, что нужно.
yum update
Ставим полезное:
yum install -y mc at nano vim wget open-ssh openssh-clients man bind-utils bzip2 unzip zip ntp sysstat bash-completion vnstat net-tools lsof tcpdump groupinstall virtualization-client virtualization-platform virtualization-tools open-vm-toolssols
Cтавим KVM + необходимое остальное:
yum install-y kvm qemu-kvm qemu-img libvirt python-virtinst bridge-utils virt-install libvirt-python bridge-utils virt-manager virt-viewer libguestfs-tools libvirt-client libguestfs
Б). Вариант с Ubuntu
Ставим Ubuntu, например 21 server.
Устанавливаем в нём KVM + необходимое:
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils net-tools virtinst virt-manager
Далее - ОДИНАКОВО для Centos/Ubuntu > > >
2. Добавляем своего пользователя (здесь пользователь - “avk”) в группы libvirt и kvm:
sudo usermod -aG libvirt avk
sudo usermod -aG kvm avk
3. Активируем сервис LIBVIRTD:
systemctl enable libvirtd
systemctl start libvirtd
systemctl enable libvirtd.service
service libvirtd status
Отл:
4. Делаем нашему Centos/Ubuntu - перезагрузку:
reboot
5. На всякий случай (этого (почти) не может быть, но на всякий и чтобы знать как оно устроено) проверяем, - есть ли default network - она должна быть ("таков путь" ):
virsh net-list –-all
Если, вдруг, её нет - создаем default network в режиме NAT:
nano /tmp/default.xml
Копипастим туда вот это:
<network>
<name>default</name>
<forward mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
</forward>
<bridge name='virbr0' stp='on' delay='0'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
Теперь используем наш default.xml для создания default-network:
virsh net-define /tmp/default.xml
virsh net-start default
virsh net-autostart default
6. Создаём STORAGE POOL с именем “images”:
virsh pool-define-as images dir - - - - "/var/lib/libvirt/images"
virsh pool-list --all
virsh pool-build images
virsh pool-start images
virsh pool-autostart images
virsh pool-info images
Теперь KVM настроен, можно начинать установку Juniper VRR, например вот этого:
vrr-bundle-kvm-20.4R1-S1.2.tgz
В распакованном виде, Juniper VRR версии 20 состоит из двух файлов:
junos-x86-64-20.4R1-S1.2.img
metadata.img
7. Копируем архив .tgz (либо эти два образа) в /var/lib/libvirt/images/vrr20/ - с помощью MC либо WinSCP:
Проверяем MD5:
md5sum vrr-bundle-kvm-20.4R1-S1.2.tgz
Распаковываем:
tar -xvf vrr-bundle-kvm-20.4R1-S1.2.tgz
После распаковки появится подпапка с именем, например, 20.4R1-S1.2 – из которой (лично мне так удобнее) файлы перемещаем в папку vrr20:
mv /var/lib/libvirt/images/vrr20/20.4R1-S1.2/* /var/lib/libvirt/images/vrr20/
ТОРЖЕСТВЕННЫЙ МОМЕНТ
8. Запускаем инсталляцию VRR в KVM - одной строкой - с помощью утилиты virt-install импортом двух дисков с именами junos-x86-64-20.4R1-S1.2.img и metadata.img. RAM = 4192 mb:
virt-install --name vrr20 --ram 4192 --import --disk=/var/lib/libvirt/images/vrr20/junos-x86-64-20.4R1-S1.2.img --import --disk=/var/lib/libvirt/images/vrr20/metadata.img
В том окне, где мы запустили инсталляцию будет “Waiting for the installation to complete":
Чтобы попасть в саму установку JUNOS - в отдельном терминале до этой машины говорим:
virsh console vrr20
Дожидаемся окончания установки, логинимся root, ставим пароль на root и выключаем машину:
set system root-authentication plain-text-password Passvd_2000
commit
Request system power-off
"Request system power-off" нужен, чтобы установка завершилась. После чего можно переходить к настройке сети.
ВТОРОЙ ТОРЖЕСТВЕННЫЙ МОМЕНТ
9. Настройка сети (MACvTAP-bridge to LAN)
После request system power-off (машина VRR20 выключается) появляется файл vrr20.xml, в котором мы будем редактировать настройку сети – сделаем bridge в LAN с помощью MACVTAP.
Выясняем имя сетевой карты Centos/Ubuntu, смотрящей в LAN:
ip address
Выяснив, что (в данном примере) имя нашей сетевой карты, смотрящей в LAN = “eno16777736”, идём в следующий пункт.
10. Редактируем выключенную машину vrr20:
virsh edit --domain vrr20
Попадаем в редактирование (vi либо nano) xml-документа. Скроллим вниз до <interface type=’network’ – это сетевой интерфейс, который создается автоматически при инсталляции VRR:
Заменяем весь этот блок - <interface> на новый. В нём “type network”, заменяется на ‘direct’, а source network заменяем на source dev=eno1677736 (выясненное в пункте 9):
<interface type='direct'>
<source dev='eno16777736' mode='bridge'/>
<model type='e1000'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
Обратите внимание на "slot='0x03'" – делаем в нашем новом блоке таким же, как в том который было до этого, либо любое другое значение, но не повторяющееся больше ни разу в файле!
Проверить можно заранее сделав cat + grep по xml-файлу нашего vrr20.xml (ну или grep -i "slot=" /etc/libvirt/qemu/vrr20.xml) :
cat /etc/libvirt/qemu/vrr20.xml | grep “slot=”
Здесь видно, что для второго интерфейса можно взять, например, слот 0x08, т.к. как он ни разу в файле не встречается. Второй интерфейс может понадобиться для mgmt или резервирования доступности VRR. В VMWARE можно сделать, например, один сетевой интерфейс нашего Centos/Ubuntu в режиме NAT, второй - bridge.
Заканчиваем редактирование vrr20. Если редактор VI это будет Escape, shift + :, wq! + enter. В случае с nano - ctrl+O + Enter + Ctrl+X.
11. Запускаем VRR20
virsh start --domain vrr20
Машина запускается, смотрим ещё раз сеть командой ip address.
Должен появиться хотя бы один MACVTAP-интерфейс, выполняющий бриджинг виртуального сетевого интерфейса VRR “e1000” в интерфейс Centos – “eno16777736” – и далее в LAN:
После окончания загрузки - заходим на консоль vrr20:
virsh console vrr20
login root
cli
show interfaces terse
Должен быть виден (хотя бы) em0.
Назначаем на em0 адрес в нашей LAN, у меня это 172.24.224.26:
set interfaces em0 unit 0 family inet 172.24.224.26/27
set system host-name VRR20_LAB
commit
Должен запинговаться default GW в LAN:
Казалось-бы - ура, можно поднимать с RR OSPF и BGP, но, не всё так просто ----------> см. пункт 12
ТРЕТИЙ ТОРЖЕСТВЕННЫЙ МОМЕНТ
12. Мультикаст на MACVTAP-интерфейсах по-умолчанию выключен и его необходимо на них включить.
Здесь необходимо учесть, что KVM создает macvtap-интерфейсы только после старта машины! Поэтому нельзя просто так взять и сказать, например, crontab -e и положить туда что-то вроде @rebootipconfig macvtap0 allmulti
Решением будет создать скрипт с именем "qemu", включающий мультикаст на создающихся при старте машины macvtap-интерфейсах, и положить его в папку /etc/libvirt/hooks
Cначала выключим машину. Из самого VRR: request system power-off
Или из Линупса: virsh shutdown vrr20
Создаём папку и затем скрипт в ней:
mkdir /etc/libvirt/hooks
nano
/etc/libvirt/hooks/qemu
Добавляем следующий текст:
#!/bin/bash
for A in $(ifconfig | grep -E macvtap | cut -d: -f1)
do
ifconfig $A allmulti
done
Сохраняем и выходим: CTRL+O + CTRL+X
Делаем скрипт исполняемым:
chmod +x /etc/libvirt/hooks/qemu
KVM при старте машины автоматически проверяет существование файла в директории /etc/libvirt/hooks/
и запускает его при старте виртуальных машин.
Включаем машину:
virsh start vrr20
Смотрим, активировался ли мультикаст на macvtap-интерфейсах:
ip address | egrep 'macvtap.*ALLMULTI'
Здесь видно, что появились два macvtap-интерфейса:
macvtap0=ens33=em0 в VRR,
macvtap1 = ens34 = em1 в VRR
Проверяем show ospf neighbor:
Полезные команды VIRSH:
cd /etc/libvirt/qemu/ -
перейти в папку qemu
virsh list –all --inactive -
вывести список всех машин, даже выключенных
virsh net-list –all --inactive
- список настроенных сетей KVM
virsh pool-list -
показать какие настроены ПУЛЫ хранения вирт-машин
virsh pool-info images -
информация о хранилище образов "images"
virsh pool-dumpxml images
- вывести инфо о папке images в XML
virsh autostart vrr20
- сделать автостарт машины при запуске Линукса
Найти файл нашего VRR:
find / -name *.xml | grep vrr20
Источники:
https://sites.google.com/site/wikapim/virtual/kvm/kvm_hooks
https://sites.google.com/site/wikapim/networks/juniper/juniper_vrr
https://www.math.cmu.edu/~gautam/sj/blog/20140303-kvm-macvtap.html
https://github.com/yoriyatana/VRR-on-KVM
Большое спасибо Михаилу Шишкову за ценные консультации и помощь в подготовке скрипта "qemu"!
aol-nnov
Я дико извиняюсь, но странность статьи зашкаливает, на мой взгляд. Не находит ли автор, что если кому-то приспичит хотеть juniper vrr (кстати, тут тема так и не раскрыта), то уж ищущий будет в состоянии установить с нуля какой-то линукс и уж, тем более, выйти из vim?!
Статье требуется доработка - вместо воды a-la ставим линупс по инструкции, можно было бы сделать небольшой экскурс в историю и рассказать о vrr, сферах его применения и тп.
avk808707 Автор
Добрый день!
Спасибо за Ваш комментарий!
1) Про установку линупса - ничего нет, только, что, мол, их надо поставить и далее - какие пакеты установить для kvm'а.
2) Насчет того, что статья для новичков и не-новичков одновременно - так и есть.
3) Выйти из VI - вот решил чтобы было. Детишки могут и не знать, только nano...
4) Насчет экскурса в Историю и зачем вообще RR и VRR - интересное предложение, согласен, добавлю.