OpenVZ · 6 min read · Jan 17, 2026

Некоторые советы по развертыванию OpenVZ

Некоторые советы по развертыванию OpenVZ

Я сильно полагаюсь на OpenVZ. В этой статье я хотел бы поделиться некоторыми из моих личных впечатлений о развертывании OpenVZ. Я предполагаю, что читатели уже знают, как установить OpenVZ и основы OpenVZ. Эта статья описывает некоторые советы по использованию OpenVZ через командную строку. Если вы предпочитаете GUI командной строке, пожалуйста, обратитесь к тому, как установить WebVZ.

Настройка, описанная здесь, следует этим рекомендациям:

  • реальный сервер имеет минимальное количество установленного программного обеспечения (я использую debian Etch с минимальной установкой) в качестве отправной точки. Дополнительные приложения устанавливаются по мере необходимости в процессе развертывания.
  • реальный сервер должен быть максимально безопасным. С другой стороны, я хочу, чтобы он оставался простым и легким в настройке/обслуживании. Поэтому я выбрал компромисс: я полагаюсь только на то, что можно легко развернуть с помощью debian и не использую дополнительные средства безопасности, такие как openwall, selinux, grsecurity и т.д.
  • каждая необходимая служба развертывается в отдельном контейнере, чтобы они как можно меньше мешали друг другу
  • Обнаружение вторжений для реального сервера, а также для контейнеров развернуто на реальном сервере с использованием OSSEC
  • файрвол (iptables) настроен на реальном сервере; контейнеры запускают только службы
  • я полагаюсь на ssh как единственное средство доступа и обслуживания реального сервера и контейнеров.

Основная безопасность

Перед развертыванием любых ovz контейнеров я вношу некоторые изменения в конфигурацию реального сервера, чтобы сделать его более безопасным:

  • отключить пароль root
  • добавить пользователя admin-user, который может выполнять sudo для всего; у этого пользователя простой пароль
  • добавить пользователя ssh-user, который может ssh на реальный сервер; после загрузки ssh-ключа для этого пользователя я изменяю строку в .ssh/authorized_keys на: command="/bin/su - admin-user" ssh-rsa AAAA... и изменяю /etc/pam.d/su, чтобы разрешить только этому пользователю выполнять su: auth required pam_wheel.so group=ssh-user
  • чтобы копировать файлы с/на реальный сервер, я создаю другого пользователя sftp-user и устанавливаю MySecureShell
  • изменить sshd_config так, чтобы: - только ssh-user и sftp-user могли подключаться
  • отключена аутентификация по паролю (после загрузки ssh-ключей для ssh-user и sftp-user)
  • sshd работает на нестандартном порту

Вышеуказанная схема работает следующим образом: чтобы подключиться к реальному серверу, мы подключаемся как ssh-user. Затем мы должны ввести пароль для admin-user. Если кто-то получит ssh-ключ для ssh-user, он все равно должен знать пароль для admin-user, чтобы получить доступ к серверу (неудача /bin/su - admin немедленно сгенерирует уведомление по электронной почте от OSSEC).

Чтобы копировать файлы с/на сервер, мы используем sftp с учетной записью sftp-user. Если кто-то получит ssh-ключ для этого пользователя, это не такая большая проблема, так как он может получить доступ только к файлам в своем $HOME.

Создание контейнеров OpenVZ

Мне удобнее создать шаблон для всех контейнеров, чтобы, когда мне нужен новый контейнер, я просто сделал клон из шаблона. Я использую только debian stable как для реального сервера, так и для контейнеров. Итак, первый шаг - создать шаблон и настроить его по своему вкусу:

  • создать новый контейнер: vzctl create 2002 --ostemplate debian-4.0-amd64-minimal

  • установить некоторые основные параметры: vzctl set 2002 --ipadd 192.168.100.2 --nameserver 1.2.3.4 --hostname host2 --save

  • запустить контейнер: vzctl start 2002

  • войти в контейнер: vzctl enter 2002

  • Я предпочитаю держать все на минимуме и добавлять по мере необходимости. Поскольку установка пакета с помощью debian так проста, требуется очень мало усилий, чтобы установить любой необходимый пакет. Поэтому я вношу следующие изменения для шаблона: - запустить aptitude и снять отметку с Options/Dependency handling/Install Recommended packages automatically

  • удалить некоторые пакеты, которые я не хочу в шаблоне: bsdmainutils ed groff-base info iptables libconsole libgdbm3 man-db manpages nano netcat openssh-client openssh-server quota ssh traceroute

  • отредактировать /etc/apt/sources.list, чтобы настроить его по своим предпочтениям

  • затем я останавливаю шаблон: vzctl stop 2002

Затем, когда мне нужен новый контейнер, я использую скрипт vz-clone следующим образом:

#!/bin/bash

# скрипт для клонирования openvz VE

set -e

if [ -z "$2" ]; then
    echo "Использование: $0  "
    exit 1
fi

cfg="/etc/vz/conf/$1.conf"
newcfg="/etc/vz/conf/$2.conf"

if [ ! -e $cfg ]; then 
    echo $cfg не найден!
    exit 1
fi

VEID=$1
. $cfg
veprivate="$VE_PRIVATE"

VEID=$2
. $cfg
newveprivate="$VE_PRIVATE"

if [ -e $newcfg ]; then 
    echo $newcfg уже существует!
    exit 1
fi

if [ -e $newveprivate ]; then 
    echo $newveprivate уже существует!
    exit 1
fi

if vzlist | fgrep -w -q $1
then
    vzctl stop $1
fi

echo "Клонирование $cfg в $newcfg"
cp -a $cfg $newcfg

