Ubuntu Server 16.04 добавление KVM виртуальной машина

Submitted by Too on Tue, 05/04/2021 - 15:48

Есть нормальный ПК и кучка задач для сервера с кастомным ПО. Задачи не требуют постоянного аптайма и не хочется тратиться на хороший выделенный сервер, который, например, потянет 2-3 терминальных тонких клиента, которые пооткрывают десяток вкладок в хроме (и хромы сожрут всю оперативку, если ее мало). Задач целый список: терминальный сервер для тонких клиентов, voip сервер (elastix), бэкап сервер, puppet, node.js и nginx для внутренних нужд и ботов Слака. Решение: чтобы сохранить масштабируемость, гибкость и защиту - делаем систему модульной программно, оставляя все в одной железке с помощью виртуальных машин. Поехали!

1. Установка KVM

0. Проверка процессора

Для нормальной работы нам нужно аппаратное ускорение виртуализации на уровне процессора. Без поддержки аппаратной виртуализации KVM сможет воздавать и запускать виртуальные машины, но работать они будут намного медленнее Проверяем это с помощью команды. Должна быть цифра больше 0.

egrep -c '(vmx|svm)' /proc/cpuinfo

(в моем случае получил ответ 4)

1. Устанавливаем KVM

sudo apt-get install qemu-kvm libvirt-bin virtinst bridge-utils cpu-checker

Кроме самой KVM устанавливаем вспомогательный софт.

2. Проверяем что KVM может быть использован в нашей системе

$ kvm-ok
INFO: /dev/kvm exists
KVM acceleration can be used

3. Добавим нашего рабочего юзера в группу...

с с разрешением работать с виртуальными машинами. эта группа называется libvirtd

$ sudo gpasswd -a toopro libvirtd 

Добавление пользователя toopro в группу libvirtd

4. Сетевой мост между виртуальными машинами и системой.

Если не создавать мост, то гостевая система не будет видна снаружи и сетевой доступ к ней будет только внутри одного системника, что не подходит нам. Поэтому нам нужно создать сетевой мост между гостевой системой и ее хостящей ОС. Внимание, большинство беспроводных устройств не поддерживают соединения типа мост. В версии Ubuntu Server 16.04 после установки вышеуказанных утилит мы уже имеем автоматически созданный виртуальный мост. Проверить это можно запустив команду:

$ sudo ip addr show
# либо коротко
$ ls /sys/class/net
# либо список всех мостов
$ sudo brctl show

вы должны увидеть в списке virbr0.

Установка виртуальных систем

Смотрим текущий список виртуальных систем:

$ sudo virsh -c qemu:///system list

Скачиваем дистрибутив нужной виртуалки:

1. Переходим в папку с виртуальными машинами

$ sudo cd /var/lib/libvirt/boot/

2. Скачиваем iso образ по прямой ссылке:

$ sudo wget http://....ubuntu-server...

Создаем виртуальную мушину:

Используем команду virt-install

$ sudo virt-install \
--virt-type=kvm \
--name vrpuppet \
--ram 2048 --vcpus=2 --hvm \
--os-variant=ubuntu16.04 \
--cdrom=/var/lib/libvirt/boot/ubuntu-16.04.2-server-amd64.iso \
--disk path=/var/lib/libvirt/images/puppetv0.qcow2,size=40,bus=virtio,format=qcow2 \
--network bridge=virbr0,model=virtio \
--graphics vnc,port=5911
  • virt-type - тип виртуализации, в нашем случае kvm;
  • name - имя новой машины;
  • ram - количество памяти в мегабайтах;
  • vcpus - количество ядер процессора;
  • os-variant - тип операционной системы (osinfo-query os);
  • cdrom - установочный образ системы;
  • network - сетевой мост, который мы настроили ранее (sudo virsh net-info default);
  • graphics - способ получения доступа к графическому интерфейсу (vnc потребуется для завершения установки);
  • disk - адрес нового жесткого диска для этой виртуальной машины, формат и объем;

Проверям что машина создана и работает:

$ sudo virsh list для автозапуска виртуалки после старта хостовой системы пропишем:

$ sudo virsh autostart vrpuppet

(для удаления из автозапуска: virsh autostart vrpuppet --disable)

Подключаемся к виртуальной машине:

После завершения установки виртуальной машины вы можете узнать параметры подключения по VNC с помощью команды:

$ sudo virsh vncdisplay vrpuppet

(к результату порта добавляем 5900, чтобы получить нужный порт) Используем Remmina на другой машине в локальной сети, настроив vnc подключение с помощью ssh тоннеля (например: vnc server: 192.168.8.220:5911; enable ssh tunnel, отметить tunnel via loopback address) Должно открыться окно с настройкой установки.

SSH НА НОВОЙ ВИРТУАЛЬНОЙ МАШИНЕ

Чтобы подключаться к виртуальной машине удаленно напрямую (редактирование файлов, подключениен sshfs файловой системы), нужно установить openssh-server на ней, поменять порт (чтобы не было конфликта) и пробросить его с помощью iptables, чтобы при обращении к гостевой kvm машине на выбранный порт у нас запрос шел к нужному гостю.

