Данная статья является пошаговым руководством по установке Juniper VRR на KVM в Linux Centos или Ubuntu. VRR будет смотреть в локальную сеть, поэтому с ним можно будет поднять соседство с железных сетевых устройств.
Сеть будет настроена с помощью macvtap-бриджа в LAN. Будет также создан скрипт qemu, включающий мультикаст на macVtap-интерфейсах, возникающих при старте виртуальной машины, благодаря чему с ней можно будет поднять OSPF-соседство.
Centos или Ubuntu могут быть реальными или виртуальными.
В данном примере:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
Проверяем, должно ответить, что SELinux status: disabled:
sestatus
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
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils net-tools virtinst virt-manager
sudo usermod -aG kvm avk
systemctl start libvirtd
systemctl enable libvirtd.service
service libvirtd status
Отл:
Libvertd started OK
Default-network - есть
Если, вдруг, её нет - создаем default network в режиме NAT:
nano /tmp/default.xml
Копи-пастим туда вот это:
<network>
<name>default</name>
<bridge name="virbr0"/>
<forward mode="nat"/>
<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>
Теперь используем наш default.xml для создания default-network:
virsh net-define /tmp/default.xml
virsh net-start default
virsh net-autostart default
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
"]https://habrastorage.org/r/w1560/ge...ab/af25cd6ab86e41f76365f324f6d0c997.png[/IMG]
Распаковываем:
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/
В том окне, где мы запустили инсталляцию будет “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" нужен, чтобы установка завершилась. После чего можно переходить к настройке сети.
Выясняем имя сетевой карты Centos/Ubuntu, смотрящей в LAN:
ip address
Выяснив, что (в данном примере) имя нашей сетевой карты, смотрящей в LAN = “eno16777736”, идём в следующий пункт.
Попадаем в редактирование (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 это будет:
press Escape
shift +:
wq!
Ctrl+X
Машина запускается, смотрим ещё раз сеть командой ip address.
Должен появиться хотя бы один MACVTAP-интерфейс, выполняющий бриджинг виртуального сетевого интерфейса VRR “e1000” в интерфейс Centos – “eno16777736” – и далее в LAN:
После окончания загрузки - заходим на консоль vrr20:
virsh console vrr20
login root
cli
show interfaces terse
Должен быть виден (хотя бы) em0.
show interface terse
Назначаем на 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
Решением будет создать скрипт с именем "qemu", включающий мультикаст на возникающих при старте машины macvtap-интерфейсах, и положить его в /etc/libvirt/hooks
Cначала выключим машину:
virsh shutdown vrr20
Создаём скрипт:
nano /etc/libvirt/hooks/qemu
Добавляем следующий текст:
#!/bin/bash
for A in $(ifconfig | grep -E macvtap | cut -d: -f1)
do
ifconfig $A allmulti
done
Делаем скрипт исполняемым:
chmod +x /etc/libvirt/hooks/qemu
KVM при старте машины автоматически проверяет существование файла в директории /etc/libvirt/hooks/и запускает его при старте виртуальных машин.
Включаем машину:
virsh start vrr20
Смотрим, активировался ли мультикаст на macvtap-интерфейсах:
ip address | grep macvtap | grep ALLMULTI
Отл:
ip address | grep macvtap | grep ALLMULTI
Проверяем show ospf neighbor:
virsh list –all --inactive
virsh net-list –all --inactive
virsh pool-list
virsh pool-info images
virsh pool-dumpxml images
Найти файл нашего VRR:
Источники:
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
Сеть будет настроена с помощью macvtap-бриджа в LAN. Будет также создан скрипт qemu, включающий мультикаст на macVtap-интерфейсах, возникающих при старте виртуальной машины, благодаря чему с ней можно будет поднять 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 ip = 172.24.224.26/27
- Linux user = “avk”
1. Устанавливаем Сentos или Ubuntu.
А) Вариант с Centos
Для 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 avksudo usermod -aG kvm avk
3. Активируем сервис LIBVIRTD:
systemctl enable libvirtdsystemctl start libvirtd
systemctl enable libvirtd.service
service libvirtd status
Отл:
4. Делаем нашему Centos/Ubuntu - перезагрузку:
reboot5. На всякий случай (этого (почти) не может быть, но на всякий и чтобы знать как оно устроено) проверяем, - есть ли default network - она должна быть ("Таков Путь"):
virsh net-list –-allЕсли, вдруг, её нет - создаем default network в режиме NAT:
nano /tmp/default.xml
Копи-пастим туда вот это:
<network>
<name>default</name>
<bridge name="virbr0"/>
<forward mode="nat"/>
<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>
Теперь используем наш 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. Копируем образ в /var/lib/libvirt/images/vrr20/ - с помощью MC либо WinSCP:
[IMG alt=""]https://habrastorage.org/r/w1560/ge...ab/af25cd6ab86e41f76365f324f6d0c997.png[/IMG]
Проверяем 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 - одной строкой с помощью утилиты 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 это будет:
press Escape
shift +:
wq!
Если nano, то:
Ctrl+O + press EnterCtrl+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.
show interface terse
Назначаем на 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 и положить туда что-то вроде @rebootmacvtap0 allmultiРешением будет создать скрипт с именем "qemu", включающий мультикаст на возникающих при старте машины macvtap-интерфейсах, и положить его в /etc/libvirt/hooks
Cначала выключим машину:
virsh shutdown vrr20
Создаём скрипт:
nano /etc/libvirt/hooks/qemu
Добавляем следующий текст:
#!/bin/bash
for A in $(ifconfig | grep -E macvtap | cut -d: -f1)
do
ifconfig $A allmulti
done
Делаем скрипт исполняемым:
chmod +x /etc/libvirt/hooks/qemu
KVM при старте машины автоматически проверяет существование файла в директории /etc/libvirt/hooks/и запускает его при старте виртуальных машин.
Включаем машину:
virsh start vrr20
Смотрим, активировался ли мультикаст на macvtap-интерфейсах:
ip address | grep macvtap | grep ALLMULTI
Отл:
Проверяем show ospf neighbor:
Полезные команды VIRSH:
cd /etc/libvirt/qemu/virsh list –all --inactive
virsh net-list –all --inactive
virsh pool-list
virsh pool-info images
virsh pool-dumpxml images
Найти файл нашего VRR:
Источники:
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
Установка JUNIPER VRR через CLI на гипервизоре KVM в LINUX (Centos/Ubuntu). Cеть — macVtap-bridge
В определенный момент домашняя лаба (бесшумная - ищите по запросу "Totally silent (fanless) LAB") доросла до потребности в RR (route-reflector) - чтобы не поднимать сессии между всеми устройствами, -...
habr.com