Building a Serial Console Appliance with ser2net

Heute würde ich euch gerne eins meiner Weekend Projects vorstellen. Ich nenne es:

Ser2net Console Server Appliance“ kurz S2S-CSA 🙂

The Background:
Ich bin ein bequemer Mensch, ein Mensch der gerne arbeiten vor seinem 28″ Widescreen Monitor erledigt. Des öfteren ergibt sich die Situation, dass ich mehre Switches für ein Projekt Stagen müsste. Üblicherweise erfolgt die Erstkonfiguration über den seriellen Port einem nach dem anderen.  Da ich meinen Arbeitskollegen im Grossraumbüro den Lärmpegel von 8 aufgetürmten Switchen nicht an tuhen möchte, habe ich mich nach alternativen umgeschaut. Dabei bin ich auf ein kleines Linuxtool names „ser2net“ gestossen

http://www.nwlab.net/tutorials/ser2net/konsolenserver-linux.html  ser2net bietet genau die Lösung dafür. Ein kleines Tool was es ermöglicht einen seriellen Port auf ein TCP Port zu mappen, um aus der Ferne darauf zugreifen zu können.
Nun hab ich aber keinen Server mit 8 Serielen Ports… hmm

Kein Problem, USB2Serial Adapter von ebay für 2$/pcs kombiniert mit einem 10 Port USB Hub:



Ich arbeite zwar in einem Atomstromkonzern aber Energiesparen ist mit wichtig, daher reut es mich einen vollwertigen Server dafür einzusetzen.  Ein schlanker Raspberry PI müsste doch für die Zwecke genügen:

Nun bin ich kein Fan von fliegenden Kabeln und wackligen Verbindungen, so ein Console Server sollte Hand und Fuss haben und mehr in Form einer Appliance daher kommen. Also hab ich Ausschau nach einem passenden Gehäuse gehalten. Kriterium dabei war, dass USB Hub und Rasbperry PI direkt über ein 5V Netzteil gespiesen werden. Die Erfahrung hat gezeigt, dass wenn man den USB Hub über den USB Port des Rasbperry speisst, die ganze Sache teils instabil läuft.

POC 1:

In unserem refurbished Fundus fand ich einen alten Tele Allysis 12 Switch, welcher ein integriertes Netzteil mit, unteranderem 5V Ausgangsleistung besass. Das gehäuse schien perfekt.

Powersupply:

Topview:

Sogar Lüfter wären schon vorhanden:

Um die USB to Console Ports nach aussen zuführen, benutze ich RJ45 Kupplungen, welche ich mit etwas Bastelei relativ gut befestigen konnte.

Der erste Entwurf war gut aber nicht perfekt, alles noch etwas wackelig und für all die Kabel war ein 1HA Gehäuse zu eng.

Lesson learned, 1HE zu klein, alles zu Wackelig.

POC2 – Lets start from the beginning:

Was ich brauchte war ein Gehäuse, wo die RJ45 Kupplungen schon fest montiert waren. Warum das Rad neu erfinden, wenn es schon etwas pfannenfertiges gibt:

19″ Panel, 2HE mit 24x RJ45 Kupplungen:

Mit 4 Schrauben eine passende 19″ Schublade daran befestigt und um darin Platz zu sparen, die Console Cables gleich gekürzt:

Da mir nun 24 Ports zur Verfügung standen, bot sich die Gelegenheit das ganze etwas Multivendor- haft zu gestalten.
Cisco verwendet sogenannte Rollovercables, dabei sind die Pins quasi 180 Grad verkreuzt. Alcatel Lucent verwendet staightrogh cables, wo die Pins 1:1 durchgeschalten sind. Da ich die Kabel eh kürzen musste, hab ich gleich die obere Reihe 1:1 gecrimped, damit diese für Alcatel Lucent Switche verwendet werden können. Um das ganze zu Speisen habe ich ein altes 5V Netzteil mit 1.9W gebraucht.

Rollover (cisco) Straight Trough (Alcatel)

Bei der Anzahl Console Ports habe ich mich auf 8 Stück beschränkt und dazu jeweils einen seperaten 10 Port USB Hub verbaut:

Ziel der ganzen Sache war von Anfang an, das ganze als eine Box Lösung zu designen, daher war es für mich essentiell, dass auch von aussen Zugriff auf den Raspberry PI habe, ohne das Gehäuse zu öffnen, somit war es notwendig, die entsprechenden Peripherie- Schnittstellen nach aussen zu führen:

The Configuration:
Auf dem Rasbperry PI läuft ein simples Raspbian, einzige Erweiterung ist „ser2net“

root@combox:~#  apt-get install ser2net

 ser2net besitzt ein configfile in /etc/ser2net.conf, darin ändernt man lediglich den gewünschten Telnet Port und Pfad auf die /dev/ttyUSBx Devices.

