Résumé : epmd, l'un des bidules erlang dont dépend le serveur XMPP ejabberd, écoute le monde entier sur le port tcp/4369 en utilisant le mécanisme d'activation par socket de systemd (à la inetd / xinetd). Pour le faire écouter uniquement en local, il faut modifier la configuration de la socket systemd epmd.socket, changer la configuration de ejabberdctl a aucun effet. ejabberd écoute également sur un port aléatoire…
Sur un de mes serveurs, je regarde tous les ports ouverts / en écoute avec ss -ltupn
(je rappelle que netstat est déprécié depuis de nombreuses années, ss
utilise les """"nouvelles"""" fonctions du noyau et est capable d'afficher plus d'informations ‒ tous les processus qui utilisent une socket, les options de la socket genre ipv6only, les timers dans un format lisible, l'algo de contrôle de la congestion, la pmtu, la mss, etc. ‒) et je vois ceci :
tcp LISTEN 0 128 0.0.0.0:4369 0.0.0.0:* users:(("systemd",pid=1,fd=47)) ino:11367904 sk:166 <->
Pourquoi systemd écoute-t-il sur le port tcp/4369 ? Une recherche sur le web montre qu'il s'agit en fait d'epmd, un démon Erlang qui utilise le mécanisme d'activation par socket de systemd (à la inetd / xinetd). Pourquoi epmd n'apparaît pas dans la liste des utilisateurs de la socket (ss
fait ça d'habitude, contrairement à netstat ;) ) ? Car, à ce moment-là, j'avais arrêté (systemctl stop) ejabberd, donc epmd n'était plus en activité.
Le seul bidule Erlang que j'utilise est ejabberd. Lisons la doc' : « epmd (Erlang Port Mapper Daemon) is a small name server included in Erlang/OTP and used by Erlang programs when establishing distributed Erlang communications. ejabberd needs epmd to use ejabberdctl and also when clustering ejabberd nodes. This small program is automatically started by Erlang, and is never stopped. »
J'ai un seul serveur derrière mon service Jabber et j'ose espérer qu'on peut piloter son serveur avec un ejabberdctl exécuté localement. Pas besoin d'être ouvert à tous les vents.
Lisons encore la doc' : « You should block the port 4369 in the firewall in such a way that only the programs in your machine can access it, or configure the option ERL_EPMD_ADDRESS in the file ejabberdctl.cfg. ». Non, ça ne fonctionne pas.
Lisons encore : « It is also possible to configure in ejabberdctl.cfg the network interface where the Erlang node will listen and accept connections. The Erlang command-line parameter used internally is, for example: erl ... -kernel inet_dist_use_interface "{127,0,0,1}" ». Non, changer la valeur de la variable « INET_DIST_INTERFACE » ne fonctionne pas non plus.
Au final, j'ai suivi ce tuto (mais pour obtenir le résultat inverse) et j'ai fait la modification côté systemd :
systemctl edit epmd.socket
;Contenu :
[Socket]
ListenStream=127.0.0.1:4369
systemctl daemon-reload
;systemctl restart epmd.socket ejabberd
;J'étais persuadé que ce changement est intervenu avec Buster, mais, non, j'observe ce comportement dans une machine virtuelle Jessie… Ça doit dater du passage à systemd. Vache, toutes ces années sans rien voir. :O