Устанавливаем ssh-сервер на виртуалке

$vrpuppet: sudo apt install openssh-server

меняем порт

sudo nano /etc/ssh/sshd_config

заменям строку, напрммер будет порт 2221 Port 2221 (по идее можно будет перегрузить openssh сервер чтобы принять изменения, но мы все равно будет перегружать целую систему дальше)

НА ХОСТЕ ВИРТУАЛЬНЫХ СИСТЕМ:

$ sudo nano /etc/libvirt/hooks/qemu

добавим

#!/bin/bash
# FORWARD puppet port to puppet  virtual host
if [ "${1}" = "vrpuppet" ]; then

  #variables
  GUEST_IP=192.168.122.228 #to find this ip use "ifconfig" on virtual guest system
  GUEST_PORT=2221
  HOST_PORT=2221

  if [ "${2}" = "stopped" ] || [ "${2}" = "reconnect" ]; then
    /sbin/iptables -D FORWARD -o virbr0 -d $GUEST_IP -j ACCEPT
    /sbin/iptables -t nat -D PREROUTING -p tcp --dport $HOST_PORT -j DNAT --to $GUEST_IP:$GUEST_PORT
  fi

  if [ "${2}" = "start" ] || [ "${2}" = "reconnect"]; then
    /sbin/iptables -I FORWARD -o virbr0 -d $GUEST_IP -j ACCEPT
    /sbin/iptables -t nat -I PREROUTING -p tcp --dport $HOST_PORT -j DNAT --to $GUEST_IP:$GUEST_PORT
  fi

fi

дадить файлу права на исполнение:

chmod +x /etc/libvirt/hooks/qemu

перегружаем libvirt

sudo systemctl restart libvirtd

и запускаем гостевую систему

sudo virsh start vrpuppet

проверяем что в прероутинге у нас есть нужные порты, командой:

sudo iptables -L -vt nat

ПРОВЕРКА: на удаленной любой машине прописываем адрес машины хоста kvm (он же у нас папет сервер), указываем порт 2221 и мы должны войти в консоль папет гостя, вместо основной машины:

$anyPC: ssh toopro@puppet.toopro.org -p2221

---------- Ошибки в консоли хости типа таких:

kvm: 3138: cpu0 unhandled rdmsr: 0xc0010112 
kvm: 3138: cpu0 unhandled rdmsr: 0х034

Можно убрать:

echo 1 > /sys/module/kvm/parameters/ignore_msrs

---------- После установки и настройки гостевой ОС, ВМ можно клонировать командой sudo virt-clone -o vsrv1 -n vsrv2 -f vsrv2.img --connect=qemu:///system

$ sudo virsh shutdown vrpuppet
$ sudo virt-clone \
     --original demo \
     --auto-clone
$ sudo virsh list --all

UPD: После клонирования для того, чтобы заработал сетевой интерфейс необходимо на клоне удалить файл /etc/udev/rules.d/70-persistent-net.rules ну и заодно изменить в /etc/hostname и в /etc/hosts имя сервера на новое. -------------------

elastix 2.5

# переходим в папку с бутами
$ cd /var/lib/libvirt/boot/
# скачиваем имейдж эластикса
$ sudo wget https://excellmedia.dl.sourceforge.net/project/elastix/Elastix%20PBX%20Appliance%20Software/2.5.0/latest/Elastix-2.5.0-STABLE-x86_64-bin-08may2015.iso

sudo virt-install \
--name elastix-2.5 \
--ram 512 \
--vcpus 1 \
--os-type linux \
--os-variant=rhel6 \
--graphics none \
--network bridge=virbr0,model=virtio -v -x “console=ttyS0″ \
--disk path=/var/lib/libvirt/images/elastix-2.5.img,bus=virtio,size=40 -l /var/lib/libvirt/boot/Elastix-2.5.0-STABLE-x86_64-bin-08may2015.iso

------ $ sudo brctl addbr bridge0 $ sudo ip addr show $ sudo addif bridge0 eth0 ------------- PUPPET: https://www.8host.com/blog/ustanovka-puppet-4-v-ubuntu-16-04/ 1. add A record to domain with server IP address: puppet.toopro.org 2. Добавляем репозиторий папета и устанавливаем его: curl -O https://apt.puppetlabs.com/puppetlabs-release-pc1-xenial.deb sudo dpkg -i puppetlabs-release-pc1-xenial.deb sudo apt-get update sudo apt-get install puppetserver По умолчанию мастер Puppet использует 2 Гб RAM. Как раз столько мы и давали виртуальной машине, но ему нужно на 10% больше указанного в яве, а еще и сама система висит в оперативке, поэтому придется дать конкретной виртуальной машине больше RAM. Увеличиваем оперативку VM: $ sudo virsh sutdown vrpuppet $ sudo virsh setmaxmem vrpuppet 3G --config $ sudo virsh setmem vrpuppet 3G --config $ sudo virsh start vrpuppet Добавляем ссылку на команду puppet в /usr/bin/, чтобы можно было быстро обращаться к паппету, не используя длинный адрес: $ sudo ln -s /opt/puppetlabs/bin/puppet /usr/bin/puppet Если вы будете использовать внешний dns адрес для папетсервера, то он должен быть указан в настройках puppet.conf, поэтому пропишем в конфиг папета имя сервера в файле /etc/puppetlabs/puppet/puppet.conf: dns_alt_names = puppet.toopro.org Теперь нужн перегенерировать сертификаты сервера, перед этим остановив сервер папета и удалив старые: sudo service puppetserver stop sudo puppet cert clean vrpuppet sudo puppet cert generate vrpuppet --dns_alt_names puppet.toopro.org, puppet.example.com sudo service puppetserver start Puppet Server использует порт 8140. //Откройте его в брандмауэре. //sudo ufw allow 8140 Профорвардим его на роутерах к нужному нам серверу с KVM (тут уже зависит от роутера как вы это сделаете) Теперь форвардим порт с хоста на гостевую систему: https://help.ubuntu.com/community/KVM/Networking#line-456 https://wiki.libvirt.org/page/Networking#Forwarding_Incoming_Connections