Die Standard Konfig sieht dabei etwa so aus:

4001:telnet:3600:/dev/ttyUSB1:9600 8DATABITS NONE 1STOPBIT banner
4002:telnet:3600:/dev/ttyUSB2:9600 8DATABITS NONE 1STOPBIT banner
4003:telnet:3600:/dev/ttyUSB3:9600 8DATABITS NONE 1STOPBIT banner
4004:telnet:3600:/dev/ttyUSB4:9600 8DATABITS NONE 1STOPBIT banner 
4005:telnet:3600:/dev/ttyUSB5:9600 8DATABITS NONE 1STOPBIT banner 
4006:telnet:3600:/dev/ttyUSB6:9600 8DATABITS NONE 1STOPBIT banner
4007:telnet:3600:/dev/ttyUSB7:9600 8DATABITS NONE 1STOPBIT banner
4008:telnet:3600:/dev/ttyUSB8:9600 8DATABITS NONE 1STOPBIT banner

Angeschlossene USB Devices ermittelt man am einfachsten mit „lsusb“

root@combox:~# lsusb  -t
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=dwc_otg/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=hub, Driver=hub/3p, 480M
        |__ Port 1: Dev 3, If 0, Class=vend., Driver=smsc95xx, 480M
        |__ Port 2: Dev 4, If 0, Class=hub, Driver=hub/7p, 480M
            |__ Port 1: Dev 6, If 0, Class=vend., Driver=pl2303, 12M
            |__ Port 2: Dev 7, If 0, Class=vend., Driver=pl2303, 12M
            |__ Port 4: Dev 26, If 0, Class=hub, Driver=hub/4p, 480M
                |__ Port 3: Dev 27, If 0, Class=vend., Driver=pl2303, 12M
                |__ Port 4: Dev 28, If 0, Class=vend., Driver=pl2303, 12M
            |__ Port 5: Dev 9, If 0, Class=vend., Driver=pl2303, 12M
            |__ Port 6: Dev 10, If 0, Class=vend., Driver=pl2303, 12M
            |__ Port 7: Dev 11, If 0, Class=vend., Driver=pl2303, 12M
        |__ Port 3: Dev 5, If 0, Class=hub, Driver=hub/7p, 480M
            |__ Port 1: Dev 12, If 0, Class=vend., Driver=pl2303, 12M
            |__ Port 2: Dev 13, If 0, Class=vend., Driver=pl2303, 12M
            |__ Port 4: Dev 14, If 0, Class=hub, Driver=hub/4p, 480M
                |__ Port 2: Dev 23, If 0, Class=vend., Driver=pl2303, 12M
                |__ Port 3: Dev 24, If 0, Class=vend., Driver=pl2303, 12M
                |__ Port 4: Dev 25, If 0, Class=vend., Driver=pl2303, 12M
            |__ Port 5: Dev 15, If 0, Class=vend., Driver=pl2303, 12M
            |__ Port 7: Dev 20, If 0, Class=vend., Driver=pl2303, 12M
root@combox:~# 

Das Problem ist, dass /dev/ttyUSB im Hintergrund ein eigentlicher Symlink ist, der dynamisch auf den jeweiligen Hardware Pfad des USB Ports zeigt.
Konkret heisst das, dass das Mapping von Port 4001 auf ttyUSB1 konstant ist, jedoch ttyUSB1 nach einem Neustart ggF. auf einen anderen USB Port zeigt.

Um dieses Problem zu lösen, habe ich eigenen Symlinks angelegt, die jeweils auf den eindeutigen physical Port des USB Hubs zeigen:

Zum ermitteln der Pfade:

root@combox:~# ls /dev/serial/by-path/platform-bcm2708_usb-usb-0\:1.
platform-bcm2708_usb-usb-0:1.2.1:1.0-port0    platform-bcm2708_usb-usb-0:1.2.4.3:1.0-port0  platform-bcm2708_usb-usb-0:1.2.5:1.0-port0    platform-bcm2708_usb-usb-0:1.2.7:1.0-port0    platform-bcm2708_usb-usb-0:1.3.2:1.0-port0    platform-bcm2708_usb-usb-0:1.3.4.3:1.0-port0  platform-bcm2708_usb-usb-0:1.3.5:1.0-port0    
platform-bcm2708_usb-usb-0:1.2.2:1.0-port0    platform-bcm2708_usb-usb-0:1.2.4.4:1.0-port0  platform-bcm2708_usb-usb-0:1.2.6:1.0-port0    platform-bcm2708_usb-usb-0:1.3.1:1.0-port0    platform-bcm2708_usb-usb-0:1.3.4.2:1.0-port0  platform-bcm2708_usb-usb-0:1.3.4.4:1.0-port0  platform-bcm2708_usb-usb-0:1.3.7:1.0-port0    

