Тонкости виртуализации

Весь год мы хорошо и много работали, поэтому дедушка мороз привёз нам на новый год подарочек – новый сервер из головного филиала.

Его мы должны были ввести в эксплуатацию в ограниченные сроки в рамках планового обновления парка. Старый сервер требовалось уже в начале года отправить в соседний филиал.

Производительность нового сервера довольно высока, что в сопоставлении с потенциальной невысокой нагрузкой на него, вызвало одно желание – разделить его ресурсы на несколько частей:

1. медиа база данных (хранение звуковых файлов в виндовых шарах с различными правами доступа пользователей домена + SQL Server для хранения ссылок на файлы + спец ПО для работы с базой и загрузки/обмена файлами с другими филиалами). Используется Windows Server 2008 Standard R2, лицензия на который передалась вместе с серваком + отдельно приобретённый SQL Server 2012 + спец ПО с несетевым USB HASP ключом.

2. терминальный сервер + сервер приложений, лицензию на который нам предоставили.
У нас в компании апологет винды. Все клиентские и серверные ОС для продакшна только Windows. Это связано с платформой спец ПО ну и с ИТ политикой. Поэтому для виртуализации можно было использовать только продукцию Microsoft.
Решение: используем бесплатный Hyper-V Server 2012 R2 для разделения ресурсов + имеющиеся лицензии на ПО.
Результат: всё работает, кроме USB ключей для спец ПО, т.к. Hyper на текущий момент не умеет прокидывать внутрь виртуалки USB.

Бюджет на приобретение дополнительного оборудования не предполагался, да и ключей мало, поэтому решили использовать программный проброс USB с другого компьютера с помощью бесплатного пакета USBIP, работающего под Линукс.

Это было достустимо ИТ политикой. Правда, для реализации нужен отдельный компьютер, но в связи с отсутствием такового решили использовать имеющийся с низкой нагрузкой.

Таким оказался дешёвый сервер Supermicro с установленной FreeBSD для организации удалённого доступа по ВПН сотрудникам из дома.

Нагрузка на него была невелика, поэтому ресурсы можно было разделить без ущерба для производительности.
Подзадача: внедрение системы виртуализации с возможностью проброса USB.

Решение: используем бесплатный гипервизор ESXi 5.5 + FreeBSD 9.2 для восстановления функционала изначального сервера + Ubuntu Server для пакета USBIP.

Установка гипервизора проблем не вызвала. Правда, нужно отметить, что ESXi принципиально не работает на софтовых рейд-контроллерах, которые встраивают в недорогие сервера и вообще поддержка оборудования, в частности сетевых карт, ограничена.

Совместимость надо проверять тут www.vmware.com/go/hcl

Из трех установленных сетевых карт штатный дистрибутив нашёл только одну. Этого хватало для дальнейшей установки и настройки (требуется хотя бы одна сетевая карта и хотя бы один жёсткий диск), но с помощью отдельно скачанных на просторах интернета VIB файлов с драйверами и утилиты ESXi-Customizer добавили одну из ненайденных сетёвок в дистрибутив.

Вторую подгрузили после инсталляции:

1. Открываем vSphere Client.
Загружаем в datastore файл с драйвером.
Включаем возможность доступа до гипервизора по SSH.
Configuration -> Security Profice -> Services -> Property -> SSH

2. Заходим на гипервизор по SSH
Переводим хост в режим обслуживания (maintenance mode), для получения возможности загружать драйверы (можно через клиента).

esxcli system maintenanceMode set -e true -t 0

Устанавливаем vib файл:

esxcli software vib install -v /vmfs/volumes/datastore/net-e1000e-2.1.4.x86_64.vib

3. Перегружаем хост, проверяем наличие сетевой карты.

4. Выключаем maintenance mode (можно через клиента).

esxcli system maintenanceMode set -e false -t 0

5. Настраиваем и запускаем гостей.

Установка Ubuntu с пакетом USBIP прошла без трудностей, сервис запустился, ключ прокинуть получилось, основная задача была выполнена.

А вот с FreeBSD не всё пошло так гладко. Есть несколько особенностей, цепляющихся друг за друга:

1. В ESXi 5.5 добавленная по умолчанию сетевая карта E1000, определяемая как em, не поддерживает прохождение GRE пакетов. Таким образом, VPN не функционирует. Для устранения этого недоразумения разработчики ESXi рекомендуют использовать сетевые карты VMXNET3. Правда, без установленного VMWare Tools, эти адаптеры не видимы гостевой операционкой. Поэтому сначала добавляем адаптер E1000, чтобы сервер мог ходить в интернет, монтируем диск с vmware-tools-distrib и запускаем vmware-install.pl, предварительно поставив compat6x libraries.

