Pull to refresh

dklab vzfirewall: простое управление firewall-ом в OpenVZ

Reading time 5 min
Views 2.6K
Dklab vzfirewall — это утилита для OpenVZ, позволяющая конфигурировать firewall без утомительного ввода iptables-правил и без «завязки» на множество IP-адресов виртуальных машин. Главный принцип утилиты — быть настолько простой в использовании, насколько это возможно. Цель, которую я преследовал при создании утилиты, — избавить системного администратора от головной боли, связанной с конфигурированием iptables; надеюсь, у меня это хоть немного получилось.

Конечно, я понимаю, что вам может быть страшновато пробовать vzfirewall сразу на продакшен-сервере. Наверняка забудете какие-то порты открыть из нужных. Поэтому хороший момент, когда удобно «пощупать» vzfirewall, — это в момент установки нового сервера с OpenVZ (ну или на дев-сервере). Вот тогда-то уж можно развернуться.

Примеры


Листинг 0: Установка
cd /usr/sbin
wget http://github.com/DmitryKoterov/vzfirewall/raw/master/vzfirewall
chmod +x vzfirewall

Листинг 1: Файл /etc/sysconfig/vz-scripts/101.conf
...
PRIVVMPAGES="300000:300000"
HOSTNAME="example.com"
...
FIREWALL="
    # Allow access from any hosts to HTTP and HTTPS ports.
    [80,443]
    *
    # Allow access to PostgreSQL port only from release.prod machine.
    # Note that you may use domain names here.
    [5432]
    release.prod.example.com
    release.test.example.com
    # Allow access to DNS port (53 UDP).
    [udp:53]
    *
    # Allow access from a subnet to SSH and SMTP.
    [22,25]
    192.168.10.0/24
    192.168.11.0/24
"
Да-да, вот такая многострочная опция FIREWALL появляется в обычном conf-файле OpenVZ. Когда вы поменяли conf-файл, неплохо было бы посмотреть, какие именно команды будут применены iptables. Чтобы не трогать текущую конфигурацию, запустите такую команду:

Листинг 2: Тестирование: какие реально правила iptables будут сгенерированы?
# vzfirewall -t

Теперь при помощи vzfirewall нужно применить правила во всех conf-файлах и записать их «навечно» в /etc/sysconfig/iptables. Запустите:

Листинг 3: Применение правил
# vzfirewall -a

(Эта команда также распечатает DIFF — список изменений в открытых портах, произошедших с момента последнего запуска vzfirewall.)

Для открытия портов на физической машине директиву FIREWALL требуется записать в файл /etc/sysconfig/vz-scripts/0.conf, хранящем настройки хост-системы.

Преамбула


С тех самых пор, как я познакомился с замечательной системой виртуализации OpenVZ в 2005 году, мы мучаемся с настройками iptables для нее. Наверное, сисадмины меня хорошо понимают. С добавлением каждой новой виртуальной машины количество и сложность правил для iptables серьезно возрастает, и в конце концов файл /etc/sysconfig/iptables (в RHEL-системах) превращается в неповоротливого монстра, а смена физической машины с заменой IP-адресов (в том числе через vzmigrate) — в неподъемную и опасную задачу. Ситуацию усложняет то, что для виртуальной машины имеется только одна цепочка FORWARD (для физической же машины конфигурация проще: там есть симметричные INPUT и OUTPUT).

В какой-то момент я сказал себе: «Все, хватит!» и написал за вечер небольшую утилиту vzfirewall, которую и представляю в данной статье. Главная задача, решаемая программой, — позволить одним движением руки и без завязки на «захардкоженные» IP-адреса открыть только те порты для внешних соединений, которые требуются (а остальные — закрыть). При этом конфигурация без всяких изменений выдерживает миграцию с одной физической машины на другую при помощи обычного vzmigrate, а также перезагрузку машины.

Конфигурация firewall хранится прямо в /etc/sysconfig/vz-scripts/*.conf


Как известно, OpenVZ хранит настройки виртуальных машин в файлах /etc/sysconfig/vz-scripts/*.conf (для не-RHEL ОС путь может быть другим). Вся прелесть OpenVZ заключается в том, что для переноса виртуальной машины с одной физической ноды на другую достаточно всего лишь скопировать на новое место ее conf-файл, а также запаковать и перенести саму директорию машины, хранящуеся в /vz/private/*/. Именно это и делает утилита vzmigrate: просто копирует файлы.

