Mon CV

Mettre à jour automatiquement les paramètres Mail Proxy (Networks) de Proxmox Mail Gateway pour une IP dynamique (DynDNS par exemple)

11 février 2024

Comprendre le contexte et le problème

Proxmox Mail Gateway (PMG pour les intimes) est une solution de passerelle d’email Open Source créée par Proxmox. Cette solution a vocation à se positionner en frontal devant vos serveurs MX (serveur de réception de vos emails) pour ajouter une couche de sécurité et de traitement. Proxmox Mail Gateway peut par exemple ajouter des filtres anti-spam, du greylisting, des règles particulières en fonction des destinataires, etc. La solution est robuste, et elle est conçue pour fonctionner en haute-disponibilité avec un mode clustering assez simple à mettre en œuvre.

Proxmox Mail Gateway peut également être utilisé dans le sens inverse, c’est-à-dire comme passerelle d’envoi de vos emails (donc serveur SMTP), avec là aussi l’avantage de pouvoir gérer sur cette plateforme un grand nombre de paramètres de sécurité (pour éviter que votre plateforme ne se transforme en serveur de SPAM) ou visant à augmenter la réputation de votre serveur d’envoi (OpenDKIM, DMARC, SPF, etc.).

C’est dans ce deuxième contexte que je vous propose de vous placer : lorsque que PMG est utilisé comme passerelle d’envoi d’emails, en SMTP. En effet, dans cette situation, il est nécessaire de déclarer les réseaux (IP ou plages d’adresses IP) qui seront autorisées à relayer ou envoyer des emails en SMTP en utilisant Proxmox Mail Gateway. Tout cela se paramètre dans la partie Configuration > Mail Proxy > Networks de PMG :

Le problème est que j’ai besoin de pouvoir autoriser l’envoi depuis un réseau qui est servi par une connexion internet câble (oui je sais, ça existe encore !), et dont le FAI ne propose pas d’IP fixe. En l’occurrence, il s’agit d’une connexion de chez SFR. Et donc, à chaque fois que le modem de cette connexion redémarre, l’IP de la connexion change et il faut manuellement l’entrer dans la configuration de Proxmox Mail Gateway.

J’ai bien cherché sur internet des solutions, mais ce qui est proposé consiste uniquement à modifier la configuration de Postfix (MTA sous-jacent utilisé par PMG).

 

La solution proposée

Pour appréhender ce souci, j’ai choisi de créer un script Bash tout simple qui va automatiquement ajouter, en utilisant l’API shell de PMG. Pour cela, je m’appuie sur un fournisseur de DNS dynamique (type DynDNS ou mieux, en Open Source, nsupdate.info et dont vous trouverez les sources ici si vous préférez l’héberger).

L’idée générale est la suivante :

  1. le modem ou la box sont configurés avec DynDNS ou nsupdate.info pour automatiquement mettre à jour l’IP de la connexion sur une entrée DNS,
  2. mon script va interroger périodiquement, via une entrée cron, le DNS, pour connaître l’IP correspondante, et si elle n’est pas connue dans la configuration de PMG, l’ajouter avec la commande pmgsh.

C’est au final assez simple.

Voici le script proposé :

#! /bin/bash

monAdresse="monadresse.dyndns.org"
serverDynDns="ns.dyndns.org"

function error () {
echo -e "\n*** Erreur ${1} ***"
echo -e ${2}
alldone ${1}
}

function alldone () {
# Journalisation si nécessaire et redirection de la sortie standard
[ ${1} -eq 0 ] && echo ">>> Processus terminé OK !"
exit ${1}
}

function valid_ip () {
  [[ ${1} =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] \
    || return 1
  for i in ${1//./ }; do
    [[ ${i} -le 255 ]] \
      || return 1
  done
}

if [ `whoami` != 'root' ]; then
error 2 "Ce script doit être utilisé par le compte root. Utilisez SUDO."
fi

echo ">>> Lancement du processus !"

# Testons si une connection internet est ouverte
dig ${monAdresse} +noall +answer +short @${serverDynDns} > /dev/null 2>&1
[ $? -ne 0 ] && error 1 "Non connecté à internet, serveur DNS injoignable ou réponse DNS incorrecte."

# Testons si une réponse est apportée à la requête DNS
IP=$(dig ${monAdresse} +noall +answer +short @${serverDynDns})
TEST=`echo "${IP}." | grep -E "([0-9]{1,3}\.){4}"`

valid_ip "${IP}" \
    && echo "${IP} est une adresse IPV4 valide." \
    || error 3 "${IP} n'est pas une adresse IP valide."

# On vérifie que l'iP ne soit pas déjà dans le fichier 
pmgsh ls /config/mynetworks | grep  "${IP}" > /dev/null 2>&1
[ $? -eq 0 ] && echo "L'adresse ip ${IP} est déjà présente dans le fichier networks de Proxmox Mail Gateway." && alldone 0

# L'IP n'est pas présente, on l'ajoute
result=$(pmgsh create /config/mynetworks --cidr "${IP}/32" --comment "IP DYNAMIQUE - CONNEXION FIBRE SFR - $(date)")

[ $? -eq 0 ] && echo "L'adresse ip ${IP} a été correctement ajoutée au fichier networks de Proxmox Mail Gateway." && alldone 0

error 4 "Problème lors de l'ajoute de l'ajout de lip ${IP} au fichier networks de Proxmox Mail Gateway."

 

Vous n’avez qu’à personnaliser les deux variables en début de script en fonction de votre entrée DynDNS ou No-Ip ou nsupdate.info, ainsi que le serveur DNS que vous souhaitez utiliser (le mieux étant d’interroger directement le serveur DNS qui a autorité sur la zone, pour éviter des réponses qui seraient stockées en cache).

Vous pouvez tester manuellement en lançant le script dans votre terminal, et si vous êtes satisfait, il ne vous reste plus qu’à ajouter une entrée dans la crontab, du type :

# Script auto ajout sur le relais de PMG des IP dynamique de la connexion bureau
*/5 * * * * /root/dyndnsip2pmg.sh >/dev/null 2>&1


Et pour les plus curieux, qui souhaitent découvrir Proxmox Mail Gateway, je vous invite à jeter un œil ici :

 

Posted in Unix et LinuxTags: