web-dev-qa-db-fra.com

Utiliser Ubuntu en tant que serveur SMTP pour Gmail

Quelqu'un peut-il m'indiquer un guide d'utilisation de Postfix (ou similaire) pour l'envoi d'e-mails en tant que serveur SMTP pour Gmail. J'ai fait une recherche solide et suis monté les mains vides.

J'ai plusieurs domaines et tous les courriers électroniques se terminent dans Gmail, mais Google a modifié sa politique il y a quelque temps pour empêcher les utilisateurs d'envoyer des courriers électroniques à partir de plusieurs domaines. Désormais, ils insistent pour que vous disposiez de votre propre serveur SMTP. J'ai un VPS Ubuntu que j'utilise pour l'hébergement Web. Y a-t-il une raison pour laquelle je ne pourrais pas l'utiliser comme serveur SMTP pour Gmail?

3
Jonno

REMARQUE: cette réponse est écrite pour un serveur 16.04, mais peut être adaptée pour 14.04 si nécessaire (remplacement des commandes systemctl ... par des commandes service appropriées.)

Il s’agit d’une tâche très complexe très à configurer. Il y a un tonne de parties importantes distinctes dans ceci, mais il y a quatre composants principaux dans une configuration ici, c'est aussi 'sécurisé':

  1. Le fournisseur de services Internet du système utilisé (les adresses IP résidentielles sont généralement "mauvaises"; vous souhaiterez quelque chose dans un centre de données avec une instance VPS ou AWS cloud EC2, ou quelque chose de similaire)

    Fondamentalement, utilisez pas votre propre réseau pour cela. Configurez votre serveur SMTP ailleurs, comme Amazon EC2.

    Cependant, je recommande fortement d'obtenir un VPS distinct, où vous pouvez définir le rDNS pour le Adresse IP correspondant au DNS avant que vous devrez définir. Nous aborderons le DNS plus tard.

  2. Le système lui-même (SSH verrouillé, pare-feu, etc.)

    Nous devons à peu près configurer le système pour interdire les connexions sur le port 25 et sans SSL. Nous devons également verrouiller le système. Nous ferons cette étape en dernier, après nous assurer que le reste fonctionne.

  3. Postfix MTA

    Cela fournit SMTP. En fin de compte, nous n’en avons pas besoin pour livrer des messages n’importe où, nous n’avons donc pas besoin de cela en tant qu’enregistrement MX dans le DNS de votre site, mais nous besoin de certaines choses mises en place; nous avons besoin d'un enregistrement A pour le nom d'hôte et d'un enregistrement DNS inversé (d'où la suggestion d'un VPS réel au lieu d'une instance EC2).

  4. Dovecot Core

    Normalement , nous considérons DoveCot comme un fournisseur de services POP3 ou IMAP, mais dovecot-core peut à lui seul être utilisé pour fournir le backend SASL qui fonctionne sans beaucoup de problèmes, et interagit avec les utilisateurs du système. C'est tout ce pour quoi nous utilisons Dovecot, mais nous devons ajuster certaines configurations.

Je ne parlerai pas du point 1, car je ne peux pas contrôler cela. Je peux cependant vous donner des conseils sur la manière de configurer les choses. Nous allons le faire dans un ordre différent de celui de la liste ci-dessus, mais nous allons tout faire.


Dovecot Core

dovecot-core sera utilisé pour le backend SASL. Nous aurons besoin de travailler plus tard pour un envoi "sécurisé" du courrier, mais nous pouvons démarrer la configuration du backend de Dovecot.

Tout d'abord, installez dovecot-core:

Sudo apt-get install dovecot-core

Ensuite, nous devons apporter quelques modifications à /etc/dovecot/conf.d/10-auth.conf.

Désactivons l'authentification en texte brut et exigeons SSL pour les informations d'identification. Cela n’a finalement aucune importance pour postfix -> pigeonnier, mais c’est une bonne chose à faire.

TROUVER: #disable_plaintext_auth = yes

REMPLACER PAR: disable_plaintext_auth = yes

Ensuite, nous devons activer le mécanisme d'authentification 'login'.

TROUVER: auth_mechanisms = plain

REMPLACER PAR: auth_mechanisms = plain login

Ensuite, nous devons éditer le fichier /etc/dovecot/conf.d/10-master.conf.

TROUVER:

 # Postfix smtp-auth
 #unix_listener /var/spool/postfix/private/auth {
 #  mode = 0666
 #}

