samtrex
Goto Top

Backup via Internet auf 1TB TrueCrypt-Ordner schlägt fehl

Liebe Admins,
nach langer Zeit habe ich mal wieder ein kleines Projekt realisiert.
=> Backup via VPN-Kopplung auf eine TrueCrypt-Verschlüsselte USB-Festplatte an einer Fritzbox <=

Vorab: Der hier unten gepostete PS-Code läuft im Testszenarion problemlos. Doch sobald es an das Zielszenario geht bekomme ich Probleme.

Szenario 1 (Test) - funktioniert:
Das Script läuft auf einem lokalen PC.
Das Backups soll in den TrueCrypt-Container auf einem USB-Stick an der im selben Netzwerk laufenden Fritz-Box.
1. Freigabe der Fritzbox wird als Netzlaufwerk eingebunden
2. TrueCrypt-Container auf dem Netzlaufwerk wird gemountet (Dateigröße 500MB)
3. CopyJob
4. TrueCrypt-Container wird dismountet
5. Netzlaufwerk wird getrennt

Szenario 2 (Ziel) - Problem:
Das Script läuft auf einem lokalen PC.
Das Backups soll in den TrueCrypt-Container auf einem USB-Stick an einer per VPN gekoppelten Fritz-Box.>
1. Freigabe der Fritzbox wird als Netzlaufwerk eingebunden
2. TrueCrypt-Container auf dem Netzlaufwerk wird gemountet (Dateigröße 1TB) <=== DAUERT LANGE, KLAPPT ABER
3. CopyJob <=== SCHLÄGT FEHL, in einem manuellen Test ist das gemountete Laufwerk zwar da, aber über den Explorer nicht ansprechbar.
4. TrueCrypt-Container wird dismountet
5. Netzlaufwerk wird getrennt


Verbindungsdaten:
Quelle: Download: 5,0Mbit/s Upload:900kbit/s
Ziel: Download: 800kbit/s Upload:352 kbit/s
Die Anbindung des Ziels ändert sich in Kürze. Dann sähe es so aus:
Quelle: Download: 5,0Mbit/s Upload:900kbit/s
Ziel: Download: 25Mkbit/s Upload:2,5Mbit/s


Nun meine Frage:
Warum das Problem in Szenario 2?
Liegt es an der Größe der TrueCrypt-Datei?
Liegt es an der lamen Verbindung?
Hat jemand Erfahrung mit so großen TrueCryp-Containern?

Vielen Dank,
Gruß Sam


# Config
$global:config = @{}
$config.networkpath = "\\192.168.0.1\Freigabe"
$config.networkuser = "NAS-USER"
$Config.networkpassword = Get-Content ("C:\Passwort_Netzlaufwerk.txt") | ConvertTo-SecureString
$config.truecryptfile = "TRUECRYPTFILE.tc"
$config.truecryptpassword = Get-Content ("C:\Passwort_TrueCrypt.txt") | ConvertTo-SecureString

$global:job = @{}
$job.quelle = @("C:\Test","C:\Test2")
$job.parameter = "/mir /w:0 /r:0 /np /tee"





clear-host
# ==============================================================================================================================================================
# Deklarationen
$config.network_cred = New-Object System.Management.Automation.PSCredential($config.networkuser, $Config.networkpassword)
$config.truecrypt_cred = New-Object System.Management.Automation.PSCredential("Dummy", $Config.truecryptpassword)

