Archive for the ‘tech’ Category

Ich sehe Zellenfluss

Montag, Mai 22nd, 2023

Meine Kollegys wundern sich manchmal darüber wenn ich in einem Troubleshooting sage “Ich sehe Zellenfluss!”. Diese Aussage kommt aus meiner Vergangenheit als ich bei einem Reseller von SDSL-Leitungen tätig war.

Bildnachweis: table / photocase.de
Bildnachweis: table / photocase.de

Damals war so eine SDSL-Leitung (genauer: g.SHDSL) auf maximal 2MBit/s beschränkt. Da das auch zu der Zeit schon nicht sehr viel war (ADSL war damals schon bei 16 MBit/s Downstream angekommen) wollten manche Kunden gerne mehrere Leitungen Bündeln um vier, sechs oder acht MBit/s zu erreichen.

Dies war allerdings sehr fragil, alle beteiligten Leitungen sollten idealerweise auf dem selben DSLAM oder noch besser auf der selben Linecard liegen. Ansonsten kam es durchaus vor, dass z.B. nach Wartungsarbeiten die Leitungen aus dem Tritt gerieten. Es ging zwar das eine oder andere kleine Paket durch, aber die erzielbare Bandbreite war ziemlich Mau, d.h. eher im kBit/s-Bereich.

Leider war es in diesen weichen Fehlerbildern – ein anderer Carrier fragte mal ob eine Leitung “DOWN-HARD” sei – schwierig den Support zum Arbeiten zu bewegen. Die Initiale Aussage eines Technikers war diese zitierte Feststellung, er sähe Zellenfluss. Damit waren die unter dem PPPoEoA liegenden ATM-Zellen gemeint, die auf dem ATM-Switch zu sehen waren.

Ich sehe Zellenfluss bedeutet also dass der Techniker es für funktional hält, es für den Anwender aber trotzdem unbrauchbar ist.

Einfach mal Danke sagen…

Freitag, Mai 19th, 2023

Heute habe ich die Gelegenheit mal abzuschalten – meine großartigen Kollegys halten den Betrieb aufrecht, während andere am Brückentag Überstunden abbauen können. 

Diese Woche wurde ich nochmal daran erinnert, was wir als Team alles schaffen können. Es ist zum Glück schon etwas länger her (vier Jahre!), und kommt selten vor. Aber ich werde die bisher anstrengendste Arbeitswoche vor einigen Jahren nicht so schnell vergessen. Nach einem größeren Update unserer Firewall-Systeme gab es neben etlichen Verbesserungen leider auch das eine oder andere “unerwartete Feature”, Insider würden sie als Bugs bezeichnen. 

Aber warum ist das für mich eine positive Erinnerung? Weil wir letztendlich alle Probleme lösen konnten. Neben schnellen Workarounds für die am meisten betroffenen Kundenumgebungen brauchten wir dafür Improvisationstalent und Hands-On Unterstützung der Infrastruktur-Kollegen, die in unseren Rechenzentren arbeiten, Unterstützung vom Hersteller in Form mehrerer maximal eskalierter Support-Requests mit direkter Einbindung der Entwicklungsabteilung und extrem professionelle Support-Mitarbeiter inklusive Übergabe im Follow-The-Sun-Prinzip.

Das ganze über mehrere Tage ununterbrochen begleitet von meinen direkten Kollegen, die in Form einer “Lagerfeuerwache” immer nach einer gewissen Zeit den aktuellen Stand und die weiteren Maßnahmen an den nächsten übergeben haben. Die Erinnerung an diese Gemeinschaftsleistung erfüllt mich immer noch mit Stolz.

Read Mail Real Fast

Montag, November 1st, 2021

Durch den Artikel unter https://itsfoss.com/sudo-rm-rf/ bin ich ins Grübeln gekommen. Ich habe nämlich eine Abneigung gegen den -f Parameter von rm. Aber warum, und was meine ich mit der Überschrift?

Die Überschrift greift einen alten Scherz auf. Beim Einloggen auf einem Linux-System wird man gelegentlich auf ungelesene Mails hingewiesen, gerne an den User root adressiert. Neulinge kann man gut foppen indem man ihnen sagt dass die das per “Read Mail Real Fast Root” Kommando machen soll, oder eben per rm -rf / – Naive Anfänger löschen damit ihre Root-Partition, in früheren Zeiten wäre man gelegentlich durch ein gemountetes /cdrom gerettet worden…

