socat mit exec (gzip <--> gunzip)

Einrichten des lokalen Netzes, Verbindung zu anderen Computern und Diensten.
Antworten
Benutzeravatar
mistersixt
Beiträge: 6601
Registriert: 24.09.2003 14:33:25
Lizenz eigener Beiträge: GNU Free Documentation License

socat mit exec (gzip <--> gunzip)

Beitrag von mistersixt » 27.11.2017 14:56:27

Moin moin,

ich habe eine Serverdienst, der "entfernt" auf einem Listening-Port lauscht, sagen wir mal TCP/10000. Ein Client verbindet sich an diesen TCP-Port, so dass Daten bidirektional transferiert werden. Nun möchte ich diesen TCP-Strom durch ein gzip/pigz leiten, so dass auf beiden Seiten der Traffik transparent komprimiert/dekomprimiert wird. Also dachte ich, ich nehmen socat und gzip/gunzip mittels exec, und zwar auf dem Client beispielsweise:

Code: Alles auswählen

socat -d -d TCP4-LISTEN:12345,reuseaddr,fork 'exec:/bin/gunzip!!exec:/bin/gzip|tcp:ziel:12345'
Und auf dem Zielrechner:

Code: Alles auswählen

socat -d -d TCP4-LISTEN:12345,reuseaddr,fork 'exec:/bin/gzip!!exec1:/bin/gunzip|tcp:localhost:10000'
Wenn ich aber nun meine Client-Software auf dem Client an localhost:12345 verbinde, spuckt das socat direkt aus:

Code: Alles auswählen

...
2017/11/27 14:44:06 socat[15675] E "exec:/bin/gzip|tcp": wrong number of parameters (3 instead of 1)
2017/11/27 14:44:06 socat[15675] N exit(1)
2017/11/27 14:44:06 socat[15643] N childdied(): handling signal 17
2017/11/27 14:44:06 socat[15643] W waitpid(): child 15675 exited with status 1
2017/11/27 14:44:06 socat[15676] N execvp'ing "/bin/gunzip"
gzip: compressed data not read from a terminal. Use -f to force decompression.
For help, type: gzip -h
Der kommt also noch nicht mal dazu, sich an den socat des Zielrechners zu verbinden.

Jemand eine Idee, wie das funktioniert? Version ist socat 1.X aus Stretch. Oder weiss Jemand ein alternatives Tool (ausser SSH w/ zlib)?

Gruss, mistersixt.
--
System: Debian Bookworm, 6.5.x.-x-amd64, ext4, AMD Ryzen 7 3700X, 8 x 4.0 Ghz., Radeon RX 5700 XT, 16 GB Ram, XFCE

wanne
Moderator
Beiträge: 7462
Registriert: 24.05.2010 12:39:42

Re: socat mit exec (gzip <--> gunzip)

Beitrag von wanne » 30.11.2017 15:17:07

Zuerstmal per ncat. ICh übersetze das später in socat.
Server:

Code: Alles auswählen

cat | gzip | ncat -l 1234 | gunzip
Client:

Code: Alles auswählen

cat | gzip | ncat ::1 1234 | gunzip
Problem bei dem ganzen bleibt, dass gzip zuerst komprimiert und dann den gesamten output outputtet. Sprich erst wenn du den Server/Client beendest werden die Daten gesendet.

statt gzip könnte man xz nutzen. Das hat die Option. --flush-timeout=. Leider funktioniert die noch nicht beim dekomprimieren. Wenn die da auch kommt, könntest du das nehmen.

Du kannst dir durch sowas auch den puffer aus gzip rausnehmen:

Code: Alles auswählen

while true; do line | gzip; done | ncat ::1 1234
Das Problem bleibt aber, dass gunzip erst output schmeißt, wenn es das letzte byte gelesen hat.
rot: Moderator wanne spricht, default: User wanne spricht.

wanne
Moderator
Beiträge: 7462
Registriert: 24.05.2010 12:39:42

Re: socat mit exec (gzip <--> gunzip)

Beitrag von wanne » 30.11.2017 15:53:48

In älteren Installationen könnte sowas noch funktionieren.
Leider unterstützen aktuelle openssl-Verionen keine Kompression und keine unverschlüsselten Verbindungen mehr.

Code: Alles auswählen

socat openssl-listen:443,pf=ip6,reuseaddr,fork,cipher=aNULL,verify=0,compress=auto,method=ssl3 STDIO

Code: Alles auswählen

socat stdio openssl-connect:[::1]:443,verify=0,cipher=aNULL,method=ssl3,compress=auto
Das würde noch funktionieren, komprimeirt aber auch nicht mehr weil openssl eben keine Kompression mehr macht.

Code: Alles auswählen

socat openssl-listen:443,pf=ip6,reuseaddr,fork,cert=server.pem,verify=0,compress=auto,method=tls1 STDIO

Code: Alles auswählen

socat stdio openssl-connect:[::1]:443,verify=0,cert=client.pem,method=tls1,compress=auto
rot: Moderator wanne spricht, default: User wanne spricht.

Antworten