Докерфайл для контейнера Postfix с предопределённым адресом назначения для локальной сети.

Вопрос или проблема

Я бы хотел создать контейнер Docker, который принимает все электронные письма из локальной сети без пароля и посылает им только предопределенное письмо.

К сожалению, контейнер падает, но я не знаю почему. Логи, которые мне известны, не показывают ошибок. Возможно, я смотрю не в то место.

Что у меня есть на данный момент

Dockerfile

# Выберите базовый образ с Postfix
FROM debian:buster

# Установите Postfix и другие необходимые пакеты
RUN apt-get update && \
    apt-get install -y postfix mailutils

# Скопируйте конфигурационные файлы
COPY main.cf /etc/postfix/main.cf
COPY run.sh /usr/local/bin/run.sh
COPY sasl_passwd /etc/postfix/sasl_passwd

# Сделать стартовый скрипт исполняемым
RUN chmod +x /usr/local/bin/run.sh

# Порт для SMTP
EXPOSE 25

# Стартовый скрипт как точка входа
ENTRYPOINT ["/usr/local/bin/run.sh"]

main.cf

# /etc/postfix/main.cf
smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# Правила отклонения электронной почты
smtpd_relay_restrictions = permit_mynetworks reject_unauth_destination
myhostname = localhost
mydestination = localhost

# Диапазон сети, который может отправлять почту
mynetworks = 192.168.0.0/24

# Адрес пересылки
relayhost = [smtp.your-email-provider.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_use_tls = yes

sasl_password

smtp.server:587 user:password

run.sh

#!/bin/bash
# Преобразование sasl_passwd в правильный формат и установка разрешений
postmap /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

# Запуск Postfix
service postfix start

recipient_canonical

/.*/    [email protected]

Ответ или решение

Создание и запуск контейнера Docker для Postfix, который принимает все электронные письма из локальной сети без пароля и отправляет их на предопределенный адрес, может казаться задачей из разряда "проще простого", но на практике она часто вызывает трудности. В вашем случае, контейнер падает без видимой причины. Давайте подробно разберем потенциальные причины неисправностей и шаги их устранения на основе предоставленного вами файла Dockerfile и сопутствующих конфигураций.

Теория

Концептуально, вы стремитесь настроить Postfix как ретранслятор для всех сообщений внутри локальной сети с дальнейшей отправкой на внешний SMTP-сервер с использованием аутентификации. Это требует точной конфигурации нескольких аспектов: разрешений для сетей, аутентификации SMTP, а также настройки TLS для безопасной передачи данных. Вы также должны обеспечить корректную работу процессов внутри контейнера и правильное отображение логов для диагностики возможных проблем.

Пример

Итак, у вас имеется Dockerfile, который настраивает контейнер на базе Debian с установленным Postfix. Давайте рассмотрим каждый шаг.

  1. Выбор базового образа и установка зависимостей:

    FROM debian:buster
    
    RUN apt-get update && \
       apt-get install -y postfix mailutils

    Здесь мы используем образ debian:buster, который является стабильным и хорошо документированным. Этот образ подходит для большинства серверных приложений. Вы устанавливаете Postfix и необходимые утилиты для работы с почтой.

  2. Копирование конфигурационных файлов:

    COPY main.cf /etc/postfix/main.cf
    COPY run.sh /usr/local/bin/run.sh
    COPY sasl_passwd /etc/postfix/sasl_passwd
    
    RUN chmod +x /usr/local/bin/run.sh

    Вы копируете основные конфигурационные файлы, включая main.cf для настройки Postfix и скрипт run.sh для автоматического запуска сервиса. Важно проверить, чтобы файлы действительно корректно копировались и были доступны контейнеру.

  3. Открытие порта и точка входа:

    EXPOSE 25
    ENTRYPOINT ["/usr/local/bin/run.sh"]

    Порт 25 открыт для приема SMTP-сообщений. Скрипт run.sh является точкой входа для запуска службы Postfix.

Применение

Теперь давайте рассмотрим возможные причины сбоя контейнера и варианты их решения.

1. Проверьте журналы ошибок

Прежде всего, проведите тщательный анализ логов. Возможно, вы смотрели не те журналы, или не все журналы были доступны. Проверьте следующее:

  • Логи Docker контейнера:
    docker logs <container_id>
  • Логи Postfix внутри контейнера:
    docker exec -it <container_id> tail -f /var/log/mail.log

Логи должны дать более детальную информацию о том, почему Postfix не запускается как надо или почему происходит сбой.

2. Проверьте конфигурацию Postfix

Конфигурационный файл main.cf определяет ключевые параметры работы:

  • Убедитесь, что mynetworks правильно настроены и совпадают с вашей локальной сетью.

  • relayhost должен быть корректным, и для него должна быть установлена авторизация SMTP через файл sasl_passwd. Проверьте правильность заполнения sasl_passwd, а также убедитесь, что плата за аутентификацию сохранена в формате db:

    postmap /etc/postfix/sasl_passwd
  • Настройка TLS может быть чувствительна к ошибкам. Убедитесь, что файл smtp_tls_CAfile правильный и существует внутри контейнера.

3. Убедитесь в корректной настройке прав доступа

Права на файлы /etc/postfix/sasl_passwd и /etc/postfix/sasl_passwd.db должны быть ограничены, чтобы только Postfix мог получить доступ:

chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

4. Исправьте скрипт запуска

Скрипт run.sh должен не только запускать Postfix, но и обеспечивать, чтобы процесс контейнера не завершался немедленно. Вы используете Bash для автоматического запуска, поэтому:

#!/bin/bash

postmap /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

service postfix start

# Не позволяйте контейнеру завершаться:
tail -f /var/log/mail.log

Команда tail -f обеспечивает постоянную работу процесса.

Заключение

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

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

Капча загружается...