НА ХОСТЕ ВИРТУАЛЬНЫХ СИСТЕМ:

$ sudo nano /etc/libvirt/hooks/qemu добавим (файл должен быть уже создан ранее для openssh сервера)

#!/bin/bash
# FORWARD puppet port to puppet  virtual host
if [ "${1}" = "vrpuppet" ]; then

  #variables
  GUEST_IP=192.168.122.228 #to find this ip use "ifconfig" on virtual guest system
  GUEST_PORT=8140
  HOST_PORT=8140

  if [ "${2}" = "stopped" ] || [ "${2}" = "reconnect" ]; then
    /sbin/iptables -D FORWARD -o virbr0 -d $GUEST_IP -j ACCEPT
    /sbin/iptables -t nat -D PREROUTING -p tcp --dport $HOST_PORT -j DNAT --to $GUEST_IP:$GUEST_PORT
  fi

  if [ "${2}" = "start" ] || [ "${2}" = "reconnect"]; then
    /sbin/iptables -I FORWARD -o virbr0 -d $GUEST_IP -j ACCEPT
    /sbin/iptables -t nat -I PREROUTING -p tcp --dport $HOST_PORT -j DNAT --to $GUEST_IP:$GUEST_PORT
  fi

fi

перегружаем libvirt sudo systemctl restart libvirtd и запускаем гостевую систему sudo virsh start vrpuppet проверяем что в прероутинге у нас есть нужные порты, командой: sudo iptables -L -vt nat -------------

НА ГОСТЕВОЙ СИСТЕМЕ С ПАПЕТ СЕРВЕРОМ:

Чтобы запустить Puppet, используйте команду systemctl: $ sudo systemctl start puppetserver Чтобы убедиться, что запуск сервера прошёл успешно, введите: $ sudo systemctl status puppetserver Тоже самое можно сделать с помощью service $ sudo service puppetserver start $ sudo service puppetserver status Теперь можно настроить автозапуск сервера: $ sudo systemctl enable puppetserver -------------

НА УДАЛЕННЫХ КЛИЕНТАХ:

Установка агентов Puppet (на клиенты) Добавляем репозиторий папетлабс и устанавливаем агента(клиента) wget https://apt.puppetlabs.com/puppetlabs-release-pc1-xenial.deb sudo dpkg -i puppetlabs-release-pc1-xenial.deb sudo apt-get update sudo apt-get install puppet-agent Мы будем использовать папет для открытой сети (не внутри одной сети), поэтому предполагаем, что внешняя служба ресолвинга DNS у нас будет доступна. Заранее пропишем в A запись DNS любого нашего домена IP адрес сервера с папетом (то есть поддомен будет ссылаться на другой IP с puppet master). Я создал поддомен puppet.toopro.org. Прописываем этот сервер в конфиг папета на агенте: sudo nano /etc/puppetlabs/puppet/puppet.conf добавим строки: [agent] # если сервер будет менять IP то его легко будет ресолвить по этому адресу server = puppet.toopro.org # текущая настойка для компьютеров в магазинах enviroment = shops # агент может запрашивать обновления не так часто (по умолчанию 30m) runinterval = 12h Если нужно быстренько начать юзать агента, без DNS, то можно просто в /etc/hosts клиента прописать IP хоста с именем "puppet": $ sudo nano /etc/hosts дописываем строку 255.255.255.255 puppet Запустите агент и включите его автозапуск: sudo systemctl start puppet sudo systemctl enable puppet ----------------

НА СИСТЕМЕ С ПАПЕТ СЕРВЕРОМ:

После первого запуска агент Puppet отправляет мастеру запрос на подпись сертификата. Прежде чем подключиться к ноде, мастер должен подписать этот сертификат. sudo puppet cert list вы увидите список запросов Чтобы подписать сертификат, используйте команду puppet cert sign. В команде нужно указать имя хоста сертификата, которое можно найти в запросе на подпись. sudo puppet cert sign db1.lan Теперь мастер Puppet может взаимодействовать с нодой, которой принадлежит подписанный сертификат. (есть команда чтобы подписать сразу все запросы, но она нам пока не нужна) ---------------- проверка, пропишем манифест: sudo nano /etc/puppetlabs/code/environments/production/manifests/tooprossh.pp https://docs.puppet.com/puppet/4.9/type.html#file запустить НА КЛИЕНТЕ: sudo /opt/puppetlabs/bin/puppet agent --test #--debug (можно добавить) должно выполниться действие

