Ein eigener XMPP / Jabber Server

Ziel war es, einen geschlossenen XMPP Server für die Familie und vielleicht zukünftig für eine Handvoll anderer netter Menschen zu betreiben.

Mit ein paar Erweiterungen basiert meine Installation im wesentlichen auf diesem Beitrag

Die Beschreibung ist auch keine exakte Dokumentation da ich einige Lernkurven gefahren bin die ich aber in dieser Beschreibung abkürzen möchte

Vorarbeiten:

DNS

Im DNS sollten zum einen der Server selbst (im.domaine.de) als auch zwei SRV Einträge für die gewünschte Domaine domaine.de vorhanden sein.

 _xmpp-client._tcp.domaine.de. 86400 IN SRV 5 0 5222 im.domaine.de.
 _xmpp-server._tcp.domaine.de. 86400 IN SRV 5 0 5269 im.domaine.de.

Dann kann man später im XMMP Client als ID schön dein.name@domaine.de angeben und muss nicht noch den Servernamen “im” davor angeben. Sieht einfach schöner aus.

TLS / SSL

Für die Domain sollte Zertifikate vorhanden sein die man über Letsencrypt schön und kostenlos bekommt und automatisiert aktualisieren kann

Ich gehe hier davon aus das auf dem Server bereits ein Webserver für “domaine.de” läuft.

 ./letsencrypt-auto certonly --webroot -w /var/www/public_html/ -d domaine.de -d im.domaine.de -d www.domaine.de

Eigentlich verwende ich ja lieber Pakete aus dem Debian Repository aber in diesem Fall ist mir die Version von ejabberd zu alt und so häufig müssen wohl keine Updates installiert werden.

Die Eigentliche Installation geht ganz schnell

 mkdir install
 cd install/
 wget https://www.process-one.net/downloads/downloads-action.     php?file=/ejabberd/17.12/ejabberd_17.12-0_amd64.deb
 sha256sum downloads-action.php\?file\=%2Fejabberd%2F17.12%2Fejabberd_17.12-0_     amd64.deb 
 dpkg -i downloads-action.php\?file\=%2Fejabberd%2F17.12%2Fejabberd_17.12-0_amd64.deb 

Eigentlich soll man nach gängigen Beschreibungen an dieser Stelle jetzt einen Admin Account hinzufügen und auf die Weboberfläche gehen. Was mir nicht gefällt. Das soll man mit http machen. (http und Admin : finde den Fehler) und ich habe dort auch nichts gefunden was ich für mich und meine 3 User brauche und nicht über die Kommandozeile mit ejabberdctl geht. Sollte sich das ändern installiere das nach.

Zuerst stellen wir die Zertifikate schön zusammen und dann geben wir die gewünschten Hosts im Konfigurtionsfile an

 cd  /opt/ejabberd/conf/
 cat /etc/letsencrypt/live/www.domaine.de/privkey.pem /etc/letsencrypt/live/www.domaine.de/fullchain.pem > ejabberd.pem
 chown ejabberd: ejabberd.pem 
 sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
 vi /opt/ejabberd/conf/ejabberd.yml 
   hosts:
     - "im.domaine.de"
     - "domaine.de"
   certfiles:
     - "/opt/ejabberd/conf/ejabberd.pem"

Dann kann man neue Benutzer zulassen

 /etc/init.d/ejabberd start
 cd /opt/ejabberd-17.12/bin/
 ./ejabberdctl register firstuser domaine.de geheimeskennwort

Zusätzliche Absicherungsmaßnahmen

Weboberfläche auf Port 5280:

Ich konnte nicht genau herausfinden was genau darauf läuft. Aktueller Kenntnisstand ist das dieser Port für den Administrator und für Web Anwendungen notwendig ist. Da ich beides nicht brauche habe ich den Service erst mal auf localhost eingestellt. Sollte ich feststellen das ich ihn doch brauche sehen wir weiter

 vi /opt/ejabberd/conf/ejabberd.yml 
 -
   port: 5280
   ip: "127.0.0.1"
   module: ejabberd_http

Kommunikation zwischen Servern

In Anlehnung an diesen Beitrag habe ich folgende Änderungen getätigt.

  s2s_use_starttls: required

Ich habe auch im wesentlichen die Empfehlungen von hier übernommen.

Abschalten von epmd

Es scheint “wohl besser zu sein” dem epmd die Kommunikation mit “Aussen” zu verbieten

 tcp        0      0 0.0.0.0:epmd            0.0.0.0:*               
 LISTEN      9769/epmd   

Es soll eine Möglichkeit geben diesem Dienst mitzuteilen das er das nicht so machen soll aber ich habe es nicht hin bekommen. Deswegen wurde der Port von außen über iptables abgeklemmt.

iptables -A INPUT --source localhost -p tcp --dport 4369 -j ACCEPT
iptables -A INPUT -p tcp --dport 4369 -j DROP

Autostart

  systemctl enable ejabberd.service

Zusammenfassung

Die ersten Tag mit “einem Testuser” zeigt sich das ganze stabil. Jetzt wird das ganze mit einem Familienchat auf alle ausgeweitet-