echo "Клонирование $veprivate в $newveprivate"
mkdir -p $newveprivate
cd $veprivate
tar cf - . | (cd $newveprivate && tar xf -)

echo "Не забудьте отредактировать $newcfg (вам нужно отредактировать как минимум HOSTNAME и IP_ADDRESS)"
echo "Также не забудьте сделать псевдоним"

Использование:

sudo sh vz-clone 2002 2010
Клонирование /etc/vz/conf/2002.conf в /etc/vz/conf/2010.conf  
Клонирование /vz/private/2002 в /vz/private/2010  
Не забудьте отредактировать /etc/vz/conf/2010.conf (вам нужно отредактировать как минимум HOSTNAME и IP_ADDRESS)  
Также не забудьте сделать псевдоним

В зависимости от вашего /etc/vz/vz.conf, пути в приведенном выше могут отличаться. Я использую следующие настройки:

VE_ROOT=/vz/root/$VEID
VE_PRIVATE=/vz/private/$VEID

Затем нам нужно отредактировать /etc/vz/conf/2010.conf, изменить, например, HOSTNAME на host10, IP_ADDRESS на 192.168.100.10 и мы готовы к новому контейнеру. Мы также создадим псевдоним для нового контейнера, который будет описан в следующем разделе.

Работа с контейнерами OpenVZ

Контейнеры ovz идентифицируются по номеру. Мне удобнее ссылаться на них по имени/псевдониму, чтобы не нужно было запоминать, например, что 2010 - это идентификатор контейнера, работающего с dns службой. Кроме того, я также хочу освободить себя от запоминания различных команд vzctl, vzlist, vzquota и т.д. и их параметров. Поэтому я создаю несколько простых скриптов, чтобы помочь себе.

  • Сначала я создаю список псевдонимов /etc/vz-aliases: # псевдонимы для openvz VE's 2001 test 2002 template 2010 dns 2020 ldap 2030 mail 2040 web ...
  • Чтобы переводить между ID и псевдонимами, я создаю скрипт /usr/local/bin/vz-get-alias следующим образом и делаю vz-get-veid символической ссылкой на vz-get-alias: #!/bin/sh vz_alias_file="/etc/vz-aliases" case $0 in *vz-get-alias) cat $vz_alias_file | egrep "^[[:space:]]*$1[[:space:]]" | awk '{print $2}' ;; *vz-get-veid) cat $vz_alias_file | egrep "[[:space:]]$1[[:space:]]*$" | awk '{print $1}' ;; esac
  • Затем я помещаю частые команды для манипуляции контейнерами ovz в скрипт, называемый /usr/local/bin/vz-cmd-generic: #!/bin/sh set -e ## сначала обрабатываем vz-list, так как он не требует ID/псевдонима case $0 in *vz-list) sedfile=`mktemp` cat /etc/vz-aliases | egrep '^[0-9]' | \ sed 's/\([0-9]*\) *\([a-zA-Z0-9-]*\)/s,\1 .*,\&\2,/' > $sedfile sudo vzlist "$@" | sed 's/ $//' | \ sed -f $sedfile | \ sed '1s/$/ALIAS/' exit ;; esac ## другие команды требуют ID или псевдоним if [ -z "$1" ]; then echo "Использование: $0 |<псевдоним> [<аргументы>]" exit 1 fi veid=`/root/bin/vz-get-veid $1` if [ -z "$veid" ]; then veid=$1 fi shift case $0 in *vz-start) sudo vzctl start $veid ;; *vz-restart) sudo vzctl restart $veid ;; *vz-stop) sudo vzctl stop $veid ;; *vz-enter) sudo vzctl enter $veid ;; *vz-exec) sudo vzctl exec $veid "$@" ;; *vz-edit) sudo vi /etc/vz/conf/$veid.conf ;; *vz-quota-ls) sudo vzquota stat $veid ;; *vz-ubc) sudo head -2 /proc/user_beancounters sudo cat /proc/user_beancounters | egrep -A23 "^[[:space:]]+${veid}:" ;; esac И сделать все команды vz-start, vz-stop, vz-exec и т.д. символическими ссылками на этот скрипт vz-cmd-generic.

Использование тогда просто:

  • чтобы перечислить все работающие контейнеры: vz-list VEID NPROC STATUS IP_ADDR HOSTNAME ALIAS 2010 15 running 192.168.100.10 host10 dns 2020 8 running 192.168.100.20 host20 ldap 2030 23 running 192.168.100.30 host30 mail 2040 11 running 192.168.100.40 host40 web
  • чтобы перечислить все контейнеры (включая те, которые не работают): vz-list -a VEID NPROC STATUS IP_ADDR HOSTNAME ALIAS 2002 - stopped 192.168.100.2 host2 template 2010 15 running 192.168.100.10 host10 dns 2020 8 running 192.168.100.20 host20 ldap 2030 23 running 192.168.100.30 host30 mail 2040 11 running 192.168.100.40 host40 web
  • чтобы запустить/остановить/перезапустить контейнер: - vz-start dns
  • vz-stop dns
  • vz-restart dns
  • чтобы выполнить команду внутри контейнера: vz-exec dns aptitude update
  • чтобы проверить UBC контейнера: vz-ubc dns
  • чтобы проверить квоту контейнера: vz-quota-ls dns
  • также возможно использовать ID вместо псевдонима: vz-ubc 2010

Также хорошо, чтобы псевдоним был уникальным на разных реальных серверах, чтобы мы могли делиться /etc/vz-aliases между ними без конфликтов.

Эта статья уже довольно длинная, так что давайте остановимся здесь. Мы продолжим в следующей части, где обсудим такие вопросы, как развертывание обнаружения вторжений с OSSEC, как мониторить и устанавливать параметры UBC для контейнеров и т.д.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.