Компания
85,84
рейтинг
17 декабря 2013 в 13:46

Разное → «Идеальный» кластер. Часть 2.1: Виртуальный кластер на hetzner tutorial



Хочу отметить, что эта инструкция родилась в процессе проведения экспертизы различных систем виртуализации в стенах компании Acronis.
Proxmox показал себя с хорошей стороны, возможно наш опыт окажется полезным для решения Ваших задач.


Арендуя очередной сервер в дата-центре, каждый задумывается о рациональности его использования.
Ведь ни для кого не секрет, что хорошо настроенный сервер не должен быть слишком нагружен и в нем должно быть достаточно ресурсов для выполнения другой работы. Кроме вышесказанного, важна отказоустойчивость и поэтому держать несколько копий одного и того же сервера в качестве hot swap, кажется отличной идеей.
Для решения этих задач и нужна виртуализация.

Сейчас я расскажу, как можно быстро сделать из одного сервера целый кластер серверов на базе linux и windows.
В дальнейших статьях я попытаюсь объяснить, как поднять безопасный web-кластер и использовать все прелести современных технологий виртуализации.
В этой инструкции речь пойдет о бесплатной системе виртуализации Proxmox, она находится в свободном доступе, но за поддержку требует плату. Мы попробуем обойтись без поддержки и коммерческого репозитория Proxmox. Вот что говорит о об этом продукте википедия

Proxmox Virtual Environment (Proxmox VE) — система виртуализации с открытым исходным кодом, основанная на Debian GNU/Linux. Разрабатывается австрийской фирмой Proxmox Server Solutions GmbH, спонсируемой Internet Foundation Austria.
В качестве гипервизоров использует KVM и OpenVZ. Соответственно, способна выполнять любые поддерживаемые KVM ОС (Linux, *BSD, Windows и другие) с минимальными потерями производительности и Linux без потерь.
Управление виртуальными машинами и администрирование самого сервера производятся через веб-интерфейс либо через стандартный интерфейс командной строки Linux.
Для создаваемых виртуальных машин доступно множество опций: используемый гипервизор, тип хранилища (файл образа или LVM), тип эмулируемой дисковой подсистемы (IDE, SCSI или VirtIO), тип эмулируемой сетевой карты, количество доступных процессоров и другие.

Ключевые возможности

  • Простое управление через веб-интерфейс;
  • Мониторинг нагрузки в реальном времени;
  • Библиотека установочных образов (в локальном или удаленном хранилище);
  • Подключение к «физической» консоли гостевых систем непосредственно из браузера (по VNC);
  • Объединение серверов в кластер с возможностью живой миграции виртуальных машин (без остановки гостевой системы);
  • Быстрое развертывание гостевых систем из шаблонов (доступно только для OpenVZ);
  • Автоматическое резервное копирование виртуальных машин.





Первым делом нужно заказать сервер с debian 7 64 на борту, чем больше памяти тем лучше! побеспокойтесь о сохранности своих данных, RAID 1 совсем не будет лишним, хотя сам по себе он несет ряд рисков. Мы оптимисты, берем с RAID1.
Как только у нас есть root доступ к нашему новому серверу, приступаем к работе:

# До установки самого proxmox нужно определиться с hostname и указать его

 nano /etc/hosts 


127.0.0.1 localhost
x.x.x.x  test.xxxx.info test
#
# IPv6
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
x:x:x:4105::2  test.xxxx.info


nano /etc/hostname

test


# Меняем временную зону

echo "Europe/Moscow" > /etc/timezone
dpkg-reconfigure -f noninteractive tzdata


# Создаем папку для репозиториев

mkdir -p /etc/apt/sources.list.d/


# Скачиваем репозитории

cd /etc/apt/sources.list.d/ 
wget http://sycraft.info/share/debian7/sources.list.d/debian7.list
wget http://sycraft.info/share/debian7/sources.list.d/dotdeb7.list
wget http://sycraft.info/share/debian7/sources.list.d/neurodebian.sources7.list
wget http://sycraft.info/share/debian7/sources.list.d/proxmox7.list


