Archive for the ‘networking’ 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.

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
}

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]

DNS-Einträge automatisch erzeugen mit BIND

Donnerstag, Januar 10th, 2013

Da grundsätzlich jede statisch oder dynamisch vergebene IP-Adresse eine funktionierende DNS-Auflösung haben sollte, bietet sich neben einem Skript, das solche Einträge erzeugen könnte, die Makro-Funktion des BIND Nameservers an. Hiermit kann man automatisch passende Einträge erzeugen lassen:

Forward-Zone example.com:

$GENERATE 42-47 static-192-0-2-$ A 192.0.2.$

Reverse-Zone 2.0.192.in-addr.arpa:

$GENERATE 42-47 $ PTR static-192-0-2-$.example.com.

Speicherverbrauch per Linux-Kommandozeile

Sonntag, April 22nd, 2012

Ein kurzer Tipp zwischendurch: Wenn eine Partition unter Linux voll ist und man herausfinden möchte, wo der Speicherplatz geblieben ist, hilft diese Kommandozeile. Sie gibt für alle Unterverzeichnisse des aktuellen Verzeichnisses, wie viel Platz sie belegen — aufsteigend sortiert:
du -s * .??* | sort -n | cut -f 2 | xargs du -sh

Wartungsarbeiten

Donnerstag, Dezember 29th, 2011

Manchmal haben wir als Webhoster die Diskussion, ob und wann Wartungsarbeiten akzeptabel sind. Da es hier oft unterschiedliche Ansichten gibt habe ich mittlerweile eine kleine Sammlung von Wartungsseiten, um zu zeigen dass es keine Schande ist, ab und zu seine Seite offline zu schalten um in Ruhe Änderungen vorzunehmen.

Apple Developer:

eBay:

Geocaching.com:

Rittal:

RIPE:

Dear colleagues,

To allow us to update the software behind the RIPE NCC website and RIPE
Labs, functionality on these sites will be reduced between 15:00 and
19:00 (UTC) today, 28 June 2011.

During this time, the sites will remain available. However, they will be
in "read only" mode. Search functionality will be unavailable, and it
will not be possible to comment on articles or join in discussions.

We apologise in advance for any inconvenience this might cause.

If you have any questions about this maintenance work, please contact
webmaster@ripe.net.

Ergänzung zum Thema Wartungsarbeiten-Seite

Dienstag, Oktober 4th, 2011

Ich las kürzlich von jemandem, der aufgrund von Problemen auf einer Webseite eine Umleitung auf eine Fehlerseite bekommen hatte. Ist so eine Umleitung einmal erfolgt, kann man im Browser so oft die Seite aktualisieren, man bekommt trotzdem immer wieder die Fehler- oder Wartungsseite.

Dabei fiel mir mein Posting zum Thema Wartungsseite mit mod_rewrite wieder ein, das in der Hinsicht auch nicht besser war. Daher hier meine Ergänzung zur rewrite-Regel für eine Wartungsseite, bei der man nach erfolgter Wartung von der Wartungsseite auf die Startseite zurückleitet. Auch hier dienen die Bedingungen dazu, dass man von seiner festen IP-Adresse jederzeit die Wartungsseite testen kann:

RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^192.168.28.17$ [NC]
RewriteCond %{REMOTE_ADDR} !^fe80:$ [NC]
RewriteRule ^wartung.html$ / [NC,L]

SNMP-Traps per EEM generieren

Donnerstag, Mai 19th, 2011

Kürzlich habe ich darüber geschrieben, wie man die Alarm-Kontakte an einem Cisco Metro Ethernet Switch, z.B. dem Modell ME 3400EG-2CS-A, nutzen kann. Allerdings hat offenbar Cisco — mal wieder — das nützlichste Feature vergessen, nämlich die Möglichkeit, SNMP-Traps hierzu zu generieren.

Alles, was man bekommt, sind Log-Meldungen, die z.B. so aussehen:

%PLATFORM_ENV-1-EXTERNAL_ALARM_CONTACT_ASSERT:
Alarm asserted: Door
%PLATFORM_ENV-1-EXTERNAL_ALARM_CONTACT_CLEAR:
Alarm cleared: Door

Zum Glück hat man aber heutzutage den Embedded Event Manager zur Verfügung. Hiermit kann man aus den Logmeldungen auch SNMP-Traps generieren:

event manager applet DoorOpen
 event syslog occurs 1 pattern "%PLATFORM_ENV-1-EXTERNAL_ALARM_CONTACT_ASSERT:"
 action 1.0 snmp-trap intdata1 1 intdata2 2 strdata "Door Opened"
event manager applet DoorClose
 event syslog occurs 1 pattern "%PLATFORM_ENV-1-EXTERNAL_ALARM_CONTACT_CLEAR:"
 action 1.0 snmp-trap intdata1 1 intdata2 0 strdata "Door Closed"

Hierbei wird in den Trap-Parametern die Sensor-Nummer 1 sowie der Status als entsprechender Code für das auswertende Nagios-Plugin übermittelt. Der Trap enthält somit diese Daten:

SNMPv2-SMI::enterprises.9.10.91.1.2.3.1.9.11 = INTEGER: 1#011
SNMPv2-SMI::enterprises.9.10.91.1.2.3.1.10.11 = INTEGER: 2#011
SNMPv2-SMI::enterprises.9.10.91.1.2.3.1.11.11 = STRING: “Door Closed”#011

Alarm-Kontakt Cisco ME 3400EG-2CS-A

Donnerstag, Mai 12th, 2011

Bei einigen Cisco-Switches der Metro Ethernet Serie ist ein praktischer Alarm-Port eingebaut. Diesen kann man z.B. verwenden, um einen verschlossenen Verteilerkasten beim Kunden zu überwachen. Leider findet man bei Cisco hierzu nur eine kurze Notiz im Installation Guide:

Alarm Input Port

The switch supports four alarm inputs. The alarm input is a dry-contact alarm port. Use the CLI to define each alarm input to respond to a normally open or closed dry-contact closure and to define the alarm severity as minor, major, or critical. When a condition triggers an alarm, the console displays an alarm message, and the corresponding Alarm LED responds (see the “Alarm LEDs” section).

Welche Pins hierfür benutzt werden müssen geht hieraus leider nicht hervor. Durch Tests habe ich allerdings an unserem Cisco ME 3400EG-12CS-M folgende Belegung ermitteln können:

Pin Signal Farbe (T568A)
1 Alarm1 weiß/grün
2 Alarm2 grün
3 weiß/orange
4 Alarm3 blau
5 Alarm4 weiß/blau
6 orange
7 weiß/braun
8 Masse braun

Die Konfiguration im IOS ist dann entsprechend der Dokumentation schnell erledigt, z.B. wenn an Port 1 der Normalzustand “Geschlossen” ist:

alarm-contact 1 description door
alarm-contact 1 severity critical
alarm-contact 1 trigger open

Update: In der Zwischenzeit ist auch die Dokumentation Configuring Switch Alarms bei Cisco verfügbar geworden