Pull to refresh

Установка JUNIPER VRR через CLI на гипервизоре KVM в LINUX (Centos/Ubuntu). Cеть — macVtap-bridge

Reading time 7 min
Views 3.4K

В определенный момент домашняя лаба (бесшумная - ищите по запросу "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
 SELinux status: disabled:
SELinux status: disabled:

Удаляем 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

Отл:

Libvertd started OK
Libvertd started OK

4. Делаем нашему Centos/Ubuntu - перезагрузку:

reboot

5. На всякий случай (этого (почти) не может быть, но на всякий и чтобы знать как оно устроено) проверяем, - есть ли default network - она должна быть ("таков путь" ):  

virsh net-list –-all
Default-network - есть
Default-network - есть

Если, вдруг, её нет - создаем 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


Большое спасибо Алексею Калинину, изучая работы и шпаргалки которого, я освоил KVM и в частности VRR, а также спасибо Михаилу Шишкову за ценные консультации и помощь в подготовке скрипта "qemu"!

Tags:
Hubs:
+1
Comments 3
Comments Comments 3

Articles