|
|
dkLab | Конструктор | dklab vzfirewall: простое управление firewall-ом в OpenVZ
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-адреса открыть только те порты
для внешних соединений, которые требуются (а Экспресс-установкаcd /usr/sbin wget http://github.com/DmitryKoterov/vzfirewall/raw/master/vzfirewall chmod +x vzfirewall ПримерыПримеры приводятся для Linux RedHat и CentOS. В других ОС настройки должны быть аналогичными.
Да-да, вот такая многострочная опция FIREWALL появляется в обычном conf-файле OpenVZ. Когда вы поменяли conf-файл, неплохо было бы посмотреть, какие именно команды будут применены iptables. Чтобы не трогать текущую конфигурацию, запустите такую команду:
Теперь при помощи vzfirewall нужно применить правила во всех conf-файлах и
записать их "навечно" в
(Эта команда также распечатает 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 в режиме "dry-run", чтобы посмотреть, какие именно правила будут применены по сравнению с предыдущим состоянием firewall-a.
В STDOUT программа распечатает новый список правил, а в Временное отключение firewall-аУтилита vzfirewall заботится о том, чтобы машина всегда была доступна, даже при ошибке в правилах или другом сбое. Поэтому, наример, порт 22 (SSH) на физической хост-машине всегда остается открытым, независимо от того, есть для него правило или нет. Иногда встречается случай, что вам нужно для диагностики временно отключить firewall на машине (открыть все порты). Для этого можно спокойно использовать команду:
Для повторного включения firewall-а запустите:
Ключ -f (от "force") очень тут важен, т.к. после Ручные настройки firewall-а и макрос $THISВы можете не только перечислять имена хостов и номера портов в свойстве FIREWALL conf-файла, но также и задавать "голые" директивы iptables, которые будут применены к той или иной виртуальной машине. При этом для ссылки на IP-адрес машины используется макрос $THIS. Пример:
Что произойдет, если у машины несколько IP-адресов? Команда будет
продублирована несколько раз, по числу адресов, если в ней встречается $THIS.
Если же ручные правила указаны у физической машины (в файле 0.conf),
то $THIS в них недоступен;
это особенность утилиты vzfirewall. (Но, т.к. для физической машины
используются цепочки INPUT и OUTPUT, а для РезюмеУтилита dklab vzfirewall хорошо делает ровно одну вещь: ограничивает входящие подключения к машине. Она не умеет ограничивать исходящие соединения, учитывать трафик, лимитировать пропускную способность канала, форматировать винчестер и жарить яичницу (последний пункт, впрочем, в разработке). В интернете можно найти некоторое количество похожих инструментов и статей, однако те, что я видел, имеют одни и те же недостатки: сложность и необходимость явной "завязки" за IP-адреса:
раскрой лдсп |