Posts Tagged ‘Avocent’

Mittwoch, 15. Juni 2016

Ein Avocent DSR1031 meldet „Network Connect Error“

Heute fand per Post ein gebrauchter Avocent DSR1031 IPKVM-Switch den Weg zu mir nach Hause. Ich werde den IP-fähigen KVM-Switch im Elternhaus installieren, um im Notfall einen Linux-Server fernsteuern zu können.

Erste Ernüchterung bereits umgehend bei der Verbindung auf die IP-Adresse des Switches: Leider ist das von Acovent auf dem KVM-Switch verbaute Zertifikat im letzten Jahr abgelaufen:

Avocent DSR1031 Certificate Expired

Als erstes aktualisierte ich das Firmware des Geräts auf Version 03.07.01.20, welche ich von der Web-Site des Herstellers heruntergeladen hatte (ich musste den FTP-Link manuell in CyberDuck einfügen; der Download mittels Web-Link klappte partout nicht).

Leider löste dies die Problematik des abgelaufenen Zertifikats nicht — so viel zu Hersteller-Support im SSL/TLS-Umfeld.

Anschliessend musste ich auf Firefox ausweichen, um ein Verbindungsfile hinter einem Link namens „KVM Session“ unter einem vom Vorbesitzer erfassten Device herunterzuladen — Safari zeigte einen Download an, die Datei fand sich aber nicht im Download-Ordner.

Der Klartext der heruntergeladenen Datei zeigte, dass es sich um ein sogenanntes Java Network Launch Protocol JNLP-File handelt:

<?xml version="1.0" encoding="utf-8"?>

<!-- JNLP File for Java Video Viewer Application -->

<jnlp spec="1.0+" codebase="http://10.0.1.227/webstart2">
   <information>
      <title>Video Session Viewer</title>
      <vendor>Avocent</vendor>
      <description>Video Session Viewer</description>
      <description kind="short">Video Viewer</description>
   </information>

   <security>
      <all-permissions/>
   </security>

   <resources>
      <j2se version="1.5+"/>
      
      <jar href="avctVideo.jar"/>
      <jar href="avctVM.jar"/>
      <nativelib href="avctWin32Lib.jar"/>
      <nativelib href="avmWin32Lib.jar"/>
      <nativelib href="avctLinuxLib.jar"/>
      <nativelib href="avmLinuxLib.jar"/>
      <nativelib href="avctSolarisLib.jar"/>
      <nativelib href="avmSolarisLib.jar"/>
      <nativelib href="avctMacOSXLib.jar"/>
      <nativelib href="avmMacOSXLib.jar"/>
      <nativelib href="jpcscdll.jar"/>
      <nativelib href="jpcscso.jar"/>
   </resources>
...

Diese Datei startet man folgendermassen:

$ javaws -verbose kvm.cgi

Leider erhielt ich mit J2SE Version 8 Update 91 folgende Fehlermeldung zu Gesicht:

Avocent Network Connect Error

Nach einigen Recherchen im Internet fand ich im Support-Forum des Herstellers im Beitrag „AutoView 3016 Java network connect error“ die Lösung.

In der Datei /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home/lib/security/java.security müssen zwei Parameter für den Umgang mit verschlüsselten Verbindungen angepasst werden:

...
#jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024
jdk.certpath.disabledAlgorithms=
...
#jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768
jdk.tls.disabledAlgorithms=
...

Danach klappte die Verbindungsaufnahme:

Avocent Video Viewer Channel not found

Leider habe ich so meine Java-Installation extrem unsicher gemacht. Die Browser-Plugins habe ich seit längerem allesamt deaktiviert, was das Risiko etwas senkt.

Nachtrag

Mittlerweile habe ich — selbstverständlich mittels Internet-Resourcen — herausgefunden, wie man die Java-Einstellungen ausschliesslich nur für einen bestimmten Prozess abändert. Hierzu habe ich mir ein Script geschrieben, mit welchem ich den Avocent Viewer starten kann:

#!/bin/bash
...
SCRIPTDIR="/path/to/script/dir"
...
JAVAWS=$(which javaws)
JNLP="$SCRIPTDIR/kvm.jnlp"
JAVASECURITY="$SCRIPTDIR/java.security"

# http://stackoverflow.com/questions/1047154/java-webstart-options
CMD="$JAVAWS -J\"-Djava.security.properties=$JAVASECURITY\" $JNLP &"
echo $CMD
eval $CMD
echo ""

exit 0

Im Verzeichnis, in welchem das Bash-Script liegt, habe ich eine Kopie der oben genannten Datei java.security abgelegt und die Anpassungen an der lokalen Kopie vorgenommen (die globale Datei java.security führt nur die sicheren Ciphers auf). Den Pfad zur lokalen Datei übergebe ich Java Web Start mittels einer Kommandozeile -J, in welcher eine Java-Argument verschachtelt ist -D.