MODIFIER POUR ÊTRE:

 # Postfix smtp-auth
 unix_listener /var/spool/postfix/private/auth {
   mode = 0660
   user = postfix
   group = postfix
 }

Cela active le backend d'authentification Postfix de SASL dans Dovecot.

Enfin, pour Dovecot, nous devons éditer /etc/dovecot/conf.d/auth-system.conf.ext:

TROUVER:

passdb {
  driver = pam
  # [session=yes] [setcred=yes] [failure_show_msg=yes] [max_requests=<n>]
  # [cache_key=<key>] [<service name>]
  #args = dovecot
}

MODIFIER POUR ÊTRE:

passdb {
  args = %s
  driver = pam
  # [session=yes] [setcred=yes] [failure_show_msg=yes]
  # [max_requests=> <n>]
  # [cache_key=<key>] [<service name>]
  #args = dovecot
}

Une fois que cela est fait, nous pouvons redémarrer le processus Dovecot:

Sudo systemctl restart dovecot

Postfix

Maintenant, pour les choses SMTP réelles. Ce n'est pas aussi difficile à configurer que Dovecot heh.

Tout d’abord, installez Postfix et le package ssl-cert qui créera un certificat auto-signé de base suffisant pour fonctionner avec l’autorisation SASL sécurisée pour les clients SMTP:

Sudo apt-get install postfix ssl-cert

Lorsque vous êtes invité à indiquer les types de sites Postfix, sélectionnez simplement "Site Internet".

Une fois que cela est fait, nous devons apporter quelques modifications aux fichiers Postfix.

Trouvez cette ligne:

smtp      inet  n       -       y       -       -       smtpd

Ajouter en dessous de ces lignes, de sorte que la ligne ressemble à ceci avec deux lignes supplémentaires en dessous:

smtp      inet  n       -       y       -       -       smtpd
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth

Il y a aussi une énorme section commençant par submission qui est commentée. Prenez la section entière, décommentez cette section et donnez-lui la forme suivante:

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_wrappermode=yes
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
#  -o smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,check_policy_service unix:private/policy-spf,reject
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o smtpd_reject_unlisted_recipient=yes
  -o milter_macro_daemon_name=ORIGINATING
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth

Maintenant que ceci est configuré, nous devons maintenant modifier les paramètres principaux, en modifiant /etc/postfix/main.cf.

Tout d'abord, déplacez /etc/postfix/main.cf vers /etc/postfix/main.cf.dist:

Sudo mv /etc/postfix/main.cf /etc/postfix/main.cf.dist

Ensuite, mettez ce qui suit dans un nouveau fichier. Assurez-vous de mettre à jour les noms de domaine et les noms d'hôte pour au moins un de vos domaines:

# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_use_tls=yes
smtpd_tls_security_level=may
smtpd_tls_auth_only=no
smtp_tls_note_starttls_offer=yes
# Use an actual certificate.
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
# Use an actual key.
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
#smtpd_tls_session_cache_database=btree:${data_directory}/smtpd_scache
smtpd_tls_mandatory_protocols = !SSLv2,!SSLv3
smtpd_tls_protocols = !SSLv2,!SSLv3
smtpd_tls_mandatory_ciphers = medium
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
tls_random_source = dev:/dev/urandom
#tls_medium_cipherlist = AES128+EECDH:AES128+EDH

smtpd_client_connection_rate_limit = 50
anvil_rate_time_unit = 120s

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, check_policy_service unix:private/policy-spf

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
myhostname = mail.somedomain
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = $myhostname somedomain mail.somedomain localhost.somedomain localhost
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

local_recipient_maps = proxy:unix:passwd.byname $alias_maps

milter_protocol = 2
milter_default_action = accept

queue_directory = /var/spool/postfix

Notez qu'une bonne partie des options de configuration ici sont utilisées principalement pour une configuration complète SMTP/IMAP avec un backend Dovecot. Vous pouvez toujours utiliser cette configuration, car elle provient d’un serveur de messagerie réel (avec certaines données lol obscurcies), en tant que base pour configurer ceci afin d’utiliser uniquement la partie SMTP de votre travail. Donc, finalement, ne vous inquiétez de rien d'autre.