НА ПАПЕТ СЕРВЕРЕ

Давайте настром управление без выделенных IP для клиента, для этого нам нужен ssh и чтобы с ним было легче работать, модуль для управления ssh. Найдем модуль на сайте: https://forge.puppet.com/ Для ssh красиво и понятно написан модуль от saz (https://forge.puppet.com/saz/ssh/readme) установим его: $ sudo /opt/puppetlabs/bin/puppet module install saz-ssh проверим что модуль был установлен: $ sudo /opt/puppetlabs/bin/puppet module list ---------------- ---------------- ----------------

МАНИФЕСТЫ ПИШЕМ НА УДОБНОЙ НАМ МАШИНЕ

Настроим ssfs файловую систему, чтобы писать папет манифесты на удобной нам машине. Ранее мы пробросили порт 2221 к папет серверу, восользуемся им. Пишем через IP и подключаемся по локалке, так как редактировать удаленно мы не будем, и значит пробрасывать лишний порт через роутеры и фаерволы тоже. $anyPC: mkdir ~/system/virt_vrpuppet $anyPC: sshfs toopro@192.168.8.220:/etc/puppetlabs/code /home/toopro/system/virt_vrpuppet -p2221 -o default_permissions (могли бы возникнуть проблемы с пользователями и правами, но у нас админ пользователь совпадает) подробнее о sshfs настройке: https://www.digitalocean.com/community/tutorials/how-to-use-sshfs-to-mount-remote-file-systems-over-ssh ---------------- ---------------- ---------------- ---------------- ---------------- ----------------

УСТАНОВКА FREE PBX 14

Установка виртуалки с freepbx

На основном сервере с kvm нужно добавить новую виртуальную систему:

sudo virt-install --virt-type=kvm --name freepbx --ram 2048 --vcpus=1 --hvm --os-type=linux --os-variant=centos7.0 --cdrom=/var/lib/libvirt/boot/FreePBX-SNG7-FPBX-64bit-1805-1.iso --disk path=/var/lib/libvirt/images/freepbx.qcow1,size=50,bus=virtio,format=qcow2 --network bridge=virbr0,model=virtio --graphics vnc,port=5912

Образ диска iso скачали с сайта FreePBX, текущая версия основана на ОС CentOS 7.0, поэтому указываем ее в os-variant. Автозагрузка freepbx виртуалки:

virsh autostart freepbx