Was mich aber an dem eigentlichen Problem stört, ist, dass Neulinge von Linux-Distributionen früh an den -f Parameter (--force) gewöhnt werden. Diese Distributionen misstrauen dem User nämlich und setzen einen Alias für rm auf rm -i, was bei JEDER. EINZELNEN. DATEI. fragt ob man sie denn wirklich ehrlich und in echt löschen will. Das nervt relativ schnell, und verleitet zur “Lösung” den -f Parameter zu verwenden.

Anstatt sich ein rm -f anzugewöhnen, und zum Löschen von Verzeichnissen rm -rf zu verwenden, empfehle ich das Entfernen des Aliases. Dann macht ein rm genau das was es soll, es löscht Dateien, und fragt in Sonderfällen nach. Will ich ein Verzeichnis löschen ist es meist ohnehin bereits leer und ich kann rmdir verwenden. Und sollte ich mich vertan haben, muss ich auf das hoffentlich vorhandene Backup zurückgreifen.

Die “nukleare Option” rm -rf nutze ich also nicht aus Gewohnheit, sondern immer nach einer Abwägung ob das jetzt wirklich sein muss. Und wenn, dann mache ich erst ein ls -la dasmusswech um mich zu vergewissern was ich lösche. Und dann gebe ich rm -rf ein, gefolgt von ALT+. – damit hole ich das Argument des letzten Befehls aus der History und kann gar nicht das falsche Verzeichnis löschen.

Warum ich die Bezeichnung “Class C Netz” nicht mehr hören mag

Donnerstag, Mai 4th, 2017

Bei vielen, die schon seit längerem in der IT arbeiten, hat es sich eingeschlichen, von einem “Class C” Netz zu sprechen, wenn ein Netz mit 256 IP-Adressen gemeint ist. Wenn ich dann darauf hinweise, dass wohl ein /24 gemeint sei, ernte ich häufig verwirrte Gesichter und die Antwort, dass dies doch das Gleiche sei.

Hierzu ein kleiner Ausflug in die gute alte Zeit. Früher wurde zwischen verschiedenen Autonomen Systemen beim Austausch von Routing-Informationen nur die Netzadresse übertragen. Die Netzmaske ergab sich aus der “natürlichen” Netzmaske anhand des Class Based Routing. Mit Einführung von CIDR (Classless Inter-Domain Routing) wurde die Übertragung von Netzmasken verpflichtend. Dadurch konnten beliebige Subnetze gebildet und übermittelt werden.

Die Netz-Klasse war also ein Hilfsmittel, um die Netzmaske zu ermitteln. Dies bedeutet aber auch, dass mit der Einführung von CIDR die Netzmaske nicht mehr umgekehrt auf die Netzklasse schließen lies. Somit kann also ein /24-Netz in den Bereich der Class C Netze fallen, aber ebensogut aus dem Class A oder Class B Bereich stammen.

Warum allerdings nur die Bezeichnung Class C für ein /24, aber nicht die anderen Bezeichnungen bis heute überlebt haben, erschließt sich mir nicht.

Meine Bitte: Wer sich dieser Mehrdeutigkeit nicht klar ist oder sich unmissverständlich ausdrücken möchte, solle doch bitte ausschließlich Netzmasken in CIDR-Notation verwenden, und den Begriff des “Class C” Netzes endlich aussterben lassen.

Cisco Type 7 Passwörter entschlüsseln

Donnerstag, Februar 11th, 2016

Relativ früh in meiner Laufbahn als Netzwerkadministrator habe ich erfahren, dass Passwörter auf Cisco-Routern manchmal reversibel gespeichert werden. Da es nicht immer praktikabel ist, auf einem entsprechenden Gerät einfach “no service password-encryption” einzugeben, gibt es diverse Skripte zur Umkehrung dieser Verschlüsselung. Damit ich nie wieder suchen muss lege ich ein Skript, von dem ich leider keine Ahnung habe wer der ursprüngliche Autor ist, hier ab:

#!/usr/bin/perl
use File::Copy;