Notez que je vous recommande d’obtenir un certificat SSL uniquement pour le serveur de messagerie ou, si vous disposez d’un certificat générique pour l’un de vos domaines, utilisez-le et définissez le nom de messagerie sur un domaine de ce certificat. Ainsi, vous n'utilisez pas de certificats SSL auto-signés pour le cryptage SSL/TLS sur la connexion. Mes deux cents seulement, vous pouvez toujours utiliser l'auto-signé pour la plupart des choses si vous ne faites que soumettre un courrier électronique à partir d'un client SMTP, tel que la fonction Envoyer un courrier électronique de Google.

Une fois que vous avez terminé ici, nous devons arrêter puis démarrer le processus Postfix:

Sudo systemctl stop postfix
Sudo systemctl start postfix

Nous devrions maintenant pouvoir utiliser Postfix et Dovecot SASL.


Nous avons cependant besoin d'un utilisateur avec lequel authentifier.

Nous n'avons pas créé d'utilisateur et vous n'avez que quelques options. Dans notre cas, nous allons créer un utilisateur dédié à cette fin d'authentification SMTP.

Nous allons créer l'utilisateur avec les éléments suivants:

Sudo useradd --create-home --user-group --Shell /usr/sbin/nologin authsmtpuser

Nous devons ensuite définir un mot de passe. Vous pouvez le faire avec la commande suivante et entrez le mot de passe en conséquence. (Les caractères n'apparaîtront pas, pas plus que les espaces réservés quand il vous le demandera malheureusement)

Sudo passwd authsmtpuser

Si vous ne le faites pas et que vous souhaitez autoriser un autre nom d'utilisateur (PAS la racine), utilisez-le dans le script ci-dessous.


Maintenant, nous pouvons tester des choses.

Testons ceci. Ceci est un script très simple Python 3 que vous pouvez utiliser pour "tester" que tout fonctionne comme prévu c'est à. Assurez-vous de mettre à jour DESTINATION_ADDRESS, SOURCE_ADDRESS, SMTP_USERNAME, SMTP_PASSWORD et SMTP_SERVER_ADDR ici pour vous assurer que ce script Enregistrez ceci sous test_smtp_server_tls.py quelque part et rappelez-vous où nous l'avons enregistré. (Vous pouvez le créer dans /tmp/ si vous le souhaitez afin qu'il ne persiste pas sur votre ordinateur après un redémarrage)

#!/usr/bin/env python3

import email.utils as emailutils
import smtplib
from email.mime.text import MIMEText

DESTINATION_ADDRESS = '[email protected]'
SOURCE_ADDRESS = '[email protected]'

SMTP_USERNAME = 'authsmtpuser'
SMTP_PASSWORD = 'your password'
SMTP_SERVER_ADDR = 'ip.add.re.ss'
SMTP_SERVER_PORT = 587  # Don't change this.

# Construct a test message.
msg = MIMEText("This is a test message from your custom SMTP server!")
msg['To'] = DESTINATION_ADDRESS
msg['From'] = SOURCE_ADDRESS
msg['Date'] = emailutils.formatdate(localtime=True)
msg['Message-ID'] = emailutils.make_msgid()
msg['Subject'] = "SMTP Server Mail Testing"

try:
    print ("Establishing SMTP connection with SSL...")
    conn = smtplib.SMTP_SSL(SMTP_SERVER_ADDR, SMTP_SERVER_PORT)
    print ("Established connection.")
except Exception as e:
    print ("Could not establish SMTP connection.  Error was:\n%s" % str(e))
    exit(1)

try:
    print ("Attempting to authenticate...")
    (_, response) = conn.login(SMTP_USERNAME, SMTP_PASSWORD)
    if 'Authentication successful' in response.decode('utf-8'):
        print ("Authenticated with SMTP server successfully.")
    else:
        print ("Could not authenticate with server, response was: %s" % response.decode('utf-8'))
        exit(2)
except Exception as e:
    print ("Could not authenticate with SMTP.  Error was:\n%s" % str(e))

try:
    print ("Sending test message to [%s] from [%s] with subject [%s]..." % (DESTINATION_ADDRESS, SOURCE_ADDRESS, msg['Subject']))
    conn.sendmail(SOURCE_ADDRESS, DESTINATION_ADDRESS, msg.as_string())
    print ("Message queued for sending, please check your destination email inbox and junk folders for the message.")
except Exception as e:
    print ("Could not send email.  Error was:\n%s" % str(e))
    exit(3)

exit(0)

Exécutez ce script avec python3 /tmp/test_smtp_server_tls.py (en supposant que vous l'avez enregistré dans /tmp/; changez le chemin si vous l'avez enregistré ailleurs.

Vérifiez la boîte de réception de l'adresse e-mail de destination, etc. Si tout fonctionne, vous recevrez rapidement un courrier électronique de votre serveur et du domaine personnalisé. Il se peut que votre courrier se trouve dans votre boîte aux lettres indésirable. Vérifiez donc si vous ne recevez pas le message initialement.


Le système - l'heure du verrouillage!

Cela suppose que toutes les étapes ci-dessus ont fonctionné, bien sûr.

Il est temps de configurer le pare-feu pour interdire les accès non autorisés. Notez que je déteste ufw, ce n'est pas assez complexe pour mes besoins, alors j'ai écrit cette réponse avec iptables - vous pouvez faire Sudo ufw disable pour désactiver UFW et utiliser direct iptables manipulation. Je suppose également que vous avez IPv4 sur le système.

Si vous avez déjà des règles de pare-feu en place, ajoutez simplement une règle pour accepter de nouvelles connexions sur le port 587.

Si vous n’avez pas de pare-feu activé, exécutez ces commandes (ajoutez des lignes iptables -A INPUT -p tcp --dport 123 -m conntrack --ctstate NEW -j ACCEPT supplémentaires, en remplaçant 123 par le numéro de port réel de tout autre service de votre système auquel vous devez accepter des connexions, tel que tcp/443 et tcp/80 pour HTTPS et HTTP en conséquence, avant de faire la ligne -j DROP):

Sudo iptables -A INPUT -i lo -j ACCEPT
Sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
Sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m comment --comment "Allow SSH access remotely." -j ACCEPT
Sudo iptables -A INPUT -p tcp --dport 587 -m conntrack --ctstate NEW -m comment --comment "Allow TLS-protected SMTP connections, for sending mail." -j ACCEPT
Sudo iptables -A INPUT -j DROP

Une fois tout cela configuré, exécutez la commande suivante: Sudo apt-get install iptables-persistent. Lorsqu'il vous demande de sauvegarder les jeux de règles actuels, cliquez sur "Oui" pour chacun d'eux.

Assurez-vous que votre script de test ci-dessus et votre accès SSH fonctionnent toujours avant de fermer la connexion SSH ou la connexion à votre serveur! Si tout fonctionne correctement, la dernière étape consiste à configurer l'alias Google et à lui dire d'envoyer le protocole SMTP à partir de ce domaine avec un serveur différent.


Configuration de Google

Si votre GMail est sous un système Google Apps et que vous n'êtes pas sur un plan Google Apps vous permettant d'utiliser des serveurs SMTP externes pour l'envoi de courrier, alors ne pas être capable de faire cette partie . Il s'agit d'une restriction imposée par Google et je ne peux pas vous aider.

De la page GMail, nous devons configurer les choses. Tout d'abord, allez dans vos paramètres GMail.

GMail Settings Button

Une fois dans vos paramètres, allez dans l'onglet Comptes et importations.

Jusqu'à présent, vous devrez "supprimer" tous les alias définis, dans la section "Envoyer un courrier en tant que", puis cliquer sur "Ajouter une autre adresse électronique".

enter image description here

Indiquez votre nom et l’autre adresse électronique de l’autre domaine dans la fenêtre qui s’ouvre.

enter image description here

Une fois que vous appuyez sur "étape suivante", vous obtiendrez une page comme celle-ci. Assurez-vous de saisir correctement l'adresse IP de votre serveur et définissez également le nom d'utilisateur et le mot de passe sur ceux que nous avons créés précédemment. Assurez-vous également de sélectionner l'option "Connexion sécurisée via SSL". Cela impose la nécessité de la connectivité SSL avant l'envoi du courrier. Cela devrait ressembler à ceci, sauf que l'adresse IP de votre serveur est dans l'espace vide:

enter image description here

Enregistrez le paramètre avec "Ajouter un compte". Vous recevrez un courrier électronique vous indiquant que vous devez confirmer que vous souhaitez que GMail envoie un courrier avec cette adresse. il vous enverra un lien à cliquer, avec un code de vérification. Vous pouvez simplement entrer le code de vérification une fois que l'e-mail est arrivé dans la dernière fenêtre qui s'ouvre pendant ce processus.

Une fois que cela est fait, utilisez GMail pour envoyer un courrier électronique quelque part avec l’autre adresse "De" sélectionnée, et il devrait être envoyé via le serveur SMTP que nous venons de configurer! :)

4
Thomas Ward