Запускается установка системы, к ее процессу нужно обязательно подключиться через VNC, так как там требуется ваше вмешательство. Делаем это через Ремина: В основных настройках мы указываем вместо IP сервера localhost, так как подключаться к его vnc серверу будем через ssh тоннель, настрои его в специальной вкладе. Там мы уже будем указывать IP адрес нашего сервера с виртуальными машинами. Выбираем Asterisk 15 из списка (самая новая версия на данный момент. В итоге получаем сообщение, что нам нужно подключиться в другому VNC серверу в котором будет проходить настройка и установка через GUI. Делаем это. (может быть неправильно установлена таймзона сразу после установки системы, для логов удобно видеть наше время, прописываем в консоли: timedatectl set-timezone Europe/Kiev)

Проброс портов

После установки, на виртуалке freepbx будет работать веб интерфейс на порту 80. Нужно пробросить порт роутера на IP сервера с виртуалками и потом на этом сервере с посощью iptables прокинуть порт роутера на 80 порт виртуалки. Я выбрал внешний порт 8883 для настройки freepbx. Пробросил его на мой сервер с виртуальными машинами (его ip у меня 192.168.1.220). В том числе, для работы SIP протокола нужен смотрящий наружу порт 5160 и диапазон портов для передачи меди данных (RTC): 16384-22768 Это отправит соединение пришедшие снаружи на сервер с виртуалками, но он еще не знает куда дальше делавать эти соединения, нужно прописать ему форвардин этих же портов именнона виртуалку с freepbx. Для этого добавим в скрипт загрузки виртуальных машин условие, что при включении виртуалки freepbx нужно добавить в таблицу iptables инструкции перенаправления портов:

$ sudo nano /etc/libvirt/hooks/qemu

добавим

# FORWARD 8883 of kvm server to asterisk http port of virtual host
if [ "${1}" = "freepbx" ]; then

  #variables
  GUEST3_IP=192.168.122.10 #to find this ip use "ifconfig" on virtual guest system
  GUEST3_PORT=80
  HOST3_PORT=8883

  if [ "${2}" = "stopped" ] || [ "${2}" = "reconnect" ]; then
    /sbin/iptables -D FORWARD -o virbr0 -d 192.168.122.10 -j ACCEPT
    /sbin/iptables -t nat -D PREROUTING -p tcp --dport 8883 -j DNAT --to 192.168.122.10:80
    /sbin/iptables -t nat -D PREROUTING -p tcp --dport 5060 -j DNAT --to 192.168.122.10:5060
    /sbin/iptables -t nat -D PREROUTING -p tcp --dport 5160 -j DNAT --to 192.168.122.10:5160
    /sbin/iptables -t nat -D PREROUTING -p udp --dport 5060 -j DNAT --to 192.168.122.10:5060
    /sbin/iptables -t nat -D PREROUTING -p udp --dport 5160 -j DNAT --to 192.168.122.10:5160
    /sbin/iptables -t nat -D PREROUTING -p udp --dport 16384:22768 -j DNAT --to 192.168.122.10
  fi

  if [ "${2}" = "start" ] || [ "${2}" = "reconnect"]; then
    /sbin/iptables -I FORWARD -o virbr0 -d 192.168.122.10 -j ACCEPT
    /sbin/iptables -t nat -I PREROUTING -p tcp --dport 8883 -j DNAT --to 192.168.122.10:80
    /sbin/iptables -t nat -I PREROUTING -p tcp --dport 5060 -j DNAT --to 192.168.122.10:5060
    /sbin/iptables -t nat -I PREROUTING -p udp --dport 5060 -j DNAT --to 192.168.122.10:5060
    /sbin/iptables -t nat -I PREROUTING -p tcp --dport 5160 -j DNAT --to 192.168.122.10:5160
    /sbin/iptables -t nat -I PREROUTING -p udp --dport 5160 -j DNAT --to 192.168.122.10:5160
    /sbin/iptables -t nat -I PREROUTING -p udp --dport 16384:22768 -j DNAT --to 192.168.122.10

  fi

fi

Чтобы заставить с рабочей виртуальной запустить этот скрипт, нужно перезапустить libvirtd сервис: sudo systemctl restart libvirtd Проверяем, что порты переадресовываются теперь: sudo iptables -L -vt nat

НАСТРОЙКА FREE PBX 14

1. Обновление, активация

- Стоит сразу обновиться по последней версии, для этого придется активировать свою копию ФриПБХ. Активация нужна в будущем для покупки платных модулей, но в том числе и для установки обновлений ядра. - После активации, обновляем систему.

2. Настройка SIP протокола:

/admin/config.php?display=sipsettings Так как я в своих проектах часто использую 11ХХХХ порты, не хочу чтобы на них висели RTP порты для связи. Поэтому за основу взял диапазон и GOIP и прописал его в Атериске:

RPT Port Ranges = 16384-22768

Так как нас астериск сервер находится по факту за NAT, нужно дать понять, что при сходящих соединениях он не должен указывать свой "серый" IP, это безсмысленно, поэтому прописываем доп параметр:

media_address = 213.110.131.148

(добавляем этот пареметр в Other SIP Settings врычную)

Добавляем пользователя

Applications - Extensions - Quick Create Extension Указываем, например, номер телефона 101 и секрет (используется для логина на вашем сип телефоне или приложении)

Добавляем транк GOIP

Connectivity - Trunks - Add Trunk (chan_sip) Тут важно не запутаться в именах транка, юзеров и где какой пароль юзать. В основном окне настроек пишем только имя транка и исходящий номер. Имя транка будет: goipv1-trunk Переключаемся на sip Settings Раздел Outgoing Это соединение, которое инициирует астериск к gsm-шлюзу GOIP4, тут нужно указать IP этого шлюза, его порт (его порт нужно будет поменять на 5160, вместо стандартного 5060, особенности работы с NAT). Так как мы работаем из за NAT нужно добавлять canreinvite, directmedia как no.

type=friend
host=192.168.1.231
port=5160
secret=ggG0Yea
fromuser=goipv1
defaultuser=goipv1
user=goipv1
insecure=very,invite,port
qualify=yes
canreinvite=no
directmedia=no
context=from-trunk
allow=alaw&ulaw

Раздел Incoming Это настройки работы с входящим запросом от нашего GOIP. ТУт мы не указываем IP, ведь мы его узнаем при входящем запросе. Но, чтобы к нам не мог подключиться кто попало, мы сдесь пропишем имя пользователя и пароль, который должен будет совпадать с тем, что присылает нам GOIP. При чем, это другой пароль, не тот, на который смотрит у себя сам GOIP. Проверяем Ждем немного, к сожалению подключение происходит не сразу.

 

 

Связь goip и астериск сервера https://www.youtube.com/watch?v=S6aQrRqJC-0 дебаг не получаю, не уходит звук на звонящего *CLI> rtp set debug on

Вторая сетевая карта для KVM

Добавляем отдельную сетевую карту для Asterisk

1. Вставили карту 2. Выводим список интерфейсов: lspci -knn | grep "Eth\|Net" -A2. Пример вывода:

03:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 06)
	Subsystem: Gigabyte Technology Co., Ltd Onboard Ethernet [1458:e000]
	Kernel driver in use: r8169
	Kernel modules: r8169
--
05:01.0 Ethernet controller [0200]: VIA Technologies, Inc. VT6105/VT6106S [Rhine-III] [1106:3106] (rev 8b)
	Subsystem: D-Link System Inc DFE-520TX Fast Ethernet PCI Adapter [1186:1405]
	Kernel driver in use: vfio-pci
	Kernel modules: via_rhine