pkg_add -r compat6x-amd64
mount_cd9660 /dev/cd0 /media
cd /tmp
tar -xf /media/vmware-freebsd-tools.tar.gz
umount /media
cd vmware-tools-distrib
./vmware-install.pl

После этого можно менять карты на VMXNET3, определяемые как vmx3fX, которые пропускают GRE пакеты.

2. Карты VMXNET эмулируют новые фишки сетевушек, типа LRO, TSO и др. В случае с нашим шлюзом на внешнем интерфейсе наблюдались потери трафика при использовании ipfw с ядерным nat. При использовании ipfw с divert (natd) такого не было.

Методом отключения опций в драйвере vmx3fX удалось добиться работоспособности и ядерного nat. Нам помогло отключение опции RXCSUM:

ifconfig vmx3f1 -rxcsum

3. Прописывание опций сетевого адаптера, отключающих RXCSUM, через rc.conf не работает.

ifconfig_vmx3f1="inet X.X.X.X netmask Y.Y.Y.Y -rxcsum"

Стартовые скрипты не распознают добавленные параметры. Вариант решения проблемы – использование отдельного скрипта /etc/start_if.vmx3f1, в котором в явном виде прописан запуск ifconfig с параметрами. Опять же работоспособный вариант оказался таким:

/sbin/ifconfig vmx3f1 inet X.X.X.X netmask Y.Y.Y.Y
/sbin/ifconfig vmx3f1 -rxcsum

Указание только отключения опции, либо всё вместе в одну строку не приводило к нужному результату. По-видимому, это особенность FreeBSD 9.2.

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

Конфигурационные файлы на память.
mpd.conf:

default:
    load pptp_server
pptp_server:
# Диапазон IP адрессов, который присвоется VPN девайсу.
        set ippool add pool1 172.22.100.50 172.22.100.99
# Create clonable bundle template named B
        create bundle template B
        set iface enable proxy-arp
        set iface idle 1800
        set iface enable tcpmssfix
        set ipcp yes vjcomp
# Specify IP address pool for dynamic assigment.
        set ipcp ranges 172.22.100.1/32 ippool pool1
        set ipcp dns 192.168.15.10
# The five lines below enable Microsoft Point-to-Point encryption
# (MPPE) using the ng_mppc(8) netgraph node type.
        set bundle enable compression
        set ccp yes mppc
        set mppc yes e40
        set mppc yes e128
        set mppc yes stateless
# Create clonable link template named L
        create link template L pptp
# Set bundle template to use
        set link action bundle B
# Multilink adds some overhead, but gives full 1500 MTU.
        set link enable multilink
        set link yes acfcomp protocomp
        set link no pap chap
        set link enable chap
        set link keep-alive 10 60
# We reducing link mtu to avoid GRE packet fragmentation
        set link mtu 1460
# Внешний IP на котором будет прослушиваться соединение
        set pptp self X.X.X.X
# Allow to accept calls
        set link enable incoming

/etc/rc.d/firewall.conf

# разрешаем полный доступ с доверенного IP
add 1109 allow ip from Z.Z.Z.Z to X.X.X.X in via vmx3f1
#баним настырных через fail2ban
add 1110 deny ip from table(1) to X.X.X.X in via vmx3f1
#разрешаем SSH
add 1520 allow tcp from any to me 22 in
add 1521 allow tcp from me 22 to any out
#разрешаем подключаться к нам по VPN
add 1700 allow tcp from any to X.X.X.X 1723 in via vmx3f1
add 1701 allow tcp from X.X.X.X 1723 to any out via vmx3f1
#НАТим трафик из локалки наружу
add 2600 nat 1 ip from 192.168.15.0/24 to any out via vmx3f1
#свой трафик тоже надо запихнуть в НАТ, иначе не работает
add 2601 nat 1 ip from me to any out via vmx3f1
#обратный НАТ
add 2605 nat 1 ip from any to X.X.X.X in via vmx3f1
#разрешаем ВПН трафик (для исходящих подключений)
add 2610 allow gre from any to any
add 2611 allow tcp from any to any established
add 2612 allow ip from any to any frag
add 2613 allow tcp from me to any out setup
add 2614 allow tcp from 192.168.15.0/24{190-200} to any setup
add 2624 allow udp from X.X.X.X  to any 53 out via vmx3f1 keep-state
add 2625 allow udp from 192.168.15.0/24 to 192.168.15.11 53 in via vmx3f0 keep-state
add 2635 allow icmp from me to any out via vmx3f1
add 2636 allow icmp from any to me in via vmx3f1
add 2637 allow icmp from192.168.15.0/24{190-200} to any
add 2638 allow icmp from any to 192.168.15.0/24{190-200}

Спасибо, Егору за его статью 🙂

Leave a Reply