Расширение правил iptables на хостах oVirt 4.0

В одной из прошлых заметок я описывал пример установки набора утилит HP System Management Tools на физическом сервере HP ProLiant DL360 G5 с ОС CentOS Linux 7.2. Некоторое время спустя этот же сервер был использован в качестве хоста виртуализации и на нём были развёрнуты компоненты oVirt Hosted Engine. Недавно хост был выведен в обслуживание и на него из онлайн репозиториев были установлены обновлённые версии пакетов, а в число обновлённых пакетов вошли и пакеты с утилитами HP. После установки я решил проверить работоспособность обновлённых утилит и попытался открыть веб-узел HP System Management Homepage. Однако из этого ничего не вышло, так как хост попросту блокировал обращения на порт TCP 2381.

Выяснилось, что служба firewalld на хосте остановлена, а служба iptables загружена с набором правил специфичных для oVirt. Причём правила на всех хостах oVirt, которые я разворачивал с веб-консоли oVirt Engine, одинаковые. А для того, чтобы изменить правила, централизовано раздаваемые сервером управления на хосты, потребуется воспользоваться утилитой engine-config на стороне сервера Engine.

Утилита engine-config имеет большой набор ключей, значения которых определяют конфигурацию инфраструктуры oVirt. Узнаем ключи конфигурации oVirt, связанные с настройкой iptables:

# engine-config --list | grep -i iptables

IPTablesConfig: "iptables configuration" (Value Type: String)
IPTablesConfigSiteCustom: "iptables site custom configuration, appended to IPTablesConfig" (Value Type: String)

Как видим, в нашем распоряжении два ключа. В ключе IPTablesConfig хранятся все правила, которые централизовано раздаются сервером управления на хосты. А ключ IPTablesConfigSiteCustom может содержать дополнительные правила, которые могут потребоваться в той или иной инфраструктуре.

Посмотрим на текущую конфигурацию правил для хостов, хранящуюся в ключе IPTablesConfig:

# engine-config --get IPTablesConfig

IPTablesConfig:
# oVirt default firewall configuration. Automatically generated by vdsm bootstrap script.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
# vdsm
-A INPUT -p tcp --dport @VDSM_PORT@ -j ACCEPT
# ovirt-imageio-daemon
-A INPUT -p tcp --dport 54322 -j ACCEPT
# rpc.statd
-A INPUT -p tcp --dport 111 -j ACCEPT
-A INPUT -p udp --dport 111 -j ACCEPT
# SSH
-A INPUT -p tcp --dport @SSH_PORT@ -j ACCEPT
# snmp
-A INPUT -p udp --dport 161 -j ACCEPT
# Cockpit
-A INPUT -p tcp --dport 9090 -j ACCEPT

@CUSTOM_RULES@

# Reject any other input traffic
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -m physdev ! --physdev-is-bridged -j REJECT --reject-with icmp-host-prohibited
COMMIT
 version: general

Как видим, в правилах есть переменная @CUSTOM_RULES@, на место которой при формировании правил на конечном хосте попадает содержимое из ключа IPTablesConfigSiteCustom.

Таким образом, чтобы добавить в общую конфигурацию iptables собственные правила, можно воспользоваться утилитой engine-config в следующем порядке:

# engine-config --set IPTablesConfigSiteCustom='
-A INPUT -p tcp --dport 2301 -m comment --comment "HPE System Management Homepage" -j ACCEPT
-A INPUT -p tcp --dport 2381 -m comment --comment "HPE System Management Homepage (Secure port)" -j ACCEPT
'

При выполнении такой команды важно соблюдать перенос строк именно в таком виде, как показано в примере, то есть в начале значения открывающаяся кавычка с переносом строки, затем каждое правильно в отдельной строке и в конце закрывающаяся кавычка тоже в отдельной строке.

Проверим результат, чтобы понять, что записалось в ключ IPTablesConfigSiteCustom:

# engine-config --get IPTablesConfigSiteCustom

IPTablesConfigSiteCustom:
-A INPUT -p tcp --dport 2301 -m comment --comment "HPE System Management Homepage" -j ACCEPT
-A INPUT -p tcp --dport 2381 -m comment --comment "HPE System Management Homepage (Secure port)" -j ACCEPT
 version: general

Как видим, каждое созданное нами правило идёт в отдельной строке, не смешиваясь со служебными записями. После правки конфигурации перезагрузим службу ovirt-engine и убедимся в том, что в процессе запуска службы не возникнет ошибок:

# service ovirt-engine restart

Конфигурация oVirt Engine обновлена и теперь при последующих развёртываниях хостов, на хост будут добавляться наши дополнительные правила iptables.

Но как быть с уже развёрнутыми и работающими хостами, ведь на самом деле ради них всё и затевалось?

Насколько я понял, основным предлагаемым разработчиками oVirt методом обновления конфигурации существующих хостов, будет их перестановка из веб-консоли oVirt Engine. Для этого сначала нужно перевести выбранный хост в режим обслуживания, выбрав в контекстном меню или на панели кнопок Maintenance:

А когда узел будет переведён в режим обслуживания, выполнить его Reinstall:

При этом в форме параметров переустановки узла включаем опцию Automatically configure host firewall (это и позволит доставить на хост дополненные нами правила iptables), а на вкладке Hosted Engine не забываем включить опцию развёртывания DEPLOY, если это требуется:

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

Однако, если у вас по какой-то причине нет желания/возможности заниматься такой переустановкой хостов oVirt, а свои правила добавить на хосты очень хочется, то можно исправить конфигурацию хостов вручную, добавив на на хостах в конце файла /etc/sysconfig/iptables перед строкой с правилом сброса всех входящих соединений (-A INPUT -j REJECT…) свои правила:

...

# Allow HPE System Management Homepage
-A INPUT -p tcp --dport 2301 -m comment --comment "HPE System Management Homepage" -j ACCEPT
-A INPUT -p tcp --dport 2381 -m comment --comment "HPE System Management Homepage (Secure port)" -j ACCEPT

# Reject any other input traffic
-A INPUT -j REJECT --reject-with icmp-host-prohibited
...

Такая правка позволит сохранять собственные правила между перезагрузками хоста, однако она потеряет силу после очередного обновления (Upgrade) или переустановки (Reinstall) хоста из веб-консоли oVirt Engine, поэтому править централизованную конфигурацию с помощью утилиты engine-config всё-равно придётся.

Дополнительные источники информации:

Добавить комментарий