3. Проверяем как они загрузились и какие имена получили dmesg | grep -i "work\|eth\|error":

[    0.975308] r8169 Gigabit Ethernet driver 2.3LK-NAPI loaded
[    0.984998] r8169 0000:03:00.0 eth0: RTL8168evl/8111evl at 0x        (ptrval), 90:2b:34:ca:e9:f2, XID 0c900800 IRQ 25
[    0.986196] r8169 0000:03:00.0 eth0: jumbo features [frames: 9200 bytes, tx checksumming: ko]
[    0.990771] via-rhine 0000:05:01.0 eth1: VIA Rhine III at         (ptrval), fc:75:16:8e:4b:32, IRQ 18
[    0.992505] via-rhine 0000:05:01.0 eth1: MII PHY found at address 1, status 0x786d advertising 05e1 Link cde1
[    1.015499] via-rhine 0000:05:01.0 enp5s1: renamed from eth1
[    1.052801] r8169 0000:03:00.0 enp3s0: renamed from eth0

Видим, что драйвера загрузились и стандартные интерфейсы были переименованы. Но при этом ifconfig выдает всего один интерфейс. Второй где-то потерялся. 3. Добавляем новый интерфейс в список sudo nano /etc/network/interfaces

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp3s0
iface enp3s0 inet dhcp

######## ДОБАВИЛИ: ########
#secondary PCI interface for asterisk
auto enp5s1
iface enp5s1 inet dhcp
hostname TPSSrvAsterisk

ДАЕМ passthrough доступ к PCI карте для нашей виртуальной машине. Это значит, что она будет эксклюзивно пользоваться картой как своей собственной и у нас получится видеть из локальной сети эту виртуальную машину - как отдельный компьютер, без необходимости перенаправлять порты через ipconfig. Выходит GOIP и Asterisk будут висеть в одной сети и смогут обращаться друг к другу без посредников. https://www.server-world.info/en/note?os=Ubuntu_18.04&p=kvm&f=11 https://ycnrg.org/vga-passthrough-with-ovmf-vfio/ https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/virtualization/chap-virtualization-pci_passthrough https://www.server-world.info/en/note?os=CentOS_7&p=kvm&f=10 Проверяем можно ли нам использоваться режим passthrough для PCI карт. Для этого процессор должен поддерживать спец. команды (Intel VT/AMD-V Virtualization For KVM). Если нет, нужно проверить BIOS, иногда она отключена по умолчанию, но ее можно включить. cat /proc/cpuinfo | grep vmx Изменяем скрипт загрузки grub для включения IOMMU. У меня Intel компьютер поэтому дальше будем писать команды для него: sudo nano /etc/default/grub Добавляем intel_iommu=on к строке загрзуки: GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on" обновляем grub: sudo update-grub либо sudo grub-mkconfig -o /boot/grub/grub.cfg перегружаем комп sudo reboot проверяем, что IOMMU работает: dmesg | grep -E "DMAR|IOMMU" Определяем имя PCI интерфейса. Так как я не знаю какой у меня чипсет на материнке (встрпоенная интернет карта), а какой на PCI карте, то вывожу полную информацию по всем network интерфейсам и смотрю по имени интерфейса в системе (logical name = enp5s1 мое). sudo lshw -class network

 *-network               
       description: Ethernet interface
       product: RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
       vendor: Realtek Semiconductor Co., Ltd.
       physical id: 0
       bus info: pci@0000:03:00.0
       logical name: enp3s0
       version: 06
       serial: 90:2b:34:ca:e9:f2
       size: 100Mbit/s
       capacity: 1Gbit/s
       width: 64 bits
       clock: 33MHz
       capabilities: pm msi pciexpress msix vpd bus_master cap_list ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd 1000bt 1000bt-fd autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=r8169 driverversion=2.3LK-NAPI duplex=full firmware=rtl8168e-3_0.0.4 03/27/12 ip=192.168.1.220 latency=0 link=yes multicast=yes port=MII speed=100Mbit/s
       resources: irq:26 ioport:d000(size=256) memory:f2104000-f2104fff memory:f2100000-f2103fff
  *-network
       description: Ethernet interface
       product: VT6105/VT6106S [Rhine-III]
       vendor: VIA Technologies, Inc.
       physical id: 1
       bus info: pci@0000:05:01.0
       logical name: enp5s1
       version: 8b
       serial: fc:75:16:8e:4b:32
       size: 100Mbit/s
       capacity: 100Mbit/s
       width: 32 bits
       clock: 33MHz
       capabilities: pm bus_master cap_list ethernet physical tp mii 10bt 10bt-fd 100bt 100bt-fd autonegotiation
       configuration: autonegotiation=on broadcast=yes driver=via-rhine driverversion=1.5.1 duplex=full ip=192.168.1.221 latency=32 link=yes maxlatency=8 mingnt=3 multicast=yes port=MII speed=100Mbit/s
       resources: irq:18 ioport:c000(size=256) memory:f7100000-f71000ff

