Jabber-Server

Aus Knowledgebase
Version vom 21. Juni 2011, 16:26 Uhr von PoC (Diskussion | Beiträge) (Überarbeitet)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

In Ermangelung vernünftiger Dokumentation zum in Python geschriebenen Jabber-Server, sind hier mal ein paar grundlegende Tricks und Kniffe zur Inbetriebnahme und Betrieb selbst zusammengefasst.

Funktionsweise

Jabber ist ein Instant-Messaging-System auf Basis von XMPP (eXtensible Messagging and Presence Protocol). Die Daten on the wire verwenden ein XML-basiertes Übertragungsformat. Jabber-Clients verbinden sich zum Server über Port 5222 (c2s) oder 5223 (veraltet, SSL-only). Moderne Clients beherrschen STARTTLS über Port 5222. Clients beantragen auf einem Server einen Account und erhalten diesen automatisiert. Fortan besteht diese Jabber-Adresse in der Form nickname@hostname/zusatz.

  • Nickname ist der gewünschte Nickname,
  • Hostname ist entweder eine Domain oder ein Hostname, ggfs. mit passenden SRV-Records im DNS zur Dienstefindung,
  • Zusatz ist ein benutzerdefinierbarer String, der eine Mehrfachanmeldung mit dem gleichen Nicknamen ermöglicht.

Welche Messages welcher der gerade aktiven Clients erhält, wird über clientseitig konfigurierbare Prioritäten festgelegt.

XMPP ermöglicht grundlegend eine serverübergreifende Kommunikation, nicht unähnlich zu SMTP (s2s), über Port 5269. Über passende DNS-SRV-Records ist es möglich, die Jabber- und Mailadresse gleich zu halten.

Kommunikation zwischen Chatpartnern ist nur mit vorheriger Authorisierung möglich. Benutzer first@jabber1.de hat von seinem Freund dessen Jabberadresse second@jabber2.de erhalten. Nun sendet first@jabber1.de über seinen Client eine Authorisierungsanfrage an second@jabber2.de, indem er diese Adresse in sein Roster, eine servergespeicherte Kontakteliste aufnimmt. second@jabber2.de kann diese Anforderung nun bestätigen oder ablehnen. Wenn der Vorgang auch umgekehrt durchgeführt wurde, ist Kommunikation möglich

Über diese servergespeicherte Liste (Roster) ist es möglich, Kontakte zu Organisieren oder auch zu blockieren, was einen gewissen Spamschutz darstellt.

Eine Erweiterung des Protokolls stellt die Conferencing-Funktion dar, konzeptionell ähnlich zu den Channels im IRC.

Installation

Die Installation unter Debian-Lenny gestaltet sich recht einfach:

apt-get install jabber

Die Konfigurationsdateien liegen in /etc/jabber/. In jabber.cfg werden nur ein paar grundlegende Variablen deklariert, deren Konsistenz mit der eigentlichen Konfiguration in jabber.xml wichtig ist.

Konfiguration

In jabber.xml wird der Server konfiguriert. Die Datei ist sehr extensiv dokumentiert, daher werden hier nur stichpunktweise die interessanten Dinge erwähnt.

Für die oben erwähnte Angleichung von Mail- und Jabberadresse müssen in der eigenen DNS-Zone SRV-Records hinterlegt werden, ähnlich wie die MX-Records für SMTP:

_jabber._tcp                      IN      SRV     0       0       5269    jabberserver.domain.
_xmpp-client._tcp                 IN      SRV     0       0       5222    jabberserver.domain.
_xmpp-server._tcp                 IN      SRV     0       0       5269    jabberserver.domain.

Der BIND aktzeptiert die Unterstriche, sofern sie in SRV-Records vorkommen.

Erweiterungen

Erweiterungen werden an zwei Stellen registriert:

  • Innerhalb der <browse>-Sektion, das ermöglicht Clients, diese Dienste zu sehen und dem Benutzer passend zu präsentieren,
  • In der Hauptsektion als <service>.

Services laufen meist als externe Programme. Der Jabberd stellt dazu einen TCP-Port auf localhost bereit, der mit einem Passwort abgesichert ist. Der externe Dienst wiederum verbindet sich anhand der in seiner Konfiguration hinterlegten Angaben auf diesen Port und ermöglicht so eine Kommunikation.

Jabber Conferencing

apt-get install jabber-muc
  • /etc/default/jabber-muc: ENABLED='0'ENABLED='1'
  • /etc/jabber/jabber.xml (Servicebrowsing und Listener):
<browse>
  <item category="conference" type="public" jid="conference.jabberhostname" name="Public Conferencing" version="0.5.2">
    <ns>jabber:iq:register</ns>
    <ns>gc-1.0</ns>
    <ns>http://jabber.org/protocol/muc</ns>
  </item>
</browse>

<service id="muclinker">
  <host>conference.jabberhostname</host>
  <accept>
    <ip>127.0.0.1</ip>
    <port>31318</port>
    <secret>ganzgeheim</secret>
  </accept>
</service>
  • /etc/jabber/jabber-muc.xml:
