Генеральный спонсор: Хостинг «Джино»

Система Orphus
Russian version
Добавить на Del.icio.us
English version
Добавить на Digg.com

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

Карта сайта :: Форум «Лаборатории» :: Проект «Денвер»
Проект «Orphus» :: Куроводство: наблы :: Конструктор


2010-03-16
Обсудить на форуме

Принять участие в разработке библиотеки/утилиты можно на GitHub.

Dklab vzfirewall — это утилита для OpenVZ, позволяющая конфигурировать firewall без утомительного ввода iptables-правил и без "завязки" на множество IP-адресов виртуальных машин. Главный принцип утилиты — быть настолько простой в использовании, насколько это возможно.

Преамбула

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

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

Экспресс-установка

cd /usr/sbin
wget http://github.com/DmitryKoterov/vzfirewall/raw/master/vzfirewall
chmod +x vzfirewall

Примеры

Примеры приводятся для Linux RedHat и CentOS. В других ОС настройки должны быть аналогичными.

Листинг 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, хранящем настройки хост-системы.

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

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

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

Можно запустить 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-адреса:







Дмитрий Котеров, Лаборатория dk. ©1999-2014
GZip
Добавить на Del.icio.us   Добавить на Digg.com   Добавить на reddit.com