enp3s0 - это моя основная primary карта, для всего сервера с виртуалками. Смотрю ее вендора и продут и знаю что пропустить :) enp5s1 - буду выдавать для Asterisk, поэтому смотрю ее вендора и product. Запоминаю Rhine-III. Теперь нужно определить ее имя:

  • выводим список девайсов lspci -nn у меня нужная карта выглядит так: 05:01.0 Ethernet controller [0200]: VIA Technologies, Inc. VT6105/VT6106S [Rhine-III] [1106:3106] (rev 8b)
  • Потом выводим список PCI девайсов по именам: virsh nodedev-list | grep pci находим в ней похожую строку pci_0000_05_01_0
  • Проверяем что это оно, вызвав полную информацию о девайсе: virsh nodedev-dumpxml pci_0000_05_01_0 <device><name>pci_0000_05_01_0</name><path>/sys/devices/pci0000:00/0000:00:1c.5/0000:04:00.0/0000:05:01.0</path><parent>pci_0000_04_00_0</parent><driver><name>via-rhine</name></driver><capability type="pci"><domain>0</domain><bus>5</bus><slot>1</slot><function>0</function><product id="0x3106">VT6105/VT6106S [Rhine-III]</product><vendor id="0x1106">VIA Technologies, Inc.</vendor><iommugroup number="7"><address bus="0x00" domain="0x0000" function="0x5" slot="0x1c"> <address bus="0x04" domain="0x0000" function="0x0" slot="0x00"> <address bus="0x05" domain="0x0000" function="0x0" slot="0x01"> </address> </address> </address> </iommugroup></capability></device>

Отсоединяем нашу дополнительную интерне карту от системы. Приатаченные карты уже не могут быть использованы эксклюзивно гостевой системой и могут вызывать проблемы. virsh nodedev-dettach pci_0000_05_01_0 Переводим цифры bus, slot, function в шестнадцатеричные значения и добавляем "0х". В нашем случае, это чего не меняет, так как цифры меньше 10. НО в общем, для проверки/перевода в 16-ричную систему можно использовать команду: printf %x 88 (переводит чисо 88 из десячиной в hex). В моем случае: domain='0x0000' bus='0x05' slot='0x01' function='0x00' Временно вырубаем нашего гостя virsh shutdown freepbx Добавляем девайс к существующему гостю (виртуальной машине) virsh edit freepbx находим раздел devices (ctrl+w для поиска в nano) и добавляем

<hostdev managed="yes" mode="subsystem" type="pci"><source></source><address bus="0x05" domain="0x0000" function="0x0" slot="0x01"> <address bus="0x00" domain="0x0000" function="0x0" slot="0x0d" type="pci"> </address> </address> </hostdev>

 

не знаю надо ли, у себя пока не делал Set a sebool to allow the management of the PCI device from the guest: # setsebool -P virt_use_sysfs 1 перезагруждаем систему. логинисмся на ssh гостя (то евть в сервер freepbx), мы должны сразу увидеть, что есть уже два интерфейса, старый eth0 с выданным IP от хоста виртуальных машин, и новый - eth1, но для его IP нету. Так как в системе нет конфигруации для него. Создадим ее. Для этого, скопируем файл конфигурации с eth0: cp /etc/sysconfig/network-scripts/ifcfg-eth0 /etc/sysconfig/network-scripts/ifcfg-eth1 в файле нужно будет поменять имя устройства со старого (eth0 на новое eth1) и UUID (генерируем с помощью uuidgen eth1 >> /etc/sysconfig/network-scripts/ifcfg-eth1 это сразу вставить сгенерированный UUID в файл, так как если вы работаете с VNC, то простой копипаст работать не будет). У меня вышел такой файл:

 

 

 

TYPE="Ethernet"
BOOTPROTO="dhcp"
IPV4_FAILURE_FATAL="no"
IPV6INIT="no"
NAME="eth1"
UUID="e3e25287-47c4-456d-bcf4-5643dcb57761"
DEVICE="eth1"
HWADDR="fc:75:16:8e:4b:32"
ONBOOT="yes"
LINKDELAY=10
ZONE="internal"

 

Перегружаем сеть (или можно заребутить freepbx) sudo service network restart В приветствии видим, что нашему нового eth1 уже выдан IP адрес, который мы должны настроить в DHCP роутера на какой-то статический, чтобы потом к нему обращаться.

 

+-----------+-------------------+--------------------------------------+
| Интерфейс | MAC-адрес         | ИП адреса                            |
+-----------+-------------------+--------------------------------------+
| eth0      | 52:54:00:DC:8A:6D | 192.168.122.10                       |
|           |                   | fe80::5054:ff:fedc:8a6d              |
| eth1      | FC:75:16:8E:4B:32 | 192.168.1.221                        |
|           |                   | fd0a:b20a:c45d:0:fe75:16ff:fe8e:4b32 |
|           |                   | fe80::fe75:16ff:fe8e:4b32            |
+-----------+-------------------+--------------------------------------+

 

