Segmentierungsfehler

Auch im Jahr 2018, wenn moderne, funktionsreiche Instant Messaging-Anwendungen wie Gitter oder das äußerst beliebte Slack so weit verbreitet sind wie eh und je, bleibt IRC für viele Entwickler die bevorzugte Kommunikationsmethode. Es ist einfach, stabil, allgegenwärtig und vor allem vollständig dezentralisiert. Es ist jedoch ein altes Protokoll, da das IRC seit den frühen neunziger Jahren aktiv ist (das IRC-Protokoll RFC wurde 1993 veröffentlicht). IRC hat seine Grenzen.

Eines der bemerkenswertesten für mich ist der Mangel an Nachrichtenarchivierung. Alle Nachrichten, die von einem IRC-Client gesendet und empfangen werden, werden nicht auf Ihrem Computer gespeichert, und Sie erhalten auch keine Wiederholung der vergangenen Konversationen in einem Kanal, dem Sie gerade beigetreten sind. Jedes Mal, wenn Sie sich in einen IRC-Chatraum einloggen, erhalten Sie eine saubere Weste. Dies ist unpraktisch, da IRC sehr oft als Out-of-Band-Kommunikationskanal verwendet wird. Sie treten einem Kanal bei, hinterlassen eine Frage und warten dann einige Stunden, bis jemand antwortet, da die Leute IRC nicht so häufig überwachen wie bei anderen Instant Messaging-Anwendungen.

Glücklicherweise und vielleicht nicht überraschend ist dies seit geraumer Zeit ein gelöstes Problem. Die schnellste und einfachste Methode besteht darin, von einem Server unter unserer Kontrolle, der 24/7 aktiv ist, eine permanente Verbindung zum IRC-Server herzustellen und jedes Mal, wenn wir im IRC nachsehen möchten, eine SSH / tmux-Sitzung damit aufzubauen. Wenn wir fertig sind, trennen Sie einfach die Sitzung mit C-a d auf dem GNU-Bildschirm oder C-b d auf tmux. Dies löst das Problem, dass alle Nachrichten fehlen, die in einem Kanal gesendet wurden, während wir weg waren. Wenn Sie nach einer Lösung suchen, die viel mehr als das bietet, ist es Zeit, einen Blick auf Türsteher zu werfen.

Was ist ein Bouncer Server?

Ein Bouncer-Server ist ein Server, den wir als Proxy für den Zugriff auf IRC verwenden. Ein Türsteher nimmt unsere IRC-Details und stellt in unserem Namen eine Verbindung zu einem IRC-Server her und tritt sogar einer Liste vordefinierter Kanäle bei.

Wir verbinden uns dann von unserem IRC-Client mit diesem Bouncer-Server anstatt direkt mit dem IRC-Server, und von diesem Punkt an werden unsere Nachrichten vom Bouncer an den Zielserver „weitergeleitet“.

Türsteher bieten mehrere Vorteile, darunter:

  • Persistente Server- und Kanalsitzungen
  • Protokollierung von Kanalkonversationen in einer Textdatei zur Archivierung
  • Bouncer-Benutzerauthentifizierung
  • Automatische IRC-Serverauthentifizierung über NickServ oder SASL
  • Automatisieren Sie den IRC-Benutzerstatus (hinterlassen Sie & Abwesenheitsnachrichten usw.)
  • Und vieles mehr!

Einrichten des Bouncer-Servers auf AWS

Wir werden unseren eigenen Bouncer-Server mit ZNC, der beliebtesten Bouncer-Serveranwendung, auf einer kostengünstigen AWS EC2-Instanz einrichten.

Starten Sie eine neue Ubuntu Server 16.04 t2.nano EC2-Instanz mit allen Standardeinstellungen mit Ausnahme der folgenden:

  • Benutzerdaten: Installieren Sie die Bouncer-Software (ZNC), erstellen Sie einen Benutzer für den Prozess und ein Verzeichnis zum Speichern seiner Dateien sowie eine Systemd-Unit-Datei zum Starten beim Start.
