Conectando a um servidor SMTP em localhost:25 sem autenticação?

Em 2019, essa é a configuração padrão do Postfix no RHEL/CentOS. O Postfix se vincula apenas à interface de loopback e rejeita todas as solicitações SMTP que não se originam de 127.0.0.0/8. Nenhuma autenticação é necessária. Não tenho certeza sobre o Debian, mas imagino que o exim tenha uma configuração padrão semelhante.

Alguns tópicos relevantes nestes fóruns de outros usuários que enfrentaram esse problema:

Parece não haver um tópico sobre como configurar isso no RHEL/CentOS com as alterações necessárias tanto no Discourse quanto no Postfix, então estou documentando isso aqui.

Isso não parece ser possível com o script discourse-setup, mas consegui fazer funcionar.

Primeiro, precisei descobrir o endereço IP do host Docker conforme visto pelo contêiner Docker. Usar 127.0.0.1 não funcionará porque o contêiner Docker verá 127.0.0.1 como ele mesmo. Em vez disso, precisamos especificar o endereço IP ou o nome de host do host Docker que está executando o servidor SMTP do Postfix, e que seja acessível pelo contêiner Docker (portanto, não o endereço IP público do seu host Docker, caso deseje que seu servidor SMTP não seja acessível pela Internet, por exemplo).

Extraí o endereço IP relevante do host Docker (172.17.0.1) da interface docker0 executando o seguinte no host 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 ~]$

Em seguida, editei o arquivo YAML do meu aplicativo Discourse, definindo “DISCOURSE_SMTP_ADDRESS” para 172.17.0.1 conforme acima.

[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]$ 

Observe que primeiro tentei usar o nome de host interno do Docker host.docker.internal para isso, mas aparentemente esse nome de host não está disponível para usuários do Docker no Linux.

Como a configuração padrão do Postfix no RHEL/CentOS se vincula apenas a 127.0.0.1 (o que é bom), você precisará alterar /etc/postfix/main.cf para que ele também se vincule à interface docker0 e adicionar essa sub-rede ao grupo mynetworks, de modo que o tráfego SMTP vindo dos contêineres Docker seja aceito pelo 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]$ 

Após essas alterações, reconstrua o Discourse e ele deverá agora ser capaz de enviar e-mails através do Postfix do seu host Docker.

/var/discourse/launcher rebuild app

Embora isso funcione, tenho algumas perguntas:

  1. Existe alguma outra variável de ambiente ou nome de host que já aponte para o host Docker (172.17.0.1 neste caso)?

Notei que há uma variável de ambiente DISCOURSE_HOST_IP “injetada” pelo launcher. É possível definir a chave YAML DISCOURSE_SMTP_ADDRESS com o mesmo valor que a outra chave YAML, algo assim?

DISCOURSE_SMTP_ADDRESS: $DISCOURSE_HOST_IP
  1. Em geral, quão durável é o IP 172.17.0.1 do host Docker? É sempre esse IP em sistemas RHEL/CentOS? Ele algum dia mudará para mim?