Tags: , , , , , , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen

Samstag, 7. September 2013

Unter Mac OS X auf den Avocent SwitchView IP 1010 zugreifen

Seit mein privater Linux Entwicklungsserver im Juli auf Grund eines Ausfalls des Kabelmodems und einem Wackelkontakt des Switch-Netzteils länger als erwartet offline war, habe ich drei verschiedene Massnahmen ergriffen, damit solche Probleme nicht mehr auftreten können:

  • Der Server ist nun mit zwei Netzwerkkabeln mit dem Intranet verbunden; eines über den besagten Gigabit-Switch, eines direkt am Internet-Router
  • Der Server soll dereinst zudem noch mit einem ZYXEL NWD2205 Ultra Compact Wireless N USB Adapter NWD2205 WLAN Client (Affiliate-Link) als dritter Netzwerk-Fallback funktionieren; bisher hatte ich aber noch nicht Zeit, den USB-Stick zu konfigurieren (stecken tut er vorerst einmal an einem freien USB-Port)
  • Der Server hängt nun an einem iKVM-Switch, d.h. ein netzwerkbasiertes Gerät, welches das analoge Bild des VGA-Ausganges nimmt, es digitalisiert und per VNC an eine Client-Software weitergibt.

Letzte Massnahme dient uns dann, wenn der Server bspw. nach einem apt-get dist-upgrade nicht mehr hochkommt und keine Möglichkeit besteht, per SSH auf den Server zuzugreifen. Mit dem iKVM-Switch kann ich den Bootprozess aus der Ferne überwachen.

Ich habe mich über Ricardo.ch für 150 CHF mit einem (notabene völlig veralteten) Avocent SwitchView IP 1010 eingedeckt (Nachfolgemodell: Avocent SVIP1020 – 202 SwitchView IP, Affiliate-Link).

Gestern nun nahm ich mir die Zeit, um das Teil in das Intranet zu integrieren. Der Aufwand war leider grösser als erwartet, doch nun klappt der Zugriff von meinem Mac mini hier in Bern auf den iKVM-Switch in Neuenegg:

SVIP Viewer Mac OS X Wine

Nachfolgend sei das Vorgehen beschrieben:

Inbetriebnahme Hardware

Leider erhielt ich den iKVM–Switch per Ricardo.ch ohne das dem Gerät normalerweise beliegenden KVM-Kabel, welches PS/2-Schnittstellen und VGA-Anschluss vereint und vom Server zum Switch führt. Dumm gelaufen!

Jedenfalls war ich nicht bereit, zusätzlich noch ein Heidengeld für dieses Kabel auszugeben. Meine Shopping-Liste sah dementsprechend folgendermassen aus:

Den LCD-Monitor (15 Zoll) und die Mini-Tastatur (leider mit deutschem Layout) besass ich bereits. Beides schloss ich direkt an den iKVM-Switch an.

Werkseinstellungen und IP-Konfiguration

Zuerst setzte ich das Gerät auf Werkseinstellungen zurück, was dazu führte, dass es neu die IP 192.168.1.254 trug — in meinem Subnetz verwende ich aber 192.168.0! Ich verband deshalb mein MacBook Air mit einem Ethernetkabel mittels Apple USB-Ethernet-Adapter direkt mit dem iKVM-Switch. Anschliessend änderte ich die IP-Adresse meines MacBooks auf 192.168.1.1 und setzte dieselbe IP als Gateway.

Nun konnte ich den Web-Browser öffnen und auf https://192.168.1.254/ zeigen lassen. Mittels HTTP Basic Auth authentifiziert man sich als admin mit dem Passwort password (liebe Grüsse vom IT-Auditor). Bevor der Konfigurationsspass beginnen kann, muss man den Popup-Blocker des Browsers (bei mir für solche Fälle Firefox) deaktivieren.

Erst so gelangt man in die äusserst hässliche Java-Konfigurationsoberfläche. Die Netzwerkeinstellungen befinden sich unter

  1. Settings
  2. Global
  3. Network

Wer dem iKVM-Switch die IP-Adresse per DHCP übergeben will, findet in der Anzeige auch die MAC-Adresse des Gerätes. Wer auf Nummer sicher gehen will, konfiguriert die Adresse statisch, damit man auch beim Ausfall des DHCP-Servers auf das Gerät zugreifen kann. Mittels OK bestätigen, und schwups kann der Switch nun direkt mit dem Intranet verbunden werden.