############################################################################
# Vigenere translation table
############################################################################
@V=(0x64, 0x73, 0x66, 0x64, 0x3b, 0x6b, 0x66, 0x6f, 0x41, 0x2c, 0x2e,
    0x69, 0x79, 0x65, 0x77, 0x72, 0x6b, 0x6c, 0x64, 0x4a, 0x4b, 0x44,
    0x48, 0x53, 0x55, 0x42, 0x73, 0x67, 0x76, 0x63, 0x61, 0x36, 0x39,
    0x38, 0x33, 0x34, 0x6e, 0x63, 0x78, 0x76, 0x39, 0x38, 0x37, 0x33,
    0x32, 0x35, 0x34, 0x6b, 0x3b, 0x66, 0x67, 0x38, 0x37);
############################################################################

############################################################################
# Usage guidelines
############################################################################
if ($ARGV[0] eq ""){
   print "This script reveals the IOS passwords obfuscated using the Vigenere algorithm.n";
   print "n";
   print "Usage guidelines:n";
   print " cdecrypt.pl 04480E051A33490E     # Reveals a single passwordn";
   print " cdecrypt.pl running-config.rcf   # Changes all passwords in a file to cleartextn";
   print "                                  # Original file stored with .bak extensionn";
}

############################################################################
# Process arguments and execute
############################################################################
if(open(F,"<$ARGV[0]")){    # If argument passed can be opened then convert a file
  open(FO,">cdcout.rcf") || die("Cannot open 'cdcout.rcf' for writing ($!)n");
  while(<F>){
    if (/(.*passwords)(7s)([0-9a-fA-F]{4,})/){     # Find password commands
      my $d=Decrypt($3);                             # Deobfuscate passwords
      s/(.*passwords)(7s)([0-9a-fA-F]{4,})/$1$d/;  # Remove '7' and add cleartext password
    }
    print FO $_;
  }
  close(F);
  close(FO);
  copy($ARGV[0],"$ARGV[0].bak")||die("Cannot copy '$ARGV[0]' to '$ARGV[0].bak'");
  copy("cdcout.rcf",$ARGV[0])||die("Cannot copy '$ARGV[0]' to '$ARGV[0].bak'");
  unlink "cdcout.rcf";
}else{                      # If argument passed cannot be opened it is a single password
  print Decrypt($ARGV[0]) . "n";
}

############################################################################
# Vigenere decryption/deobfuscation function
############################################################################
sub Decrypt{
  my $pw=shift(@_);                             # Retrieve input obfuscated password
  my $i=substr($pw,0,2);                        # Initial index into Vigenere translation table
  my $c=2;                                      # Initial pointer
  my $r="";                                     # Variable to hold cleartext password
  while ($c<length($pw)){                       # Process each pair of hex values
    $r.=chr(hex(substr($pw,$c,2))^$V[$i++]);    # Vigenere reverse translation
    $c+=2;                                      # Move pointer to next hex pair
    $i%=53;                                     # Vigenere table wrap around
  }                                             #
  return $r;                                    # Return cleartext password
}

Garmin GPSMAP 62 startet nicht mehr

Samstag, November 28th, 2015

2a70d1f3-b62f-4b4e-8beb-beace88d1389_l

Garmin GPSmap 62st

In letzter Zeit passiert es immer häufiger: Mein Garmin GPSMAP 62st bekommt neue Geocaching.com Pocket-Queries als GPX-Dateien aufgespielt, und stürzt beim folgenden Einschalten immer wieder ab.

Die Lösung war bisher immer, ihn nochmal im USB-Speicher-Modus zu starten. Klappt dies nicht mehr automatisch, kann man ihn so dazu zwingen: Während man auf die “Hoch”-Taste des Steuerkreuzes drückt das USB-Kabel einstecken, und warten bis das USB-Symbol angezeigt wird. Erst dann die Taste loslassen.

Nun kann man die zuletzt eingespielten Dateien entfernen, meist startet er danach wieder. Es liegt auch nicht an den Dateien, die man nach der Wiederbelebung einfach nochmal hinlegen kann. Meine Vermutung geht in Richtung einer internen, korrupten Datenbankdatei.

Manchmal reicht es sogar schon, ihn einmal ohne die Micro-SD-Karte zu starten, auf der meine GPX-Dateien immer liegen.