<jabber>
  <service id="muclinker">
    <uplink/>
    <connect>
      <ip>127.0.0.1</ip>
      <port>31318</port>
      <secret>ganzgeheim</secret>
    </connect>
  </service>

  <service id="conference.jabberhostname">
    <load>
      <conference>/usr/lib/jabber/mu-conference/mu-conference.so</conference>
    </load>
      <conference xmlns="jabber:config:conference">
      <public/>
      <vCard>
        <FN>Public Chatrooms</FN>
        <DESC>This service is for public chatrooms.</DESC>
      </vCard>
      <history>20</history>
      <logdir>./logs/muc/</logdir>
      <sadmin>
        <user>poc@leela.pocnet.net</user>
      </sadmin>
      <notice>
        <join>has become available</join>
        <leave>has left</leave>
        <rename>is now known as</rename>
      </notice>
    </conference>
  </service>
  <pidfile>/var/run/jabber/jabber-muc.pid</pidfile>
</jabber>

Nach einem Neustart des Jabber-Servers steht der Dienst zu Verfügung.

Falls dieser Dienst offiziell zugänglich sein soll, muss im DNS ein entsprechender Eintrag vorhanden sein:

conference._jabber._tcp            IN      SRV     0       0       5269    jabberserver.domain.
conference._xmpp-client._tcp       IN      SRV     0       0       5222    jabberserver.domain.
conference._xmpp-server._tcp       IN      SRV     0       0       5222    jabberserver.domain.
Verwendung

Mit der Gehe zu Chat-Funktion des jeweiligen Messengers kann ein Raum neu eingerichtet oder auch betreten werden (sofern die bei der initialen Einrichtung gesetzten Zugriffsrechte das zulassen).

Jabber ↔ IRC-Bridge

  • Software jjigw (braucht Python),
  • Auspacken in /usr/local/.
  • /etc/jabber/jabber.xml (Servicebrowsing und Listener):
<service type="irc" jid="irc.jabberhostname" name="IRC Gateway">
  <ns>jabber:iq:gateway</ns>
</service>

 <service id="irc.jabberhostname">
   <host>irc.jabberhostname</host>
   <accept>
     <ip>127.0.0.1</ip>
     <port>9426</port>
     <secret>verygeheim</secret>
     <timeout>30</timeout>
   </accept>
 </service>
Dies öffnet einen TCP-Listener für den externen jjigw-Prozess.
  • cp /usr/local/jjigw/jjigw.xml.example /etc/jabber/jjigw.xml
  • /etc/jabber/jjigw.xml:
<connect>
  <host>127.0.0.1</host>
  <port>9426</port>
  <secret>verygeheim</secret>
</connect>

<network jid="irc.jabberhostname" encoding="iso-8859-15" nicks_8bit="yes">
  <server>localhost</server>
</network>
Dies instruiert jjigw, sich auf den IRC-Server auf localhost, Port 6667 zu verbinden (Portangabe ist hartkodiert) und als Zeichenübersetzungstabelle so-8859-15 zu verwenden. Ebenso sind 8-Bit-Nicknamen erlaubt.
Die jid muss mit Hostnamen und jid in jabber.xml konsistent sein.
  • Startscript in /etc/jabber/jabber.d/jjigw anlegen, Vorlage z. B. von jabber-muc abwandeln (unbedingt chdir aufnehmen!), notwendige Änderungen:
DAEMON=/usr/local/jjigw/jjigw.py
NAME=jjigw
DESC=jjigw
CMDLINE=
ENABLED='1'

start-stop-daemon -b -c jabber:adm --start --quiet --pidfile $PID \
       --chdir `dirname $DAEMON` --exec $DAEMON -- $CMDLINE
  • Konfigurationsdatei verlinken (muss im selben Verzeichnis wie jjigw liegen):
ln -s /etc/jabber/jjigw.xml /usr/local/jjigw/

Falls der Service von aussen nutzbar sein soll, gilt das gleiche wie weiter oben für das Conferencing-Modul gesagte.

Verwendung

Grundlegend taucht alle Kommunikation über IRC als Subhost irc.jabberhostname über dem eigentlichen Jabberhost auf, wie aus der Konfiguration weiter oben ersichtlich.

Ein Jabber-Benutzer wird nur dann ins IRC-Netz herüber exportiert, sofern er mindestens einen IRC-Channel betreten hat; dann taucht er als normaler IRC-Benutzer auf. Er muss aber IRC-serverweit den gleichen Nicknamen verwenden.[1]

  • Aus Messenger-Sicht:
    • Ansprechen von IRC-Usern über user@irc.jabberhostname nach Aufnahme ins Roster,
      • Authorisierung zum Chatten wird nicht benötigt.[2]
    • Chatten in Channels über die Conferencing-Funktion des Messengers (Beispiel: Betreten des IRC-Channels #test mit dem Nicknamen jbtest):
      • Raumname: #test
      • Server: irc.jabberhostname
      • Handle: jbtest
  • Aus IRC-Sicht:
    • /msg an den verwendeten Nicknamen werden auf Chats auf Jabberseite umgesetzt,
      • Chatten ist ohne Authorisierung möglich (aka, der IRC-Benutzer muss nicht erst zum Roster hinzugefügt werden).
    • Jabber-User tauchen als normale IRC-Benutzer in Channels auf und können an den Chats teilnehmen.

Weblinks

  1. Das ist eine Limitierung des IRC-Protokolles.
  2. Auch das ist eine Limitierung des IRC-Protokolles.