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-