Einmal half aber nichts von alledem. Ich fürchtete schon, dass mein Garmin das Zeitliche gesegnet hätte. Bevor ich ihn komplett zurückgesetzt habe fand ich aber per WebUpdate eine neue Firmware-Version, die ich per oben beschriebenem Zwangs-Massenspeicher-Modus installieren konnte. Danach startete er, als wäre nichts gewesen.

Mac Mini Neustart nach Stromausfall

Donnerstag, Oktober 8th, 2015

Ich war kürzlich in der Situation, dass ich meinen MacMini, der zu Hause als Videorecorder mit EyeTV läuft, neustarten wollte. Der Tuner hatte sich (mal wieder…) aufgehängt.

Da ich aus der Ferne den Rechner samt Tuner stromlos schalten kann, dachte ich hier auf der sicheren Seite zu sein. Also fuhr ich den Mac per ScreenSharing sauber herunter, schaltete den Strom aus und danach wieder ein. Vorher prüfte ich natürlich, ob die entsprechende Option aktiviert ist.

Restart after Powerloss

Restart after Powerloss

Leider startete der Rechner nicht wieder. Eine Recherche ergab, dass alles korrekt konfiguriert ist. Eine Kontrolle per Shell bestätigte, dass autorestart aktiviert war:

$ pmset -g
Active Profiles:
AC Power		-1*
Currently in use:
 hibernatemode        0
 womp                 1
 networkoversleep     0
 sleep                0 (sleep prevented by screensharingd)
 Sleep On Power Button 1
 ttyskeepawake        1
 hibernatefile        /var/vm/sleepimage
 autorestart          1
 disksleep            10
 displaysleep         0

Eine weitere Suche im Internet brachte mir dann eine Erklärung. Der Neustart nach Stromausfall funktioniert nur, wenn der Rechner nicht sauber heruntergefahren wurde. Will man dennoch den Rechner herunterfahren, und dann per Reset neu starten, muss man dies per halt -u machen. Dann fährt er zwar herunter, schaltet aber erst nach 5 Minuten hart aus. Dies ist für den sauberen Shutdown mit einer USV gedacht, und funktioniert tatsächlich.

E-Mails einer Mailbox neu zustellen

Samstag, März 22nd, 2014

©Rosa Rotkraut / photocase.com

©Rosa Rotkraut / photocase.com

Zwischendurch mal ein kleiner Tipp, wie man E-Mails, die in einer Mailbox im mbox-Format gelandet sind, wieder einem Mailserver zuführen kann.

nach Empfänger in der eMail
formail -s sendmail -t < mailbox
an eine bestimmte Adresse
formail -s sendmail recipient@example.com < mailbox

Wie ich mir die Zukunft vorstelle…

Montag, März 17th, 2014

In letzter Zeit gibt es immer mehr sogenannte SmartWatches, die als Zubehör zum Telefon (Smartphone) fungieren sollen. Dies hat mich daran erinnert, dass ich schon in den 90ern eine Vision hatte, wie die Zukunft der Informationstechnologie aussehen könnte.

Es begann mit einem Palm III

© knallgrün / photocase.com

© knallgrün / photocase.com

Damals besaß ich meinen ersten PDA (Personal Digital Assistant), einen Palm III. Für mich als Oberstufenschüler war das ein seltsames Gefühl, ein so teures Gerät quasi täglich mit mir herumzuschleppen. Trotz seiner im Rückblick ziemlich eingeschränkten Kommunikations­fähigkeit war es faszinierend – mein digitales Adressbuch, topaktuell wenn ich daran gedacht hatte ihn mit meinem PC zu synchronisieren. Dazu noch die Möglichkeit, Notizen, meinen Kalender, und diverse kleinere Programme auch unterwegs zu nutzen.

Ergänzt wurde das ganze durch eine Armbanduhr, eine Timex DataLink. Diese Uhr hatte mein Vater von einer USA-Reise mitgebracht, auch sie konnte man mit dem PC synchronisieren – Kabellos. Man musste nur die entsprechende Software starten, die Uhr in den Synchronisationsmodus schalten, und vor den Bildschirm halten. Dann blitzten Linienmuster auf, in denen alle Informationen kodiert waren, die von der Uhr per Photodiode erfasst wurden.

