Proxmox VE + ZeroTier One

Поднимаем на хосте виртуализации Proxmox сетевой интерфейс ZeroTier.
Это дает возможность не только взаимодействовать с виртуальными машинами, но и объединять Proxmox в Cluster.

Как всегда инструкция в кратком формате.
Потребовалось предоставить доступ к виртуальным машинам из разных объектов и конечным пользователям.
Конечно можно было поднять Wireguarg или OpenVPN, но это не наш метод.

И так вводные данные.
1. Сеть ZeroTier 192.168.21.0/24, уже настроена и работает
2. На Proxmox установлен ZeroTier и подключен к сети 37e8d15555f555f0, IP 192.168.21.113/24 адрес получен с контроллера.

3. Проверяем ping до 192.168.21.112 ( Удаленный Proxmox pve.ev01.loc ), 192.168.21.193, 192.168.21.192 ( Виртуальные машина с установленым ZeroTier )

Начнем ...
Создадим бридж через веб интерфейс Proxmox с названием vmbr1 и IP 192.168.21.111/24, на данном этапе можно через консоль увидеть что он пуст.
brctl show

Получаем данные по ZeroTier и его сети.
zerotier-cli listnetworks
В ответ получи что-то типа этого
200 listnetworks 37e8d15555f555f0 ev01project f2:18:92:e5:4b:62 OK PRIVATE zt4lysou7j 192.168.21.113/24

ip a ( нам покажет )
5: zt4lysou7j: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether f2:18:92:e5:4b:62 brd ff:ff:ff:ff:ff:ff
inet 192.168.21.113/24 brd 192.168.21.255 scope global enp1z0
valid_lft forever preferred_lft forever
inet6 fe80::f018:92ff:fee5:4b62/64 scope link
valid_lft forever preferred_lft forever

Но при этом он не отображаеться в интерфейсе управление Proxmox.
Решается это так.
Создаем файл devicemap с содержимым. 37e8d15555f555f0 Сеть ZeroTier и enp1z0 название будующего интерфейса
mcedit /var/lib/zerotier-one/devicemap
37e8d15555f555f0=enp1z0

Перезагружаем ZeroTier
systemctl restart zerotier-one.service

Проверяем что интерфейс поменял название с zt4lysou7j на enp1z0, и появился в интерфейсе управления.
5: enp1z0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc pfifo_fast master vmbr1 state UNKNOWN group default qlen 1000
link/ether f2:18:92:e5:4b:62 brd ff:ff:ff:ff:ff:ff
inet 192.168.21.113/24 brd 192.168.21.255 scope global enp1z0
valid_lft forever preferred_lft forever
inet6 fe80::f018:92ff:fee5:4b62/64 scope link
valid_lft forever preferred_lft forever



Не пытайтесь добавить его в бридж это бесполезно, так как ZeroTier стартует после старта сетевых интерфейсов и следовательно не попадет в бридж.
Через консоль он будет выглядеть так
mcedit /etc/network/interfaces

auto vmbr1
iface vmbr1 inet static
address 192.168.21.111/24
bridge-ports none
bridge-stp off
bridge-fd 0
#ZT-Brige

Добавляем сетевой интерфейс enp1z0 в бридж vmbr1
brctl addif vmbr1 enp1z0

Ну и на всякий случай как его удалить
brctl delif vmbr1 enp1z0

Все должно заработать, если настроить виртуальные машины со статически ip адресом ZeroTier.
Но только до первой перезагрузки или рестарта ZeroTier.
Поверьте на слово было много попыток пататься добавить интерфейс enp1z0 в бридж.
Но как показала практика что можно сделать через скрипт вставив всего одну строку.
brctl addif vmbr1 enp1z0

Но опять это не наш метод.
Наш скрипт с кучей полезных функций для образования.

mcedit /root/zt-vmbr.sh
Можно через копипаст.

#############################################

#!/bin/sh

#zerotier-cli listnetworks | grep '200' | awk '!/nwid/ {print $3}'
nwid=37e8d15555f555f0
vmbr=vmbr1

zerotier-cli listnetworks | if grep $nwid >/dev/null
then
echo "ZT OK";
else
echo "ZT NOT OK";
systemctl start zerotier-one.service
sleep 10
fi

dev=$(zerotier-cli listnetworks | grep '200' | awk '!/dev/ {print $8}')
brctl show | if grep $dev >/dev/null
then
echo "brctl OK";
else
echo "brctl NOT OK";
brctl addif $vmbr $dev
ip link set $dev up
fi

#############################################

Или такой какой больше нравится

#############################################

#!/bin/sh
ZT=9e64fc9eb3
VB=vmbr1
EthZT=enp1z0
zerotier-cli status | if grep $ZT >/dev/null
then
echo "ZT OK";
else
echo "ZT NOT OK";
systemctl start zerotier-one.service
sleep 10
fi

brctl show | if grep $EthZT >/dev/null
then
echo "brctl OK";
else
echo "brctl NOT OK";
brctl addif $VB $EthZT
ip link set $EthZT up
fi

###########################################

Устанавливаем права на файл chmod 777 zt-vmbr.sh

Теперь нужно заставить его запускаться после загрузки всех сервисов
Создадим файл zt-vmbr.service для запуска нашего скрипта zt-vmbr.sh
mcedit /usr/lib/systemd/system/zt-vmbr.service

###########################################
[Unit]
Description=Run script at startup zt-vmbr.sh

[Service]
Type=oneshot
ExecStart=/root/zt-vmbr.sh
TimeoutStartSec=0
###########################################

Создадим файл zt-vmbr.timer для запуска с отложенным запуском на 1 минуту после загрузки системы
mcedit /usr/lib/systemd/system/zt-vmbr.timer

###########################################
[Unit]
Description=Run script add ZT to Brige Proxmox

[Timer]
OnBootSec=1min

[Install]
WantedBy=default.target
###########################################

Далее обновим сервисы
systemctl daemon-reload

Отключаем запуск zt-vmbr.service при старте
systemctl disable zt-vmbr.service

В замен включаем таймер zt-vmbr.timer
systemctl enable zt-vmbr.timer

Перезагружаем для проверки работоспособности скриптов
systemctl reboot

На последок собираем кластерю.

Вот и все как всегда Все удачи.