HowTo: ejabberd – Erlang Distribution Protocol Ports (4369 + dynamischer Port) auf localhost binden

Wer einen ejabberd Jabber-Server betreibt, dem ist bestimmt schon aufgefallen, dass der Prozess epmd auf Port 4369 und der Prozess beam auf einem dynamischen Port horcht:

(Ausgabe von netstat -ptnl, gekürzt)

Aktive Internetverbindungen (Nur Server)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:4369 0.0.0.0:* LISTEN 1435/epmd
tcp 0 0 0.0.0.0:47064 0.0.0.0:* LISTEN 1632/beam
--skip--

Diese beiden Ports sind nach außen geöffnet, dies ist aber für den Betrieb des Jabber-Servers nicht relevant, deswegen ist es durchaus sinnvoll, diese nur auf localhost(127.0.0.1) laufen zu lassen, da dann ein Zugriff von außen ausgeschlossen werden kann.

Um nun den Prozess epmd auf localhost umzubiegen, brauchen wir nur in der /usr/sbin/ejabberctl folgende 2 Zeilen oben einfügen:

ERL_EPMD_ADDRESS=127.0.0.1
export ERL_EPMD_ADDRESS

Nach einem Neustart des Servers würde die Ausgabe von netstat wie folgt aussehen:

(Ausgabe von netstat -ptnl, gekürzt)

Aktive Internetverbindungen (Nur Server)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:4369 0.0.0.0:* LISTEN 1435/epmd
tcp 0 0 0.0.0.0:47064 0.0.0.0:* LISTEN 1632/beam
--skip--

epmd horcht nun also auf localhost, sehr gut.
ACHTUNG: Der Befehl ejabberdctl funktioniert nun nicht mehr, da dieser Befehl versucht, auf den Hostnamen zuzugreifen, epmd aber nun am localhost horcht. Abhilfe kann ein Eintrag in /etc/hosts sein, allerdings ist das nicht die schönste Lösung.

Um nun noch den dynamischen Port auf localhost horchen zu lassen, müssen wir dem Jabber-Server sagen, dass alle Listener standardmäßig auf localhost laufen sollen.

Da der Jabber-Server selbst allerdings noch von außen erreichbar sein soll, müssen wir in der /etc/ejabberd/ejabberd.cfg bei den Listenern die IP ergänzen:

D.h. unter der Zeile:

{5222, ejabberd_c2s, [

folgendes einfügen:

{ip, {0, 0, 0, 0}},

Falls Server-zu-Server Verbindungen gewünscht sind (Kommunikation mit anderen Jabber Servern) unter der Zeile:

{5269, ejabberd_s2s_in, [

ebenfalls folgendes einfügen:

{ip, {0, 0, 0, 0}},

Sollte das Admin-Webinterface von außen erreichbar sein, auch unter:

{5280, ejabberd_http, [

die IP einfügen:

{ip, {0, 0, 0, 0}},

Nun da sichergestellt ist, dass unsere Jabber-Server-Services auf 0.0.0.0 hören, können wir definieren, dass alles andere auf localhost horchen soll:

Hierzu wird in /usr/sbin/ejabberd eine IF-Abfrage wie folgt geändert:

if [ "$FIREWALL_WINDOW" = "" ] ; then
KERNEL_OPTS="-kernel \
inet_dist_use_interface {127,0,0,1}"
else
KERNEL_OPTS="-kernel \
inet_dist_use_interface {127,0,0,1} \
inet_dist_listen_min ${FIREWALL_WINDOW%-*} \
inet_dist_listen_max ${FIREWALL_WINDOW#*-}"
fi

Im Prinzip wird damit in jedem Fall die Variable inet_dist_use_interface auf die loopback-Adresse 127.0.0.1 eingestellt.

Danach sollte die Ausgabe von netstat wie folgt aussehen:

(Ausgabe von netstat -ptnl, gekürzt)

Aktive Internetverbindungen (Nur Server)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:4369 0.0.0.0:* LISTEN 1435/epmd
tcp 0 0 127.0.0.1:47064 0.0.0.0:* LISTEN 1632/beam
--skip--

Die beiden Ports horchen nun auf localhost.
Bitte bei Fragen oder Fehlern einfach die Kommentar-Funktion benutzen!

Einfach anders!