Einziges Manko war, dass der PC zu Hause immer noch der Dreh- und Angelpunkt der Information war. Es gab keine Möglichkeit, im Palm etwas einzutragen, und später unterwegs per Armbanduhr auf die Information zuzugreifen, es sei denn man hatte zwischendurch synchronisiert. Mobiles Internet und Daten in der Cloud waren damals noch Utopie, und auch heute würde ich gerne ohne auskommen.

Die Vision

Daraus erwuchs mit der Zeit folgende Idee: Der Palm war ein hervorragendes Anzeige- und Eingabegerät. Der PC war noch ein bisschen besser für solche Zwecke geeignet. Die Uhr eignete sich nur zum rudimentären anzeigen, aber alle benötigten einen Speicherplatz für meine Informationen.

Aber wieso brauchte jedes Gerät einen eigenen Speicherplatz? Konnte man das nicht optimieren, um das ewige hin-und-hersynchronisieren zu vermeiden? Ich stellte mir vor, die Armbanduhr hätte ausreichend Speicher, um meine Daten aufzunehmen. Sie hätte ich immer dabei, und könnte zumindest die Daten anzeigen, eine Telefonnummer nachschlagen, was vor dem Handyzeitalter durchaus mal vorkam, wenn man z.B. bei Freunden telefonieren wollte, oder eine der damals noch zahlreichen Telefonzellen benutzen musste. Sie könnte mich an Termine erinnern, und meine Notizen anzeigen.

Sollte ich gerade auch meinen Palm zur Hand haben, könnte dieser auf die Daten der Armbanduhr zugreifen, sie anzeigen und mir ermöglichen sie zu bearbeiten. Um das Display zu betreiben, hätte der Palm eine eigene Stromversorgung, wäre diese erschöpft fiele halt ein Eingabegerät weg.

Am PC könnte ich ebenso auf diese Daten zugreifen, vielleicht sogar die Uhr als Datenträger verwenden, anstatt immer eine 3,5″-Diskette in der Jackentasche dabeizuhaben.

Umsetzung heute

© kallejipp / photocase.com

© kallejipp / photocase.com

Mittlerweile könnte man noch einen Schritt weiter gehen – Smartphones könnten diesem kleinen mobilen Datenspeicher als Brücke zum Handynetz dienen, da ihre größere Akkukapazität und bessere Antennen hierfür deutlich besser geeignet sind als eine Armbanduhr.

Die Verbindung könnte per Bluetooth erfolgen, zusätzlich könnte man mit der Cloud synchronisieren. Die Armbanduhr könnte als Authentifizierungsmerkmal benutzt werden, per NFC als Zahlungsmittel dienen oder als RFID-Transponder beim CarSharing das Fahrzeug öffnen.

Unter diesen Umständen könnte ich mir vorstellen, wieder eine Armbanduhr zu tragen. Dies habe ich mir damals abgewöhnt, weil mir der Palm und später mein Handy als Taschenuhr vollkommen ausgereicht hat. Aber eine sogenannte SmartWatch, die verblödet, sobald das Telefon ausser Reichweite ist, kann ich mir nicht vorstellen.

Rewrite-Rules für GET-Parameter

Montag, Juli 15th, 2013

(c) BastianDietz / photocase.comManchmal steht man vor dem Problem, dass eine Website auf ein neues oder anderes Content Management System (z.B. Joomla! oder WordPress) umgestellt wird, man aber die alten URLs per Redirect auf die neuen umleiten möchte, z.B. um weiterhin per Google gefunden zu werden.

Intuitiv würde man dann Rewrite-Regeln wie die folgenden schreiben:

RewriteRule ^start/$ /start.html [R=301,L]
RewriteRule ^index.php?page=imprint$ /imprint.html [R=301,L]

Die erste Regel funktioniert auch problemlos, die  zweite allerdings nicht, weil die Parameter eines Requests nicht an der Stelle mit ausgewertet werden. Daher muss man anstelle dieser Regel mit einer Bedingung vorweg arbeiten:

RewriteCond %{QUERY_STRING} ^page=imprint$
RewriteRule ^index.php$ /imprint.html? [R=301,L]