Утилита vzfirewall хранит список открытых портов и хостов, которым разрешено соединение с той или иной виртуальной машиной, прямо в ее conf-файле: /etc/sysconfig/vz-scripts/*.conf. Т.к. vzmigrate копирует этот файл целиком при переносе с одной физической машины на другую, настройки firewall-а автоматически вступят в силу на новом месте.

Используйте DNS-имена машин, а не их IP-адреса


Использование IP-адресов для конфигурирования firewall-а неудобно. Они подвержены смене при переезде с машины на машину, а значит, конфиг-файлы также придется менять.

Утилита vzfirewall позволяет вам указывать доменные имена машин, с которых разрешен доступ. Эти имена, конечно же, транслируются в IP-адреса в момент применения правил по vzfirewall -a, однако это происходит прозрачно для пользователя.

Еще раз: в файл /etc/sysconfig/iptables попадают уже IP-адреса, а не имена машин. Таким образом, даже если при загрузке ОС DNS-сервер недоступен, firewall продолжает работать. И, конечно, vzfirewall умеет работать с DNS-записями, к которым привязаны сразу несколько IP-адресов.

Тестовый режим запуска: что будет применено?


Можно запустить vzfirewall в режиме «dry-run», чтобы посмотреть, какие именно правила будут применены по сравнению с предыдущим состоянием firewall-a.

Листинг 4: Тестовый режим запуска vzfirewall
# vzfirewall -t

В STDOUT программа распечатает новый список правил, а в STDERR — результат команды diff для нового и старого набора команд iptables. При этом конфигурация firewall-а останется без изменения.

Временное отключение firewall-а


Утилита vzfirewall заботится о том, чтобы машина всегда была доступна, даже при ошибке в правилах или другом сбое. Поэтому, наример, порт 22 (SSH) на физической хост-машине всегда остается открытым, независимо от того, есть для него правило или нет.

Иногда встречается случай, что вам нужно для диагностики временно отключить firewall на машине (открыть все порты). Для этого можно спокойно использовать команду:

Листинг 5: Временное отключение firewall-а целиком
# iptables --flush

Для повторного включения firewall-а запустите:

Листинг 6: Форсированное включение firewall-а
# vzfirewall -f -a

Ключ -f (от «force») очень тут важен, т.к. после iptables --flush содержимое файла /etc/sysconfig/iptables остается без изменений. А значит, простой запуск vzfirewall -a не даст результата: утилита обнаружит, что, якобы, никакие настройки firewall-а не менялись и не будет ничего применять.

Ручные настройки firewall-а и макрос $THIS


Вы можете не только перечислять имена хостов и номера портов в свойстве FIREWALL conf-файла, но также и задавать «голые» директивы iptables, которые будут применены к той или иной виртуальной машине. При этом для ссылки на IP-адрес машины используется макрос $THIS. Пример:

Листинг 7: Ручные правила iptables: файл 101.conf
...
PRIVVMPAGES="300000:300000"
HOSTNAME="example.com"
...
FIREWALL="
    [CUSTOM]
    # You may use "$THIS" macro which is replaced by this machine IP
    # (and, if the machine has many IPs, it will be multiplicated).
    -A INPUT -i eth2 -d $THIS -j ACCEPT
    # Or you may use commands with no references to $THIS (only
    # such commands are allowed for 0.conf file).
    -A INPUT -i eth1 -j ACCEPT
"

Что произойдет, если у машины несколько IP-адресов? Команда будет продублирована несколько раз, по числу адресов, если в ней встречается $THIS. Если же ручные правила указаны у физической машины (в файле 0.conf), то $THIS в них недоступен; это особенность утилиты vzfirewall. (Но, т.к. для физической машины используются цепочки INPUT и OUTPUT, а для виртуальной — только FORWARD, проблем, как правило, не возникает.)

Резюме


Утилита dklab vzfirewall хорошо делает ровно одну вещь: ограничивает входящие подключения к машине. Она не умеет ограничивать исходящие соединения, учитывать трафик, лимитировать пропускную способность канала, форматировать винчестер и жарить яичницу (последний пункт, впрочем, в разработке).

В интернете можно найти некоторое количество похожих инструментов и статей, однако те, что я видел, имеют одни и те же недостатки: сложность и необходимость явной «завязки» за IP-адреса: Ссылка на страничку утилиты vzfirewall: раз. Ссылка на утилиту vzenter, которая упрощает повседневное использование vzctl enter: два.
Tags:
Hubs:
+21
Comments 14
Comments Comments 14

Articles