durch ein und Ausstecken, der Reihe nach, konnte ich ermitteln welcher Port am USB Hub auf welchen Pfad verweist, danach habe ich Symlinks von 1-8 erstellt:

lrwxrwxrwx  1 root root   62 Oct  1 16:32 d1 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.2:1.0-port0
lrwxrwxrwx  1 root root   62 Oct  1 16:32 d2 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.1:1.0-port0
lrwxrwxrwx  1 root root   62 Oct  1 16:32 d3 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.5:1.0-port0
lrwxrwxrwx  1 root root   62 Oct  1 16:33 d4 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.6:1.0-port0
lrwxrwxrwx  1 root root   62 Oct  1 16:33 d5 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.7:1.0-port0
lrwxrwxrwx  1 root root   64 Oct  1 16:33 d6 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.4.4:1.0-port0
lrwxrwxrwx  1 root root   64 Oct  1 16:33 d7 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.4.3:1.0-port0
lrwxrwxrwx  1 root root   64 Oct  1 16:34 d8 -> /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.2.4.2:1.0-port0

entsprechend war ich nun in der Lage in der ser2net.conf eigens erstellten Symlinks angegeben:

4001:telnet:3600:/etc/ser2net-symlinks/d1:9600 8DATABITS NONE 1STOPBIT banner
4002:telnet:3600:/etc/ser2net-symlinks/d2:9600 8DATABITS NONE 1STOPBIT banner
4003:telnet:3600:/etc/ser2net-symlinks/d3:9600 8DATABITS NONE 1STOPBIT banner
4004:telnet:3600:/etc/ser2net-symlinks/d4:9600 8DATABITS NONE 1STOPBIT banner 
4005:telnet:3600:/etc/ser2net-symlinks/d5:9600 8DATABITS NONE 1STOPBIT banner 
4006:telnet:3600:/etc/ser2net-symlinks/d6:9600 8DATABITS NONE 1STOPBIT banner
4007:telnet:3600:/etc/ser2net-symlinks/d7:9600 8DATABITS NONE 1STOPBIT banner
4008:telnet:3600:/etc/ser2net-symlinks/d8:9600 8DATABITS NONE 1STOPBIT banner

Diese verweisen auf eindeutige Hardware Pfade und bleiben persistent nach einem Neustart.

Connected man nun auf einen der Ports, antwortet ser2net, ist ein Gerät angeschlossen, hat man vollen Consolen Zugriff, hier als Beispiel der Bootprocess eines 2940 Cisco Catalyst:

ser2net port 4001 device /etc/ser2net-symlinks/d1 [9600 N81] (Debian GNU/Linux)

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
File "flash:c2960-lanbase-mz.122-35.SE/c2960-lanbase-mz.122-35.SE.bin" uncompressed and installed, entry point: 0x3000
executing...

              Restricted Rights Legend

 

Samuel Heinrich
Senior Network Engineer at Selution AG (Switzerland)
Arbeitet in Raum Basel (Switzerland) als Senior Network Engineer mit über 15 Jahren Erfahrung im Bereich Netzwerk

1 thought on “Building a Serial Console Appliance with ser2net

  1. Hallo Samuel Heinrich,

    super gelungen. Danke erst mal dafür. Der bester Artikel, den ich bisher gefunden habe. Ich arbeite schon länger an dem Projekt. Kannst Du noch die Modell-Numern (Switche) nenen, die du für deinen Umbau benutzt hast. Für den Nachbau wäre das sicherlich interessant. Auch welche RJ45 Kuplungen du benutzt hast.

    Ich arbeite an dem Projekt speziell an folgenden Themen:
    – Sym-Links über udev rules mit Hilfe der Serial Number (nicht bei allen USB Adaptern vorhanden)
    – Angepasstes banner Login in ser2net
    – ser2net trace /log file für jede Verbindung
    – Für Cisco -RTSCTS -XONXOFF implementieren
    – Härtung das telnet nur über einen loalen login auf dem Server erreicht wird. Ziel: Von Außen muss
    man eine SSH Session aufbauen und wird automatisch über den Login user local auf telnet gemappt.
    – Ich hatte bei mehren parallelen telnet Login Sessions die gleichzeitig als Verbindungsanfrage auf den Raspberry tragen Probleme mit der Stabilität des Raspberrys. Er friert ein.
    Die Versorgung des Raspberrys erfolgte über einen USB Hub, wie auch über ein eigenes Netzteil – Kein Unterschied.

    Nun starte ich erneut, mit einer frischen Installation und parallel mit dem Nachfolge-Modell.

    Vielleicht hast Du / sie ein paar hilfreiche Tipps.

    viele Grüße

    Florian Prillwitz

Schreibe einen Kommentar zu Florian Prillwitz Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.