#!/bin/bashapt-get update && apt-get dist-upgrade -y && \apt-get install -y znc znc-dev znc-perl znc-python znc-tcl && \useradd -M -s /bin/false znc && usermod -L znc && \mkdir /opt/znc && \cat > /etc/systemd/system/znc.service <<- EOFDescription=ZNC IRC BouncerExecStart=/usr/bin/znc -d /opt/zncExecReload=/bin/kill -HUP $MAINPIDKillMode=processRestart=alwaysType=forkingUser=zncWantedBy=multi-user.targetAlias=znc.serviceEOF

Da die Systemd-Unit-Datei direkt in /etc/systemd/system abgelegt wurde, wird sie beim Start automatisch ausgeführt. Es besteht keine Notwendigkeit, es zu aktivieren.

  • Subnetz: stellen Sie sicher, dass die Instanz in einem öffentlichen Subnetz mit angeschlossenem Internetgateway gestartet wird, sodass sie über das Internet problemlos zugänglich ist.
  • EBS Volume: Ihr ZNC (Bouncer) Passwort, IRC Server Passwort und IRC Konversationsprotokolle werden in Klartext-Dateien gespeichert, daher empfehle ich Ihnen dringend, das Volume zu verschlüsseln.
  • Erstellen Sie eine neue Sicherheitsgruppe, um sie anzuhängen, damit die folgenden Ports geöffnet sind:
    • SSH: So können wir die Instanz konfigurieren
    • TCP-Port 7078 (jeder nicht reservierte Port reicht tatsächlich aus): ZNC hören port
  • Setzen Sie das Tag „Name“ auf etwas Aussagekräftiges, wenn Sie möchten, dass

Jetzt eine neue elastische IP-Adresse generiert und der Instanz zugeordnet wird.

ZNC installieren

SSH in Ihre neu erstellte EC2-Instanz und führen Sie den ZNC-Ersteinrichtungsprozess aus, der uns auffordert, einen Abhörport für den Bouncer festzulegen und ein Administratorkonto zu erstellen. Wählen Sie die Optionen wie unten.

$ znc --makeconf Checking for list of available modules... -- Global settings -- Listen on port (1025 to 65534): 7078 Listen using SSL (yes/no) : yes Verifying the listener... Unable to locate pem file: , creating it Writing Pem file ... Enabled global modules -- Admin user settings -- Username (alphanumeric): admin Enter password: Confirm password: Nick : Alternate nick : Ident : Real name (optional): Bind host (optional): Enabled user modules Set up a network? (yes/no) : no Writing config ... To connect to this ZNC you need to connect to it as your IRC server using the port that you supplied. You have to supply your login info as the IRC server password like this: user/network:pass. Try something like this in your IRC client... /server <znc_server_ip> +7078 admin:<pass> To manage settings, users and networks, point your web browser to https://<znc_server_ip>:7078/ Launch ZNC now? (yes/no) : no

Dadurch wird eine Konfigurationsdatei generiert, die im Home-Verzeichnis für den Benutzer gespeichert wird, in dem wir ssh haben (ubuntu wenn Sie das von Amazon bereitgestellte Ubuntu-Server-AMI verwenden). Verschieben wir die neu erstellten Konfigurationsdateien aus diesem Verzeichnis nach /opt/znc und geben Sie dem Benutzer znc die Eigentümerrechte.