# Устанавливаем ключи

cd /root/
wget http://www.dotdeb.org/dotdeb.gpg 
cat dotdeb.gpg | apt-key add -
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys A040830F7FAC5991
apt-key adv --recv-keys --keyserver pgp.mit.edu 2649A5A9
wget -O- "http://download.proxmox.com/debian/key.asc" | apt-key add -
rm *.gpg


# Обновляем систему

apt-get update && apt-get upgrade -f -y


# Ставим необходимый минимум

apt-get install ntp screen mc git ntpdate sudo zip unzip pigz locales tzdata nano aptitude htop iotop sysstat rkhunter chkrootkit nscd lsof strace subversion multitail -y -f


# Устанавливаем ядро от proxmox

apt-get install pve-firmware pve-kernel-2.6.32-26-pve -y -f

apt-get install pve-headers-2.6.32-26-pve -y -f


# Зачистка системы от старых ядер

apt-get remove linux-image-amd64 linux-image-3.2.0-4-amd64 -y -f


# Генерация grub

update-grub


# Перезагрузка

reboot


# Нам повезло, наш сервер загрузился и теперь можно ставить сам proxmox

apt-get install proxmox-ve-2.6.32 ntp ssh lvm2 postfix ksm-control-daemon vzprocps open-iscsi bootlogd -y


# Удаляем репозиторий для платного proxmox

rm -fr /etc/apt/sources.list.d/pve-enterprise.list


# Добавляем модули iptables на все случаи жизни

nano /etc/vz/vz.conf


IPTABLES="ipt_owner ipt_REDIRECT ipt_recent ip_tables iptable_filter iptable_mangle ipt_limit ipt_multiport ipt_tos ipt_TOS ipt_REJECT ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_LOG ipt_length ip_conntrack ip_conntrack_ftp ipt_state iptable_nat ip_nat_ftp"


# Добавляем модули при загрузке ядра (лишний шаг, но на всякий случай)

nano /etc/modules


ipt_MASQUERADE
ipt_helper
ipt_REDIRECT
ipt_state
ipt_TCPMSS
ipt_LOG
ipt_TOS
tun
iptable_nat
ipt_length
ipt_tcpmss
iptable_mangle
ipt_limit
ipt_tos
iptable_filter
ipt_helper
ipt_tos
ipt_ttl
ipt_REJECT
loop


Дальше пару слов о предполагаемой архитектуре:

  • Мы заказываем вместе с сервером 2 внешних (публичных) IP адреса, на первом находится служебный порт web-панели proxmox, ssh, mysql и другие служебные порты о которых никто лишний не должен знать
  • Второй адрес обслуживает порты, которые должны быть доступны всем. Например 80 и 443 и все. Кроме того, этот адрес поднят на пустой, лишенной лишних сервисов виртуальной машине. Остальное будет разруливать пробросами портов.


# Сохраняем текущие правила iptables

iptables-save > /etc/iptables.up.rules


# Дописываем правила в раздел *nat для нашего внешнего служебного адреса

nano /etc/iptables.up.rules


*nat
:PREROUTING ACCEPT [2164:136969]
:POSTROUTING ACCEPT [58:3659]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -d x.x.16.182/32 -p tcp -m tcp --dport 22 -j DNAT --to-destination 192.168.8.2:22
-A POSTROUTING -o vmbr0 -j MASQUERADE
-A POSTROUTING -d x.x.16.182 -p tcp -s 192.168.8.0/24 --dport 22 -j SNAT --to-source x.x.16.182
COMMIT


# Проверяем правила, ошибок быть не должно

iptables-restore < /etc/iptables.up.rules 


Очень важное правило POSTROUTING, Если вы захотите изнутри одной из виртуальных маших обратится по проброшенному порту внешнего адреса, без этого правила ничего не будет работать!


# Загружаем образы контейнеров openvz

cd /var/lib/vz/template/cache/
wget http://download.openvz.org/template/precreated/debian-7.0-x86_64.tar.gz
wget http://download.openvz.org/template/precreated/centos-6-x86_64.tar.gz
wget http://download.openvz.org/template/precreated/ubuntu-13.10-x86_64.tar.gz


