Подключение к SMTP-серверу на localhost:25 без аутентификации?

В 2019 году это конфигурация по умолчанию для postfix в RHEL/CentOS. Postfix привязывается только к петлевому интерфейсу и отбрасывает все SMTP-запросы, которые не исходят из 127.0.0.0/8. Аутентификация не требуется. Насчёт Debian я не уверен, но, думаю, exim имеет аналогичную конфигурацию по умолчанию.

Несколько тем на этих форумах от других пользователей, столкнувшихся с этой проблемой:

Похоже, что темы о том, как настроить это в RHEL/CentOS с необходимыми изменениями как в Discourse, так и в postfix, нет, поэтому я документирую это здесь.

Похоже, что это невозможно сделать с помощью скрипта discourse-setup, но мне удалось заставить это работать.

Сначала мне нужно было определить IP-адрес хоста Docker так, как его видит контейнер Docker. Использование 127.0.0.1 не сработает, потому что контейнер Docker воспримет 127.0.0.1 как себя. Вместо этого нам нужно указать IP-адрес или имя хоста Docker-хоста, на котором запущен SMTP-сервер postfix, и который доступен для контейнера Docker (например, не внешний IP-адрес вашего Docker-хоста, если вы не хотите, чтобы ваш SMTP-сервер был доступен из интернета).

Я извлек соответствующий IP-адрес хоста Docker (172.17.0.1) из интерфейса docker0, выполнив на хосте Docker следующую команду:

[maltfield@osestaging1 ~]$ ip address show docker0
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:80:35:65:a1 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:80ff:fe35:65a1/64 scope link 
       valid_lft forever preferred_lft forever
[maltfield@osestaging1 ~]$

Затем я отредактировал yaml-файл моего приложения Discourse, установив значение “DISCOURSE_SMTP_ADDRESS” в 172.17.0.1 из вышеприведённого.

[maltfield@osestaging1 ~]$ cd /var/discourse/
[maltfield@osestaging1 discourse]$ grep SMTP containers/app.yml
  DISCOURSE_SMTP_ADDRESS: 172.17.0.1
  DISCOURSE_SMTP_PORT: 25
  DISCOURSE_SMTP_AUTHENTICATION: none
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
  DISCOURSE_SMTP_ENABLE_START_TLS: false
[maltfield@osestaging1 discourse]$ 

Обратите внимание, что сначала я попытался использовать внутреннее имя хоста Docker host.docker.internal, но, похоже, это имя хоста недоступно для пользователей Docker в Linux.

Поскольку конфигурация postfix по умолчанию в RHEL/CentOS привязывается только к 127.0.0.1 (что хорошо), вам нужно изменить /etc/postfix/main.cf, чтобы он также привязывался к интерфейсу docker0, и добавить эту подсеть в группу mynetworks, чтобы SMTP-трафик, поступающий из контейнеров Docker, принимался postfix.

[maltfield@osestaging1 postfix]$ grep -ir '172.17' /etc/postfix/*
/etc/postfix/main.cf:inet_interfaces = 127.0.0.1, 172.17.0.1
/etc/postfix/main.cf:mynetworks = 127.0.0.0/8, 172.17.0.0/16
[maltfield@osestaging1 postfix]$ 

После этих изменений пересоберите Discourse, и теперь он должен уметь отправлять электронные письма через postfix вашего Docker-хоста.

/var/discourse/launcher rebuild app

Хотя это работает, у меня есть несколько вопросов:

  1. Существует ли какая-то другая переменная окружения или имя хоста, которые уже указывают на Docker-хост (172.17.0.1 в данном случае)?

Я заметил, что переменная окружения DISCOURSE_HOST_IP «внедряется» launcher. Возможно ли установить ключ yaml DISCOURSE_SMTP_ADDRESS в то же значение, что и другой ключ yaml, используя что-то вроде этого?

DISCOURSE_SMTP_ADDRESS: $DISCOURSE_HOST_IP
  1. В целом, насколько стабилен IP-адрес 172.17.0.1 Docker-хоста? Всегда ли это этот IP в системах RHEL/CentOS? Может ли он когда-нибудь измениться?