В FreePBX мы тоже увидим теперь два интерфейса, но это может вызвать путаницу, поэтому лучше указать bindaddr на наш 192.168.1.221. Эта настройка находится в настройках SIP, закладка "Установки канала SIP", раздел "Дополнительные настройки", после "Связывание с адресом". Проверяем открыты ли порты 5160: sudo nmap -v -sU 192.168.1.231 -p 5160 ЧАСТЫЕ ОШИБКИ: 1. При клонировании транков для создания отдельных на каждую карточку GOIP. система по умолчанию делает их отключенным. НУЖНО ВКЛЮЧИТЬ!!! 2. Если не видите соединения с GOIP но сами можете на него зайти, вероятно, он попал в бан в fail2ban. Можно добавить GOIP в белый лист на соотвенствующей странице System Admin - Intrusion Detection 3. Ошибка: chan_sip.c: username mismatch, have digest has. нужно указать в настройках транка в PEER полях, не type=friend, а именно type=peer (это значит, что этот тран не может быть и юзером и пиром, а это именно peer для исходящих и входящих соединений) ВАРИАНТ С ОДИНМ ИСХОДЯЩЕЙ НАСТРОЙКОЙ ТРАНКА (без входящей, но он разберется) name of the trunk (field above the PEER options): goip1-mts1588 type=peer secret=passwordToPutInBasicSettingsOfGOIP qualify=yes port=5160 nat=no host=dynamic disallow=all directmedia=no context=from-trunk canreinvite=no allow=alaw&ulaw все отлично работает с текущим конфигом GOIP: /sites/toopro.org/files/config.dat ================================== ================================== ================================== Добавление sms сервера (удобен для работы с смс как с почтотой, для массовых рассылок) 1. С сайта Hybertone находим самую свежую ссылку на их sms server http://www.hybertone.com/en/news_detail.asp?newsid=21 2. На сервере freepbx (неапоминаю, что он на базе CentOS), нужно скачать sms server: wget http://118.142.51.162/update/goip_install-v1.24.4.tar.gz 3. Распаковываем tar xvfz goip_install-v1.24.4.tar.gz 4.Устанавливаем

 


[root@TPSSrvAsterisk opt]# cd goip_install
[root@TPSSrvAsterisk goip_install]# ./goip_install.sh

Starting GoIP SMS System install 

Configure httpd config:
Enter the httpd config file PATH: (default: /etc/httpd/conf.d)
Defautl press Enter

Import Goip Databases 
Enter the Mysql root password if the password exist:

Enter your Mysql PATH: (default: /usr/bin/mysql)
Defautl press Enter

Copying file to /usr/local/goip
/usr/local/goip/run_goipcron: ./goipcron: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory
goipcron start
Install finished.
Please restart your httpd
SMS SERVER management URL: http://your_ip/goip

 

(FreePBX идет без паролья на mysql) 5. Открываем сайт: http://192.168.1.221/goip/ видим серый экран входа в систему. Начальный пароль логин root:root Если у вас система 64bit то скорее всего у вас вылезет ошибки на этом этапе. (например ./goipcron: error while loading shared libraries: libz.so.1: cannot open shared obfile or directory) Чтобы решить их устанавливаем доп. библиотеки: # yum install glibc.i686 # yum install zlibc.i686 # yum install krb5-libs.i686 После этого необходимо заного запустить goipcron # cd /usr/local/goip # ./run_goipcron Если все сделали правильно то выйдет просто: goipcron start 3) Нужно открыть UDP порт 44444: установим setuptool # yum install setuptool запустим утилиту настройки и откроем порт # setup Переходим в "Настройка Брандмауера" - "Настроить" и задаем необходимые службы и жмем "Вперед" Жмем <добавить> порт 44444, протокол UDP и "ОК". Остальные параметры оставляем без изменений 4) перезагрузим httpd: service httpd restart Проверяем ходят ли пакеты: tcpdump -i eth1 -n udp port 44444 В моем случае, goip очень старается залогиниться, но почему-то не получается ответа: listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes 00:37:59.183581 IP 192.168.1.231.10991 > 192.168.1.221.44444: UDP, length 286 00:37:59.807377 IP 192.168.1.231.10992 > 192.168.1.221.44444: UDP, length 274 00:38:00.461204 IP 192.168.1.231.10993 > 192.168.1.221.44444: UDP, length 274 00:38:28.445889 IP 192.168.1.231.osm-oev > 192.168.1.221.44444: UDP, length 285 00:38:28.736111 IP 192.168.1.231.osm-oev > 192.168.1.221.44444: UDP, length 47 00:38:28.745908 IP 192.168.1.231.osm-oev > 192.168.1.221.44444: UDP, length 62 00:38:28.808310 IP 192.168.1.231.osm-oev > 192.168.1.221.44444: UDP, length 253 00:38:29.139910 IP 192.168.1.231.palace-1 > 192.168.1.221.44444: UDP, length 273 00:38:29.436093 IP 192.168.1.231.palace-1 > 192.168.1.221.44444: UDP, length 48 00:38:29.441578 IP 192.168.1.231.palace-1 > 192.168.1.221.44444: UDP, length 63 Открыт ли порт и кому в iptables # netstat -anp | grep 444 udp 0 0 0.0.0.0:44444 0.0.0.0:* 4569/./goipcron Открыт ли порт? nmap -v -sU 192.168.1.221 -p 44444