# Драйвера на случай если нам понадобиться windows

cd /var/lib/vz/template/iso/
wget http://alt.fedoraproject.org/pub/alt/virtio-win/latest/images/virtio-win-0.1-74.iso


# Далее переходим по внешнему адресу нашего сервера x.x.16.182:8006/
После авториации видим сообщение об использовании бесплатной версии, она нам и нужна. Просто привыкаем нажимать ОК или покупаем подписку


Настройка сети для Hetznet



# Приступаем к перенастройке сети, настройка сетевых мостов может показаться странной, но в Hetzner есть ограничение количество MAC адресов на порту коммутатора, те все внешние адреса у нас будет обеспечивать 1 MAC
Это настройка одинаково хорошо работает и в ДЦ без таких ограничений, просто универсальный вариант
Так же тут есть приватная сеть 192.168.8.0/16 — ее используем для внутренней сети между нашими виртуальными машинами




# Далее, перезагружаем наш сервер и смотрим наши настройки сети

cat /etc/network/interfaces


auto lo
iface lo inet loopback

auto  eth0
iface eth0 inet static
       address   x.x.16.182
       netmask   255.255.255.224
       pointopoint   x.x.16.129
       gateway    x.x.16.129
dns-nameservers 8.8.8.8
auto vmbr0
iface vmbr0 inet static
       address   x.x.16.182
       netmask   255.255.255.224
       bridge_ports none
       bridge_stp off
       bridge_fd 0
pre-up iptables-restore < /etc/iptables.up.rules
       up ip route add x.x.150/32 dev vmbr0
#
auto vmbr1
iface vmbr1 inet static
       address   192.168.8.100
       netmask   255.255.0.0
       bridge_ports none
       bridge_stp off
       bridge_fd 0


# Пишем шлюз внешнего служебного IP в pointopoint и gateway, в vmbr0 указываются теже самые адреса но без gateway, ко второму адресу на котором будут публичные порты должен быть прописан маршрут up ip route add и правила фаервола pre-up iptables-restore

Для общего развития, вот пример настройки сети для ДЦ без ограничений на количество адресов MAC



nano /etc/network/interfaces

# network interface settings
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto vmbr0
iface vmbr0 inet static
        address  x.x.16.182
        netmask  255.255.255.0
        gateway  x.x.16.1
        dns-nameservers 8.8.8.8
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        pre-up iptables-restore < /etc/iptables.up.rules

auto vmbr1
iface vmbr1 inet static
        address  192.168.8.100
        netmask  255.255.0.0
        bridge_ports none
        bridge_stp off
        bridge_fd 0


# Вот пример того как мы можем устанавливать нашу Windows (если это нужно)




В настройках видеокарты я указываю SPICE а вот и клиент для него www.spice-space.org/download.html
Сеть и диск — virtio, для установки драйверов сразу же делаю второй cd-rom для скачанной virtio iso


Ну и последнее в этой статье — настройка gw. виртуальной машины, которая будет пробрасывать нам публичные порты. На этой виртуальной машине не будет SSH или других слушающих сеть служб — она узел фаервол
Вы создаете CT с образом debian c сетью Network Device



В самом контейнере это будет выглядеть так:

nano /etc/network/interfaces


auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
       address   x.x.x.150
       netmask   255.255.255.255
pointopoint  x.x.16.182
        gateway  x.x.16.182
pre-up iptables-restore < /etc/iptables.up.rules


auto eth1
iface eth1 inet static
       address   192.168.8.1
       netmask   255.255.0.0


# Обратите внимание на маску, gateway и pointopoint для этого интерфейса — адрес нашей публичной служебной сети.

# Дописываем правила в раздел *nat для нашего внешнего публичного адреса

nano /etc/iptables.up.rules