# Funktionen
Function Get-NextFreeDriveletter {
    $AtoZ = "HIJKLMNOPQRSTUVWXYZ"
    $DriveLetters = Get-PSDrive -PSProvider 'FileSystem' | ForEach-Object {
        $_.Name
    }
    for($i=0; $i -le $AtoZ.length -1; $i++) {
        If ($DriveLetters -notcontains $AtoZ[$i]) {
            Return $AtoZ[$i]+":"
        }
    }
}
function Connect-Share {
    param(
        [String]$DriveName,
        [String]$ShareName,
        [Object]$Credential,
        [String]$DisplayName
    )
    $RegEntry = $ShareName.replace("\","#")
    $RegPath = $("Registry::HKCU\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\EXPLORER\MOUNTPOINTS2\$RegEntry")
    $MyDrive = $DriveName + "\"

    # Netzlaufwerk frei machen
    if((test-path $DriveName) -eq $true) {
        Start-Process -FilePath cmd -ArgumentList "/c net use /d $DriveName /yes >nul" -wait -NoNewWindow | Out-Null
        sleep -m 500
        $tmp = test-path $DriveName
        if($tmp -ne $true) { 
            write-host -ForegroundColor green "... Laufwerk erfolgreich frei gemacht: $DriveName"
        } else { 
            write-host -ForegroundColor red   "... Laufwerk konnte nicht frei gemacht werden: $DriveName"
            return
        }
    }
    
    # Registry Displayname löschen
    if((test-path $RegPath) -eq $true) {
        remove-item -Path $RegPath -Recurse
    }

    # Credentials zerlegen
    $Cred = [System.Management.Automation.PSCredential]$Credential
    $Password = $Cred.GetNetworkCredential().Password
    $UserName = $Cred.UserName
    
    # Share Verbinden    
    $P = Start-Process -Filepath cmd -ArgumentList "/c net use $DriveName $ShareName $Password /user:$UserName /p:no >nul" -Wait -PassThru -NoNewWindow
    sleep -m 500
    if ($P.ExitCode -eq 0) { 
        write-host -ForegroundColor green "... Laufwerk erfolgreich angebunden: $Displayname ($DriveName)"
        # Registry Displyname schreiben
        New-Item -Path $RegPath -Force | Out-Null
        New-ItemProperty -Path $RegPath -Name "_LabelFromReg" -PropertyType String -Value $Displayname -Force | Out-Null
    } else { 
        write-host -ForegroundColor red   "... Laufwerk konnte nicht angebunden werden: $Displayname ($DriveName)"
    }
}
function Disconnect-Share {
    param(
        [String]$DriveName,
        [String]$ShareName
    )
    $RegEntry = $ShareName.replace("\","#")
    $RegPath = $("Registry::HKCU\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVERSION\EXPLORER\MOUNTPOINTS2\$RegEntry")
    $MyDrive = $DriveName + "\"

    # Netzlaufwerk frei machen
    if(test-path $MyDrive) {
        Start-Process -FilePath cmd -ArgumentList "/c net use /d $DriveName /yes >nul" -wait -NoNewWindow
        sleep -m 500
        $tmp = test-path $DriveName
        if($tmp -ne $true) { 
            write-host -ForegroundColor green "... Laufwerk erfolgreich getrennt. ($DriveName)"
        } else { 
            write-host -ForegroundColor red   "... Laufwerk konnte nicht getrennt werden. ($DriveName)"
        }
    }
    
    # Registry Displayname löschen
    if((test-path $RegPath) -eq $true) {
        remove-item -Path $RegPath -Recurse
    }
}
# ==============================================================================================================================================================
# Programmablauf
    $starttime = date

# Netzlaufwerk verbinden
    $MyNetworkDrive = Get-NextFreeDriveletter
    write-host "Netzlaufwerk:"
    Connect-Share -DriveName $MyNetworkDrive -ShareName $config.networkpath -DisplayName "EXT_BACKUP" -Credential $config.network_cred


# TrueCrypt ankoppeln
    $MyTrueCryptDrive = Get-NextFreeDriveletter
    write-host "TrueCrypt:"

    $TrueCryptFile = $MyNetworkDrive + "\" + $config.truecryptfile
    Start-Process -FilePath cmd -ArgumentList "/c ""C:\Program Files\TrueCrypt\TrueCrypt.exe"" $TrueCryptFile /l $MyTrueCryptDrive /p $($config.truecrypt_cred.GetNetworkCredential().password) /a /q" -wait -NoNewWindow   
    $tmp = Test-Path $MyTrueCryptDrive
    if($tmp -eq $true) {
        write-host -ForegroundColor green "... Container erfolgreich gemountet. ($MyTrueCryptDrive)"

# Backup
        write-host -ForegroundColor yellow "Do Backup-Job ..."
        $job.quelle | foreach {
            $quelle = $_
            $ziel = "$MyTrueCryptDrive$($_.remove(0,2).trim())"
            write-host -ForegroundColor yellow "Quelle: $quelle"
            write-host -ForegroundColor yellow "Ziel: $ziel"
            Start-Process -FilePath cmd -ArgumentList "/c robocopy.exe ""$quelle"" ""$ziel"" $($job.parameter)" -wait -NoNewWindow 
            write-host ""
            write-host ""
        }
      

# TrueCrypt abkoppeln
        write-host "TrueCrypt:"
        Start-Process -FilePath cmd -ArgumentList "/c ""C:\Program Files\TrueCrypt\TrueCrypt.exe"" /d $MyTrueCryptDrive /f /q" -wait -NoNewWindow
        $tmp = Test-Path $MyTrueCryptDrive
        if($tmp -eq $false) {
            write-host -ForegroundColor green "... Container erfolgreich dismountet. ($MyTrueCryptDrive)"
        } else {
            write-host -ForegroundColor red "... Container konnte nicht dismountet werden. ($TrueCryptFile)"
        } 
 
 
    } else {
        write-host -ForegroundColor red "... Container konnte nicht gemountet werden. ($TrueCryptFile)"
    }


# Netzlaufwerk trennen
write-host "Netzlaufwerk:"
Disconnect-Share -DriveName $MyNetworkDrive -ShareName $config.networkpath


# Ausgabe
$endtime = date
$time = $endtime - $starttime
write-host ""
write-host ""
write-host -ForegroundColor Cyan "Laufzeit ($endtime): $($time.Hours)h:$($time.Minutes)m:$($time.Seconds)s:$($time.Milliseconds)ms"
Start-Sleep -s 30

Content-ID: 272773

Url: https://administrator.de/contentid/272773

Ausgedruckt am: 22.11.2024 um 07:11 Uhr

kaiand1
kaiand1 23.05.2015 um 21:26:58 Uhr
Goto Top
Moin
Nun das Hauptptoblem ist erstmal dein Uploadspeed auf jeder Seite.
Da werden beim Mounten sowie danach etliche Daten gesendet was einiges an Zeit kostet.
Dazu wenn der Container eingebunden ist checkt Windows ja auch nochmal kurz ob da ein Datenträger Fehler vorhanden ist sowie beim Öffnen der Virenscanner die ganzen Daten sowie Vorschaufunktion für Bilder ect.
Da kommen ne Menge Daten zustande was bei einem kleinen Uploadspeed einiges Dauert. Dazu kann immer dein Container Beschädigt werden da Schreibprozesse bei Unterbrochende Verbindung Schädlich ist und dadurch ggfs den ganzen Container verlierst.
Und Passwort in ner Datei zu haben ist auch nicht Sinnvoll face-smile
Da währe es schon was besser zb ein Raspberry zu nehmen und darüber den Container zu Mounten und per VPN oder SSH Verbinden und die Daten schicken.
Damit würde der Transfer der Daten auch einiges Schneller gehen.
Die Fritte mag zwar einiges Anbieten aber manche Sachen sind nicht wirklich sinvoll damit zu machen...
SamTrex
SamTrex 23.05.2015 um 22:21:20 Uhr
Goto Top
Danke für Deinen schnellen Kommentar.
Ich hatte es befürchtet .....
Kurz zu den Passwörtern: Es steht kein Passwort in der Textdatei. Sondern ein SecureString der via PS generiert wurde und meines Wissens auch nur mit dem Benutzerkonto entschlüsselt werden kann welches ihn erzeugt hat. Sollte ich mich hier irren belehre mich bitte. Im Fall des TrueCrypt-Passwortes ist es genauso, nur kann ich das Passwort nicht als Credential an die CMD übergeben face-sad daher die Krucks das Passwort in Klartext anzuhängen....

Wenn ich Deinen Vorschlag richtig verstehe:
Ein Pi mit der TrueCryptplatte an das Netz der entfernten Box und dahin sichern.
Geht besser weil der Pi sich um den Container kümmer.

Korrekt?

Gruß Sam
kaiand1
kaiand1 23.05.2015 um 22:47:18 Uhr
Goto Top
Das mit dem Passwort bzw dein Code hab ich nur überflogen und mir die Zeile mit der Passwortdatei war halt am "Blinken" *g*
Der Raspberry ist ja ein PC wenn auch ein kleiner und nicht unbedingt so Leistungsstark aber da währe es besser die Platte zu Mounten.
Aber je nach Verschlüsselung kann es schon den Prozessor Überlasten aber die neuen Versionen Raspberry 2 oder BananaPI, CubbieBoard und was es da noch so gibt reichen zumindes für die normale AES aus.
Aber Speed solltes du nicht unbedingt erwarten damit aber dies dürfte bei dem kleinen Upload eh nicht so groß ins gewicht fallen.
Alternativ währe ja auch ein kleines sparsames NAS System wodu eine stärkere Verschlüsselung machen kannst sowie auch gleich ein RAID sowie Backups machen kannst.
Wenn aber viele Daten gesichert werden bzw Übertragen währe Lokal ein System vorteilhafter.
ggfs mal im Umfeld nachfragen ob einer nen Raspberry zum Testen hat.
Lochkartenstanzer
Lochkartenstanzer 24.05.2015 um 14:26:32 Uhr
Goto Top
Moin,

Wie der Kollege schon sagte. Truecrypt über dünne Leitungen hindurch auf einem windows-rchner zu mounten, dürfte eine sehr wacklige Angelegenheit sein.

Meine Empfehlung:

Stell auf der "Serrverseite" einen Mini-Serer hin, der die ganze chose mit truecrypt und mounten abwickelt. Das kann ein RasPi sein, oer auch ein kleiner x86-Server.

Du machst dann einfach eine VPn-verbindung zu diesem Server udn schaufelst dann die daten durch dieses VPN durch auf den Server. Je nachdem wie kritisch Du es siehst, kannst Du das VPN entweder auf der fritzbox oder auf Deinem Server terminieren.

das dürfte deutlich performanter udn stabiler sein, als ein Blockdevice über eine dünne Internet-leitung zu mounten.

lks
SamTrex
SamTrex 29.05.2015 um 10:47:28 Uhr
Goto Top
Hallo zusammen, danke nochmal für die Anregungen.
Eine kleine Erklärung noch:
Ich betreibe im Heimnetz einen Windowsserver 2008. Darauf habe ich 2 Platten als Raid 1 - da speichere ich wichtige Daten. Die ganz wichtigen Daten werden täglich auf eine weitere Platte im selben Server gesichert. Zusätzlich sichere ich das Raid ca. 1x pro Monat auf eine externe Festplatte (manuell). Allerdings liegen alle Platten in unserer Wohnung. Mein Ziel ist es eine Sicherung außer Haus zu haben. Die Menge an Daten die täglich gesichert werden würde ist minimal und da das Ganze nachts läuft ist mir die Dauer auch relativ egal.

Einen RasPi habe ich schon. Ich werde mich einmal damit auseinander setzten und später noch einmal berichten. Ich hätte nicht gedacht das das Mounten übers Netz so viele Probleme macht. Mein ursprünglicher Gedanke war das ja die Fritzbox nicht mehr zu tun hat als den Speicher anbinden.....

In diesem Sinne: Vielen Dank nochmal und ich werde berichten.
Lochkartenstanzer
Lochkartenstanzer 29.05.2015 um 10:55:51 Uhr
Goto Top
Zitat von @SamTrex:

Ich hätte nicht gedacht das das Mounten übers Netz so viele Probleme macht.

Die meisten Protokolle für's mounten übers Netzwerk sind für das LAN ausgelegt, wo man deutlich stabilere Verbindungen und höhere Datendurchsätze hat als über Weitverkehrsverbindungen.

daher funktionieren diese auch nciht imemr stabil, wenn man WAN statt LAN einsetzt.

lks

PS: Die schwachbrüstige Fritzbox wird auch noch Ihren Beitrag dazu leisten.
kaiand1
kaiand1 29.05.2015 um 10:56:30 Uhr
Goto Top
Nun das mounten an sich is ja nix schweres.
Jedoch die Art des Devices spielt ne Rolle sowie die Bandbreite die vorhanden ist (Senden/Empfangen).
Und es muss immer mal mit dem Unterbrechen der Internetleitung gerechnet werden aus welchen Gründen auch immer.
Nur son Blockdevice ist da halt Empfindlicher was die Unterbrechung angeht..
Da ist halt eine Verschlüsselte Verbindung zum Datenabgleich doch besser und kann bei Probleme neu gestartet werden...
SamTrex
SamTrex 02.06.2015 um 11:09:52 Uhr
Goto Top
Alles klar.
Da bin ich nun wieder ein gutes Stück schlauer. Vielen Dank!
Und wie gesagt, ich werde berichten. Allerdings wird das noch ein paar Wochen dauern ...