zfs send/receive mittels Netcat

Posted by on 09 May 2020 | Tagged as: Benutzer

Ich habe seit kurzem ein Problem mit OpenSSH. Wenn ich grosse ZFS Datensets übertragen will spuckt OpenSSH nur noch Fehler aus:

ssh_dispatch_run_fatal: Connection to x.x.x.x port 22: message authentication code incorrect

Da ich ein 3.5TB Datenset übertragen musste, war das natürlich suboptimal. Gelöst habe ich es schliesslich mit Netcat.

Mit Netcat kann Standardeingaben und -ausgaben übers Netzwerk transportieren. Im Gegensatz zu SSH greift es auf keine Verschlüsselung zu. Innerhalb eines Netzwerks ist das als nur empfohlen, wenn man sicher ist, keine anderen Zuhöhrer zu haben oder wenn eine gesicherte Verbindung anderweitig besteht.

In meinem Fall habe ich das dann über einen Wireguard-Tunnel laufen lassen.

Auf dem empfangenden System habe ich zuerst einen Port freigeben müssen. Ich habe mit für Port 30003 entschieden. Da das empfangende System hinter einem NAT steckt und alle nicht designierten Ports ins Nirvana geleitet verden, sollte das akzeptabel sein.

nc -l 30003 | zfs receive pool/path/to/Dataset

Das ist eigentlich selbsterklärend. Netcat (nc) soll auf Port 30003 zuhören und dann alles an zfs receive weiterleiten.

Beim sendenden System habe ich folgendes verwendet:

zfs send -v pool/path/to/Dataset@snapshot | nc -w 1800 10.99.99.12 30003

zfs send habe ich mit einem -v versehen, damit ich den Fortschritt prüfen kann (über die Gigabitleitung hole ich tatsächlich fast vollen Speed heraus). Bei Netcat steht das -w dafür, wie lange es zuwarten soll wenn keine Daten mehr kommen. 5 Minuten sind wohl eher grosszügig. Je nachdem wie beschäftigt das System ist, sollte man mehr oder weniger nehmen. Dann ist 10.99.99.12 die Wireguard-VPN IP-Adresse des empfangenden Servers und dort soll es an Port 30003 senden.

Hier noch ein Auszug von dem, was das -v sagt:

16:27:20    104G   pool/path/to/Dataset@snapshot
16:27:21    104G   pool/path/to/Dataset@snapshot
16:27:22    104G   pool/path/to/Dataset@snapshot
16:27:23    104G   pool/path/to/Dataset@snapshot
16:27:24    104G   pool/path/to/Dataset@snapshot
16:27:25    104G   pool/path/to/Dataset@snapshot
16:27:26    104G   pool/path/to/Dataset@snapshot
16:27:27    104G   pool/path/to/Dataset@snapshot
16:27:28    104G   pool/path/to/Dataset@snapshot
16:27:29    104G   pool/path/to/Dataset@snapshot
16:27:30    105G   pool/path/to/Dataset@snapshot
16:27:31    105G   pool/path/to/Dataset@snapshot
16:27:32    105G   pool/path/to/Dataset@snapshot
16:27:33    105G   pool/path/to/Dataset@snapshot
16:27:34    105G   pool/path/to/Dataset@snapshot
16:27:35    105G   pool/path/to/Dataset@snapshot
16:27:36    105G   pool/path/to/Dataset@snapshot
16:27:37    105G   pool/path/to/Dataset@snapshot
16:27:38    105G   pool/path/to/Dataset@snapshot
16:27:39    105G   pool/path/to/Dataset@snapshot
16:27:40    105G   pool/path/to/Dataset@snapshot
16:27:41    105G   pool/path/to/Dataset@snapshot
16:27:42    105G   pool/path/to/Dataset@snapshot
16:27:43    106G   pool/path/to/Dataset@snapshot
16:27:44    106G   pool/path/to/Dataset@snapshot
16:27:45    106G   pool/path/to/Dataset@snapshot
16:27:46    106G   pool/path/to/Dataset@snapshot
16:27:47    106G   pool/path/to/Dataset@snapshot
16:27:48    106G   pool/path/to/Dataset@snapshot
16:27:49    106G   pool/path/to/Dataset@snapshot
16:27:50    106G   pool/path/to/Dataset@snapshot
16:27:51    106G   pool/path/to/Dataset@snapshot
16:27:52    106G   pool/path/to/Dataset@snapshot
16:27:53    106G   pool/path/to/Dataset@snapshot
16:27:54    107G   pool/path/to/Dataset@snapshot
16:27:55    107G   pool/path/to/Dataset@snapshot
16:27:56    107G   pool/path/to/Dataset@snapshot
16:27:57    107G   pool/path/to/Dataset@snapshot
16:27:58    107G   pool/path/to/Dataset@snapshot
16:27:59    107G   pool/path/to/Dataset@snapshot
16:28:00    107G   pool/path/to/Dataset@snapshot
16:28:01    107G   pool/path/to/Dataset@snapshot
16:28:02    107G   pool/path/to/Dataset@snapshot
16:28:03    107G   pool/path/to/Dataset@snapshot
16:28:04    107G   pool/path/to/Dataset@snapshot
16:28:05    107G   pool/path/to/Dataset@snapshot
16:28:06    108G   pool/path/to/Dataset@snapshot

 

Mein Fazit ist, dass dies hervorragend klappt. Wireguard hat sonst schon eine Supergeschwindigkeit (im Vergleich zu OpenVPN) und wenn noch SSH wegfällt, dann ists noch schneller. Aber eben, man muss darauf achten, dass der Transfer nicht abgeschnorchelt werden kann. Für daily business ist es mit SSH wohl einfacher, weil man da nicht noch etwas zuerst aufsetzen muss. Für grössere Datensets kann sich Netcat aber lohnen.

Comments are closed.