*nat
:PREROUTING ACCEPT [2164:136969]
:POSTROUTING ACCEPT [58:3659]
:OUTPUT ACCEPT [0:0]
-A PREROUTING -d x.x.x.150/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.8.5:22
-A POSTROUTING -o eth0 -j MASQUERADE
-A POSTROUTING -d x.x.x.150 -p tcp -s 192.168.8.0/24 --dport 80 -j SNAT --to-source x.x.x.150
COMMIT


# Разрешаем пробросс трафика при маскарадинге

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p


# В этом контейнере удалите все ненужное!

apt-get purge -y -f openssh-server postfix ssh samba bind9 sendmail apache2*apt-get autoremove -y 


Если у вас возникнут трудности или потребуется специальный человек чтобы сделать сказку былью — всегда буду рад помочь! мои контакты — welcome

В продолжение темы моя статья «Идеальный» www кластер. Часть 1. Frontend: NGINX + Keepalived (vrrp) на CentOS
Дальше будет, надеюсь, еще много и много статей по этой теме! Спасибо за внимание
Автор: @SyCraft
Acronis
рейтинг 85,84

Комментарии (22)

  • –1
    Правильно я понимаю, что это аналог VirtualBox? В целом не очень понял прикладного значения такого действа.
    • +2
      На моей памяти еще никто так не оскорблял proxmox :)
      • 0
        Замечательное получилось сравнение )
      • 0
        Сравнение хоть и некорректное, но в принципе имеет право на существование. phpVirtualBox простое решение для низконагруженых серверов. Ставил посмотреть на это в качестве эксперимента, но потом оставил в продакшене. Достаточно удобно и просто администрируется. Но потери в производительности видны невооруженным глазом, так что в датацентрах использование VirtualBox будет очень плохой идеей.
    • 0
      Думаю тут нужно сперва ответить себе на вопрос, а зачем же вообще нужна виртуализация?
  • 0
    На этой виртуальной машине не будет SSH или других ненужных служб, если ее каким-то образом взломают, то не смогут получить доступ к вашим данным

    А как ее предполагается, что могут взломать и при этом не получить доступ? Я думал, что взлом сервера это обычно все-таки получение шелла, после которого уже все равно, какие пакеты у вас стоят, а какие нет. Плюс к тому атаковать будут скорее те машины, которые стоят за шлюзом и на которые прокинуты порты, у вас же никакой защиты там нет на фильтрацию трафика. Почти прямой трафик до сервера, можно брутить пароли на почтовик, например, или заливать php-шелл через дыру в апаче, который расположен за шлюзом.
    Тут скорее вопрос в том, чтобы не ставить на шлюз те сервисы, которые реально не будут использоваться, но это вообще должно относиться к любым боевым серверам. И кроме удаления всего ненужного я бы рекомендовал еще посмотреть список сервисов, которые на этой машине запущены и работают. Хостеры зачастую включают SASL, например, который на шлюзе не нужен. Вообще, харденинг — это отдельная тема, которая не ограничивается удалением пакетов (вот вам тема для будущей статьи ;-))
    • 0
      У вас есть два адреса: (допустим)
      5.5.5.5 и 5.6.6.6
      Ваш сайт мойсайт.рф находится на адресе 5.6.6.6
      Злоумышленнык делает nmap адреса 5.6.6.6 и обнаруживает там лишь 80-ый и 443 порт, ни 22 и 21 и 53, 25,110 видны не будут
      те он не может попасть на этот сервер
      допустим это случилось и он это сделал, тогда он попадает на голую систему без ничего вообще
      Ваши данные и службы находятся на других виртуальных машинах этого сервера, так же без SSH
      Те единственный способ взломать ваш сервер это выйти из уровня изоляции ваших виртуальных машин, открытых багов на эту тему нет и нужно следить за своевремееным обновлением гипервизора
      • 0
        В вашем примере он попадет на систему, на которой просто пакетов установленных нет. Но он попадет в систему с пакетным менеджером.
        Сниффер поставить на шлюз — отличный вариант, на шлюзе самое то. И без доступа к удаленным машинам есть вариант получить много полезной информации. Ну и инжекции в трафик теоретически. Плюс анализ активности по вашим логам.
        Вы не думайте, я не сомневаюсь, что вы профессионал, но тема действительно не очень раскрыта.
        • 0
          во первых как он попадет на сервер в принципе? нет портов по которым он мог бы подключиться
          Во вторых, что он сможет сделать снифером? в серой сети нет никакого секретного трафика, пароли к mysql? mysql авторизует по имя%адрес?
          утянуть файлы? как без ssh,  ftp и прочего?
          Мне кажется ваши опасания мягко говоря затянуты за уши
          • 0
            Про попадение на сервер — у вас в статье. Это не мои опасения, это не нужная в принципе фраза в статье, о которой я спросил, к чему она:
            На этой виртуальной машине не будет SSH или других ненужных служб, если ее каким-то образом взломают, то не смогут получить доступ к вашим данным

            Если ее взломают, то доступ получат. Трафик нужен не тот, который у вас во внутренней сети, он вообще через шлюз ходить не должен, а тот, который пойдет извне, с которым работают пользователи.
            Вы просто лишнее предложение написали с опасением. Не то, чтобы я придираюсь, просто сказали «А», говорите и «Б», либо не говорите и «А». Если никаких ненужных сервисов нет, то вероятность взлома очень низкая, если вы не какая-нибудь система, обрабатывающая персональные данные и кредитные карты.
            Файлы можно слить прямо через bash, он отлично работает с tcp.
            Мне кажется ваши опасания мягко говоря затянуты за уши

            Разве что самую малость. Я скорее придрался немного к «удаляем несколько пакетов, и тот, кто попал на сервер, ничего сделать не сможет».
            • 0
              без ssh они не попадут на сервер, все личные данные под ssl обычно, у вас есть сведения что ssl легко расшифровать просто находясь в той же сети что и получатель ssl пакетов?
              • 0
                Ну, и опять же возвращаемся к вопросу «Каким образом систему можно взломать?», вы себе противоречите. Уберите лучше из статьи слова про «если взломают».
                Конечно у меня нет таких сведений, я же не АНБ, да, это нелегко. Без реального серверного сертификата и ключа вы даже MITM не реализуете. Если они есть, то sslsniff вам в руки, может и получится чего. Очень неаккуратно вы выражаетесь. Шлюз у вас не просто «находится в сети», через него весь трафик идет.
                Вообще мы можем тут в каментах очень долго общаться, но это таки оффтоп, поэтому давайте больше не будем :) Статья про Proxmox, а не про безопасность и дыры в ней. Жду вашей следующей статьи.
            • 0
              Наш сервер на котором находится внешний адрес это просто хост-фаервол
              файлы находятся на другом сервере куда проброшен порт 80
              как не имея на файловом сервере ssh сервера вы сольете файлы через  bash?
              • 0
                scp
                • 0
                  SCP (от англ. secure copy) — протокол RCP копирования файлов, использующий в качестве транспорта не RSH, а SSH
                • 0
                  те без ssh сервера это работат не будет, так же как и sftp и rsync через ssh
                  • 0
                    Ты не понимаешь. Получив веб-шелл на сервере через уязвимость в веб-приложении или веб-сервере, можно дальше делать что угодно, независимо от наличия ssh-сервера на этом хосте.
                    • 0
                      мы говорим о серверной инфраструктуре
                      о том как обезопасить наши web приложения я напишу позже
                      но сразу скажу технология jailkit и suEXEC спасет мир
              • 0
                Если на файловом сервере есть bash, то с него можно легко слить всё, что угодно, даже если там нет ssh-клиента и ssh-сервера.
                • 0
                  как?
                  • 0
                    Я намекну
                    exec 3<>/dev/tcp/ftpserver/<порт>
                    И потом просто описываете протокол и выводите данные в соответствующий дескриптор. Ни SSH-клиент, ни SSH-сервер тут не нужны. Но для этого, естественно, надо иметь шелл на сервере, который получить заметно тяжелее
                    • 0
                      речь о том что у тебя нет шела и ssh на сервер где файлы

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разное