Настраивал я как-то резервное копирование виртуальных машин с помощью ghettoVCB на отдельно стоящем гипервизоре ESXi 7. Всё отлично, резервное копирование работает, но почта не отправляется.
Резервное копирование виртуальных машин с помощью ghettoVCB
Скрипт ghettoVCB выполняет резервное копирование виртуальных машин, размещенных на серверах ESX(i) 3.x, 4.x, 5.x, 6.x, 7.x и 8.x, используя методологию, аналогичную инструменту VMware VCB. Скрипт создает моментальные снимки работающих виртуальных машин, делает резервные копии главных VMDK, затем удаляет моментальный снимок до следующего резервного копирования. выполняется на ESXi.
Разработчик скрипта указывает, что проблема может быть в медленном почтовом сервере, и предлагает некоторый путь решения, заключающийся в указании в конфигурационном файле параметра EMAIL_DELAY_INTERVAL, который устанавливает задержку в секундах при общении с почтовым сервером. Вот только этого недостаточно, письмо всё равно не отправляется.
Починим. Отредактируем файл ghettoVCB.sh. После внесения небольших изменений в код получил список ответов от почтового сервера при отправке письма:
220 mail.moipartner.ru ESMTP 250 Hello. 250 OK 250 OK 354 OK, send.
Получается, скрипт соединяется с сервером, общается без проблем, потом после получения ответа "354 OK, send." ничего не происходит. Такой ощущение, что связь рвётся. Лезу в код, нахожу функцию sendDelay() и смотрю.
sendDelay() {
c=0
while read L; do
[ $c -lt 4 ] && sleep ${EMAIL_DELAY_INTERVAL}
c=$((c+1))
echo $L
done
}
Странная картина, первые пять команд отрабатывают с задержкой в EMAIL_DELAY_INTERVAL секунд (у меня в конфигурационной файле EMAIL_DELAY_INTERVAL=1). А остальные команды проходят без задержки. Естественно, они в какой-то момент отваливаются, почтовый сервер просто не успевает.
Переписываю функцию.
sendDelay() {
while read L; do
sleep ${EMAIL_DELAY_INTERVAL}
echo $L
done
}
Теперь задержка в 1 секунду будет на каждой строке. С учётом того, что в письме будет лог отправки, то письмо будет улетать около минуты. А то и больше, если лог большой.
Загружаю скрипт на сервер.
Пуляю бэкап. Ситуация меняется:
220 mail.moipartner.ru ESMTP 250 Hello. 250 OK 250 OK 354 OK, send. 250 Queued (50.456 seconds) 221 goodbye
Теперь вижу "250 Queued", это означает, что почтовый сервер принял письмо к отправке. Кстати, письмо отправлялось 50 секунд, но я это переживу. Заглядываю в свой почтовый ящик:
Письмо пришло!
Настройка Firewall
При бэкапе вы можете видеть в логе ошибку:
ERROR: Please enable firewall rule for email traffic on port 25
Проблема в том, что вы не настроили Firewall.
В гипервизоре ESXi имеется встроенный Firewall. В нём предустановлен ряд правил, удовлетворяющих разработанному функционалу. Однако, имеющиеся правила не всегда покрывают все необходимые порты, иногда требуется дополнительный функционал. Открываю на выход 25 порт. Создам собственный VIB пакет для внесения изменений в Firewall.
Для удобства всё описание вынесено в отдельную статью:
ESXi 7.0 Firewall — добавляем правило для исходящей почты
В статье подробно описана процедура создания и установки VIB пакета, можно скачать готовый. Собственно, пакет я назвал fw-mail. Скачать его можно в Сборке для VMware. Пакет добавляет правило firewall, которое позволяет отправлять уведомления на внешний почтовый сервер.
Копирую ZIP пакет на хост в папку /tmp.
Запускаю службу SSH на хосте, подключаюсь. Проверяю содержимое папки tmp.
ZIP файл присутствует. Разрешаю установку программ и драйверов со сторонними сертификатами. Для этого перед установкой выполняю команду:
esxcli software acceptance set --level=CommunitySupported
Устанавливаю пакет:
esxcli software vib install -d /tmp/fw-mail-1.0-1-offline_bundle.zip
Пакет установлен. В списке установленных VIB пакетов имеется наш новый пакет.
esxcli software vib list | grep mail
Наш XML файл появился в папке /etc/vmware/firewall.
Теперь правило firewall никуда не должно пропасть после перезагрузки хоста. Проверяю — перезагружаю службу firewall.
esxcli network firewall refresh
esxcli network firewall ruleset list | grep Mail
Networking → Firewall rules. Появилось новое правило:
Включаю его.
Actions → Enable.
Доступ для отправки почты появился. Проверить можно с помощью nc.
nc -vz 192.168.1.11 25
Порт открыт.