In der weiteren Konfiguration deaktivierte ich unter

  1. Settings
  2. Global
  3. Sessions

die erzwungene SSL-Verschlüsselung ([ ] SSL connections only (must use https://) sowie [x] Allow Telnet and FTP connections. Ersteres bringt die Zertifikatswarnungen in den Web-Browsern weg, zweiteres eröffnet einem Telnet-Zugang auf das auf dem iKVM-Switch laufende FreeBSD-System. Natürlich sollte man die Aktivierung/Deaktivierung dieser Optionen in einem Unternehmensnetzwerk hinterfragen — im heimischen Netzwerk nehme ich die Sicherheitsrisiken gerne in Kauf.

Schlussendlich änderte ich auch noch das Administrator-Passwort und erstelle einen zusätzlichen Benutzer ohne Administrationsrechten.

VNC-Client in Gang bringen

Als der Switch auf den Markt gelassen wurde, sah die Systemlandschaft von iKVM-Benutzern noch deutlich anders aus als heute. Leider bietet der Switch nur eine Zugriffsmöglichkeit über den vpclient.exe, dem über die Web-Oberfläche zwei Sicherheitstoken mitgegeben werden. Folglich benötigt man nicht nur installiertes Java, sondern auch den Microsoft Internet Explorer und natürlich Windows, welche das Win32-Binary ausführen kann.

Glücklicherweise hat ein findiger Hacker (für mich nur via Google Cache erreichbar; lokales Backup) für das offenbar mehr oder weniger baugleiche APC AP5456 IP Gateway for Analog KVM ein bash Shell-Script entwickelt, mit welchem man die Tokens via cURL über die Web-Oberfläche des Switches abfrägt und damit die EXE-Datei aufruft (via wine).

wine

Zu Beginn sollte man Kaffee und Pop-Corn bereithalten, denn zuerst installiert man sich mit MacPorts das Paket wine:

# port install wine

Nach gefühlten vier Stunden Kompiliererei liegt wine als ausführbare Binärdatei vor.

vpclient.exe

Als nächstes lädt man sich vom Web-Server des iKVM-Switches die .cab-Datei herunter, welche die unter Windows ausführbare vpclient.exe und anderes Geschmäus enthält. Im Grunde kann man sich das weiter unten aufgeführte Script zu Nutze machen — aber etwas manuelle Arbeit schadet ja auch nichts. Deshalb logge ich mich per Telnet auf dem Switch ein und führe anschliessend folgenden Befehl aus, welcher mir den Namen der .cab-Datei nennt:

$ telnet 192.168.1.254
...
$ find /web -name "*.cab"
/web/vpclient4102.cab

Bei meinem iKVM-Switch mit Firmware-Version 1.0.5.6 und Build 04.09.07.1 handelt es sich um folgende URL:

192.168.1.254/vpclient4102.cab

ikvm.sh

Die .cab-Datei entpackt man danach in einem frei wählbaren Ordner; ich verwende hierzu The Unarchiver. Ins selbe Verzeichnis lädt man sich auch das Script von Chris, welches im oben genannten Cache vorgehalten wird. Der Vollständigkeit halber poste ich das Script hier auch noch:

#!/bin/bash

# A script to access an APC brand model AP5456 IP Gateway for Analog KVM 
# In Linux, using Wine

USERNAME="apc"
PASSWORD=""
KVM_SERVER=""

VIEWER_PATH=""

while [ -z "$KVM_SERVER" ]
do
    echo -n "FQDN of KVM Server (not including https://): "
    read KVM_SERVER
done

while [ -z "$USERNAME" ]
do
        echo -n "Username: "
        read USERNAME
done

while [ -z "$PASSWORD" ]
do
        echo -n "Password: "
        tput invis
        read PASSWORD
        tput sgr0
done

get_cab_name () {
    while read line
    do
        if [ "${line/'OBJECT CODEBASE'/}" != "$line" ]; then
            cab_name="${line##*'<OBJECT CODEBASE="'}"
            cab_name="${cab_name%%'"'*}"
            echo "$cab_name"
        fi
    done
}

get_cmd_args () {
    while read line
    do
        if [ "${line/PARAM/}" != "$line" ]; then
            ipaddr="${line##*'<PARAM NAME="ipaddr" VALUE="'}"
            ipaddr="${ipaddr%%'"'*}"

            sessionkey="${line##*'<PARAM NAME="sessionkey" VALUE="'}"
            sessionkey="${sessionkey%%'"'*}"

            encryptionkey="${line##*'<PARAM NAME="encryptionkey" VALUE="'}"
            encryptionkey="${encryptionkey%%'"'*}"
        fi
    done
    if [ -n "$sessionkey" ] && [ -n "$encryptionkey" ] && [ -n "$ipaddr" ]; then
        echo "-k $sessionkey -e $encryptionkey $ipaddr"
    fi

}

wine="`which wine`"
if [ -z "$wine" ]; then
    echo "Wine was not found, but is required.  Can not continue without it." >&2
    exit 1
fi

cd "`dirname $0`"
#If a path to vpclient.exe wasn't specified, and we can't find it, use /tmp
#as a place to download it to
if [ -z "$VIEWER_PATH" ] && ! [ -f "vpclient.exe" ]; then
    mkdir -p "/tmp/vpclient"
    VIEWER_PATH="/tmp/vpclient"
fi

#If a full path wasn't specified, prepend current working directory
if [ "${VIEWER_PATH:0:1}" != "/" ]; then
    VIEWER_PATH="`pwd`/$VIEWER_PATH"
fi

if ! [ -f "$VIEWER_PATH/vpclient.exe" ]; then

    cab_url="`curl -s --insecure --user "$USERNAME:$PASSWORD" "https://$KVM_SERVER/launch.asp" |get_cab_name`"
    cab_url="https://$KVM_SERVER/$cab_url"

    cabextract="`which cabextract`"
    if [ -z "$cabextract" ]; then
        echo "vpclient.exe was not found in $VIEWER_PATH" >&2
        echo "cabextract was not found either, so we can't download">&2
        echo -e "and extract vpclient.exe from it's CAB archive.\n" >&2
        echo "Error: user intervention required." >&2
        echo "----------------------------------" >&2
        echo "Download $cab_url" >&2
        echo "Unpack `basename $cab_url` into $VIEWER_PATH" >&2
        echo " -- OR -- " >&2
        echo "Install cabextract" >&2
        exit 1
    fi

    if ! [ -d "$VIEWER_PATH" ]; then
        echo "WARNING: Viewer Path specified is not valid." >&2
        echo "Path: $VIEWER_PATH" >&2
        echo -e "-------------------------------------------\n" >&2
        echo -n "Would you like me to create it? (y/N)?" >&2
        read answer
        shopt -s nocasematch
        if [ "$answer" = "y" ]; then
            mkdir -p "$VIEWER_PATH"
            if ! [ -d "$VIEWER_PATH" ]; then
                echo "Couldn't create: $VIEWER_PATH" >&2
                exit 1
            fi
        else
            exit
        fi
        shopt -u nocasematch
        
    fi

    cd "$VIEWER_PATH"
        curl -s --insecure --user "$USERNAME:$PASSWORD" "$cab_url" >"`basename $cab_url`"
        $cabextract -q "`basename $cab_url`" 2>/dev/null
fi


cmd_args="`curl -s --insecure --user "$USERNAME:$PASSWORD" "https://$KVM_SERVER/launch.asp" |get_cmd_args`"

cd "$VIEWER_PATH"

#Sanity check
if [ -f "./vpclient.exe" ]; then
    $wine "./vpclient.exe" $cmd_args
else
    echo "Failed, do it yourself: $wine vpclient.exe $cmd_args"
fi

Ich speichere es als ikvm.sh und mache es mit folgendem Befehl ausführbar:

$ chmod 755 ikvm.sh

Nachdem ich mich mit PPTP auf meinen Netgear WNDR3700-100PES RangeMax Router (Dual Band, Wireless-N,300 GigaBit) (Affiliate-Link) mit DD-WRT eingewählt habe (die Konfigurationsanleitung für die VPN-Lösung würde den Umfang dieses Blog-Posts sprengen), kann ich das Script starten (beim ersten Laden dauert es eine Ewigkeit, bis wine sich konfiguriert hat), gebe die IP-Adresse ein (192.168.0.5 reicht vollkommen aus) und die Zugangsdaten des Routers ein und erhalte innert Sekunden die Bildschirmanzeige des Servers auf den Monitor gezaubert.

Problembehandlung

Sobald alles sauber eingerichtet ist, sollte man den iKVM-Switch neu starten. Dies kann entweder physisch vor Ort oder aber über die Web-Oberfläche aus der Ferne geschehen:

  1. Tools
  2. Reboot Appliance

Ich habe zudem über Telnet auch noch einige Male /usr/bin/vps von Hand gestartet. Seither klappt jeder Verbindungsversuch auf Anhieb.

Erscheint ein pinkiger Hintergrund anstelle des Videobildes und friert wine anschliessend ein, sollte man den ganzen Prozess abschiessen und ikvm.sh erneut ausführen. Das Problem löst sich beim zweiten Aufruf.

Tags: , , , , , , ,
Labels: IT

Keine Kommentare | neuen Kommentar verfassen