Backup der Switchkonfiguration per Powershell

Jedes Netzwerk benötigt Switche, um die Kommunikation zwischen PCs mit den Servern und anderen Periperiegeräten zu ermöglichen. In kleineren Unternhemen sind meistens einfache Switche ohne Konfigurationsmöglichkeit ausreichend. Je größer jedoch das Unternehmen wird wächst meistens auch die Anforderung an die Switche. Deshalb müssen diese konfigurierbar sein, um z.B. mehrere VLANs zu verwalten oder gewisse Einstellungen an den Ports vorzunehmen. Mit den gewachsenen Anforderungen wird auch die Konfiguration komplizierter und umfangreicher. Ein Switch wird sehr oft vernachlässigt, da dies ein Gerät ist, welches sich in einem Netzwerkschrank befindet und fröhlich vor sich hin blinkt. Solange der Switch funktioniert ist alles gut, aber sollte der Switch nach einem Defekt nicht mehr funktionsfähig sein, so hat man ein Problem. Einen neuen Switch zu organisieren ist dabei das geringste Problem. Ein viel größeres Problem ist es die Konfiguration wieder herzustellen, sofern man keine Dokumentation besitzt. Letzteres ist wohl auch eher selten der Fall :-).

Mit Hilfe des folgenden Powershell-Skripts kann man automatisiert die Konfiguration von Switchen per Telnet auslesen und diese als Datei auf einem Server ablegen. Sollte somit zu einem späteren Zeitpunkt der Switch kaputt gehen, so hat man wenigstens die Konfiguration gesichert und kann diese im günstigsten Fall einfach in den neuen Switch importieren. Als Voraussetzung hierfür werden folgende Komponenten beöntigt:

Ein TFTP-Server ala TFTP32
Ein Server oder Client mit installierter Powershell
Aktivierter Telnet-Zugriff auf die Switche

 

Als Grundlage des Skripts kommt hier das Telnet-Skript von Martin Pugh zum Einsatz. Mit Hilfe dieser Funktion kann eine Verbindung über Powershell zu Geräten hergestellt und können Befehle an diese abgesetzt werden. Zunächst aber muss der TFPT-Server auf dem Client installiert werden. Sofern dies erledigt ist kopieren Sie das Skript per Copy&Paste in einen Editor Ihrer Wahl und speichern Sie dieses als backup_switch.ps1 auf dem Client ab. Für das Skript werden zwei Unterordner benötigt, in denen zum einen die Befehlsskripte und die Logfiles abgelegt werden. Wenn Sie z.B. das Skript nach C:\Skripte\Switchbackup kopiert haben, so erstellen Sie bitte die beiden Ordner Commands und Logs darunter. Sollten Sie einen anderen Pfad gewählt haben, so müssen Sie noch die Variable $BaseDir auf diesen Pfad anpassen. Je nachdem, welchen TFTD-Server Sie ausgewählt haben muss auch noch die Variable $TftpServiceName auf den entsprechenden Dienstnamen angepasst werden.


# Function to connect to remotehosts over telnet
 Function Get-Telnet
 {
   Param (
   [Parameter(ValueFromPipeline=$true)]
   [String[]]$Commands = @(“username”,”password”),
   [string]$RemoteHost = “IPAddress”,
   [string]$Port = “23”,
   [int]$WaitTime = 1000,
   [boolean]$Debugging = $false
   )

   $Socket = New-Object System.Net.Sockets.TcpClient($RemoteHost, $Port)
   If ($Socket)
   {
     $Stream = $Socket.GetStream()
    $Writer = New-Object System.IO.StreamWriter($Stream)
    $Buffer = New-Object System.Byte[] 1024
    $Encoding = New-Object System.Text.AsciiEncoding

    ForEach ($Command in $Commands)
    {
     $Writer.WriteLine($Command)
     $Writer.Flush()
     Start-Sleep -Milliseconds $WaitTime
    }
    Start-Sleep -Milliseconds ($WaitTime * 4)
    $Result = “”

    While($Stream.DataAvailable)
    {
     $Read = $Stream.Read($Buffer, 0, 1024)
     $Result += ($Encoding.GetString($Buffer, 0, $Read))
    }
   }
   Else
   {
    $Result = “Unable to connect to host: $($RemoteHost):$Port”
   }

   if ($Debugging)
   {
    $Result | Out-File ($BaseDir +”\Logs\”+ $RemoteHost +”_log.txt”)
   }
  }

Global settings
 $BaseDir =”C:\Skripte\Switchbackup\”
 $TftpServiceName =”Tftpd32_svc”

# Start program here
 Start-Service $TftpServiceName

 $files = Get-ChildItem -Path ($BaseDir + “\Commands\”)

 foreach ($file in $files)
 {
  $remotehost = $file.BaseName
  $commands = Get-Content ($BaseDir + “\Commands\” + $file.Name)

  Get-Telnet -Commands $commands -RemoteHost $remotehost -Debugging:$false
 }

 Stop-Service $TftpServiceName


 
Jetzt fehlen für das Backup der Switche noch die Konfigurationsdateien. Diese müssen im Verzeichniss Commands abgelegt werden. Dazu gibt es zu beachten, dass der Dateiname gleich dem Hostnamen bzw. der IP-Adresse sein muss. Soll die Konfiguration des Switches mit der IP-Adresse 192.168.1.1 gesichert werden, so muss die Datei auch 192.168.1.1.txt heissen. Anhand des Dateinamens wird später die Verbindung zum Switch hergestellt. In der Datei selbst stehen die Befehle, wie sie auch in der Console eingegeben werden müssen, um das Backup zu erstellen. Folgend ein Beispiel für ein Backup-Skript.
 
Dateiname: 192.168.1.1.txt


user
password
enable
copy running-config startup-config
y
copy running-config tftp://192.168.1.100/Switches/192.168.1.1.cfg
y
exit
exit


 
Das Powershell-Skript startet zu Beginn den TFTP-Server und liest danach alle Dateien des Commands-Verzeichnisses ein und durchläuft diese in einer Schleife. Dabei werden die Befehle aus der Datei gelesen und anschließend eine Telnet-Verbindung zum Switch hergestellt. Innerhalb der Verbindung werden die Befehle aus der Textdatei nacheinander gesendet und diese somit ausgeführt. Wurden alle Befehlsdateien durchlaufen wird im Anschluß daran der TFTP-Server wieder beendet. Falls gewünscht kann durch ändern des Parameters Debugging auf den Wert $true die Protokollierung einschalten. Dabei werden die Logfiles im Ordner Logs abgelegt.
 

Beachten Sie, dass hier Benutzername und Kennwort in der Textdatei im Klartext abgespeichert werden und somit einfach lesbar sind. Sie sollten mittels Dateisystemberechtigungen dafür sorgen, dass keine unbefugte Person Zugriff auf diese Dateien bekommt. Zudem handelt es sich bei einer Telnet-Verbindung um eine unverschlüsselte Verbindung, d.h. auch hier werden Benutzername und Kennwort im Klartext übertragen. Eine bessere Alternative wäre hier SSH, sofern dies von den Switchen unterstützt wird. Hierfür kann dieses Powershell-Skript allerdings sehr gut als Ansatz genommen werden.

HINWEIS: Wer möchte kann dieses Skript gerne einsetzen und für seine Bedürfnisse anpassen. Ich übernehme allerdings keine Haftung für eventuelle Probleme oder Schäden, die mit dem Einsatz des Skriptes auftreten! Die Verwendung des Skripts erfolgt somit auf Ihre eigene Gefahr!

leave your comment

Sicherheitsabfrage: * Time limit is exhausted. Please reload CAPTCHA.