$ sudo mv ~/.znc/* /opt/znc$ rmdir ~/.znc$ sudo chown -R znc:znc /opt/znc

Jetzt können Sie ZNC starten

$ sudo systemctl start znc

Sicherstellen, dass ZNC erfolgreich gestartet ist

$ systemctl status znc● znc.service - ZNC IRC Bouncer Loaded: loaded (/etc/systemd/system/znc.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2018-07-29 13:02:07 UTC; 21min ago Process: 1181 ExecStart=/usr/bin/znc -d /opt/znc (code=exited, status=0/SUCCESS) Main PID: 1245 (znc) Tasks: 1 Memory: 10.8M CPU: 54ms CGroup: /system.slice/znc.service └─1245 /usr/bin/znc -d /opt/znc

Konfigurieren von ZNC

Die erste Konfigurationsstufe ist abgeschlossen. Jetzt müssen wir den Benutzer hinzufügen, als den wir uns anmelden, und ein IRC-Netzwerk, das diesem Benutzer zugeordnet werden soll.

Um die restlichen Einstellungen auf den Bouncer anzuwenden, stellen wir eine Verbindung zu seinem Web-Konfigurations-Frontend her, das auf dem Port verfügbar ist, für den wir ihn konfiguriert haben (in meinem Fall Port 7078). Geben Sie in Ihrem Browser die folgende URL ein: https://<bouncer_ip_address>:7078. Wenn Sie den Fehler „fehlendes HTTPS-Zertifikat“ oder ähnliches erhalten, können Sie dies ignorieren und Ihren Browser anweisen, fortzufahren. Melden Sie sich nun mit dem von Ihnen eingegebenen Kennwort als zuvor erstellter Admin-Benutzer an.

ZNC Web Frontend

Sobald Sie sich angemeldet haben, können Sie auf den Menüeintrag „Globale Einstellungen“ auf der rechten Seite klicken, um einen Blick auf die Gesamtkonfiguration des Bouncers zu werfen.

ZNC installiert eine Sammlung von Modulen (Shared Objects) in /usr/lib/znc, die Sie laden oder entladen können, während der Daemon läuft. Wenn Sie nach unten scrollen, sehen Sie eine Liste der globalen Module, die sich auf den Betrieb des Bouncers auswirken, die Sie aktivieren / deaktivieren können, indem Sie die Kontrollkästchen in der Spalte „Name“ aktivieren. In meinem Fall habe ich „log“ aktiviert, da mein Bouncer alle Nachrichten, die in den Kanälen gesendet werden, in denen ich Mitglied bin, in einer Textdatei speichern soll.

ZNC Global Modules

Klicken Sie im rechten Menü auf „Benutzer verwalten“, um das Bedienfeld für die Benutzerkonfiguration aufzurufen. Klicken Sie nun auf „Hinzufügen“, um einen neuen Benutzer hinzuzufügen, und geben Sie die Details ein: Benutzername, Passwort (beachten Sie, dass dieses Passwort nur zur Authentifizierung bei ZNC verwendet wird, es wird nicht mit dem IRC-Server verwendet), IRC-Details und eine Liste der Module, die Sie möglicherweise speziell für diesen Benutzer laden möchten.

ZNC-Benutzerdetails

Klicken Sie dann unten auf „Speichern und Fortfahren“, damit wir ein IRC-Netzwerk für diesen Benutzer hinzufügen können.

Hinzufügen eines Netzwerks zu einem Benutzer

Geben Sie die Details für das IRC-Netzwerk ein, dem dieser Benutzer zugeordnet wird, und aktivieren Sie optional alle Module, die Sie automatisch laden möchten, wenn Sie eine Verbindung zu diesem Netzwerk herstellen. Ein solches Modul könnte sasl sein, wenn Sie sich mit dieser Methode beim IRC-Server authentifizieren möchten. Ich werde dieses Modul in diesem Netzwerk aktivieren.

Im Textfeld „Server dieses IRC-Netzes“ gibst du die Informationen des IRC-Servers ein, mit dem du dich verbinden möchtest, und zwar im Format

<server> <port> <irc_password>

Hängen Sie ein Pluszeichen an den Port an, um eine SSL-Verbindung anzuzeigen. <irc_password> ist das Passwort, mit dem Sie sich über den Befehl /NickServ beim IRC-Server registriert haben, das völlig getrennt von dem Passwort ist, das Sie für die Authentifizierung beim Bouncer selbst oben festgelegt haben.

Um sich beispielsweise mit einem zuvor registrierten Konto über SSL mit dem Freenode-IRC-Netzwerk zu verbinden, lautet der Inhalt dieses Textfelds

irc.freenode.net +6697 myNickServPassword123

Ansonsten könnte es einfach sein

irc.freenode.net 6667

 Konfigurieren des IRC-Netzwerks

Sie werden feststellen, dass Ihr IRC-Passwort im Klartext auf dem Server gespeichert ist. Aus diesem Grund habe ich während der VPS-Setup-Schritte empfohlen, Ihr EBS-Volume zu verschlüsseln und natürlich sehr genau zu kontrollieren, wer auf Ihren Bouncer-Server zugreifen kann. Es wird empfohlen, die VPS-Sicherheitsgruppe so zu sperren, dass nur eingehende Verbindungen von einer sehr kleinen Teilmenge von IPs zugelassen werden.

Klicken Sie erneut auf „Speichern und fortfahren“. Sie können jetzt optional eine Liste der Kanäle hinzufügen, bei denen der Bouncer Sie anmelden soll, aber er merkt sich auch diejenigen, denen Sie selbst beitreten, wenn Sie eine Verbindung herstellen.

Wir haben jetzt einen AWS VPS (Virtual Private Server), der eine voll funktionsfähige Installation von ZNC hostet. Das letzte, was Sie tun müssen, ist, unseren IRC-Client auf den Türsteher zu richten.

Verbindung zum Türsteher herstellen

Ich werde irssi verwenden, um eine Verbindung zum Türsteher herzustellen. Hier sind die Schritte, die ich befolgt habe, um es zum Laufen zu bringen. Ihr Kilometerstand kann auf einem anderen Client wie HexChat oder mIRC variieren, aber die Details selbst sollten größtenteils gleich bleiben.

Starten Sie irssi und geben Sie den Spitznamen an, der für die Verbindung zum Bouncer verwendet werden soll

$ irssi -n <username>

Erstellen Sie ein neues Netzwerk mit dem Namen freenodebnc und fügen Sie die Bouncer-Details hinzu. Da ich über SSL eine Verbindung zum Freenode-IRC-Server herstelle, verwende ich den Port 6697, den er für sichere Verbindungen verfügbar macht, und übergebe das Flag -ssl. username/freenode ist die Kombination aus Benutzername und Netzwerk, die wir im ZNC-Benutzerkonfigurationsfenster erstellt haben. password ist das Passwort, mit dem wir uns bei ZNC authentifizieren, nicht beim IRC-Server.

/network add freenodebnc/server add -net freenodebnc -auto -ssl <bouncer_ip> 6697 username/freenode:password

Führen Sie die folgenden Befehle aus, um diese Änderungen in der irssi-Konfigurationsdatei zu speichern und eine Verbindung zum Bouncer herzustellen.

/save/connect freenodebnc

Wenn Sie das SASL-Modul geladen haben (Sie können überprüfen, ob es geladen ist, indem Sie /msg *status ListModules ausführen), müssen Sie es an dieser Stelle konfigurieren. Sobald Sie mit dem Bouncer verbunden sind, führen Sie die folgenden Befehle auf Ihrem IRC-Client aus.

/query *saslmechanism external plainset <NickServName> <password>

Dabei ist NickServName Ihr registrierter Benutzername beim IRC-Server und password das Passwort, mit dem Sie sich beim oben genannten Server authentifizieren.

Verbinden Sie sich nun mit dem neu konfigurierten SASL-Modul wieder mit dem IRC-Netzwerk.

/msg *status jump

Es kann einige Augenblicke dauern, bis der Türsteher die Verbindung hergestellt hat (insbesondere wenn Sie eine Verbindung über SSL herstellen und Authentifizierungsmechanismen wie SASL verwenden), aber danach erhalten Sie eine permanente, sichere Sitzung mit dem IRC-Server, die Sie jederzeit anhalten und fortsetzen können. Viel Spaß beim Chatten!