it-swarm.com.de

Umleitung des TCP-Verkehrs auf einen UNIX-Domänensocket unter Linux

Angenommen, eine ältere Linux-Anwendung, die auf einem UNIX-Domänensockel /tmp/foo hört.

Zusätzlich zur Kommunikation mit dieser älteren Anwendung über den UNIX-Domain-Socket-Mechanismus möchte ich eine Verbindung über eine TCP-Verbindung mit dem Port 1234 herstellen können.

Was ist der einfachste Weg, um an TCP Port 1234 zu binden und dann alle eingehenden Verbindungen an den UNIX-Domänensocket /tmp/foo umzuleiten?

34
knorv

Es stellt sich heraus, dass socat dazu verwendet werden kann:

socat TCP-LISTEN:1234,reuseaddr,fork UNIX-CLIENT:/tmp/foo

Und mit ein bisschen mehr Sicherheit:

socat TCP-LISTEN:1234,bind=127.0.0.1,reuseaddr,fork,su=nobody,range=127.0.0.0/8 UNIX-CLIENT:/tmp/foo

Diese Beispiele wurden getestet und funktionieren wie erwartet.

53
knorv

Am einfachsten Wahrscheinlich Netcat (aka nc ):

nc -l 1234 | nc -U /tmp/foo

Der erste Befehl überwacht Port 1234 auf eingehende Verbindungen und leitet die resultierenden Daten an den zweiten Befehl weiter. Der zweite verbindet sich mit dem Unix-Domänensocket /tmp/foo und schreibt seine Eingabe in diesen Socket. Beachten Sie, dass dies nur eine einzelne Verbindung akzeptiert und beendet wird, sobald diese Verbindung getrennt wird. Wenn Sie ständig nach weiteren Verbindungen suchen möchten, verwenden Sie die Option -k:

nc -lk 1234 | nc -U /tmp/foo

Sie können testen, ob dies funktioniert, indem Sie einen Listener für diesen Sockel in einem Terminal einrichten:

nc -lUk /tmp/foo

Und in einem anderen schreiben:

nc localhost 1234

socat , wie von knorv empfohlen, ist zwar fähiger, aber komplizierter zu bedienen.

18
Brian Campbell

Sie sollten in der Lage sein, sich an TCP 1234 zu binden, einen Socket fd für/tmp/foo zu erhalten und den select-Aufruf zum 'Abhören' von Daten auf 1234 und/tmp/foo zu verwenden. Alle Daten, die in 1234 geschrieben wurden, schreiben Sie in/tmp/foo und umgekehrt.

Sie fungieren jetzt als Proxy und übertragen Daten hin und her.

Und hier ist eine Webseite, die helfen könnte: http://osr507doc.sco.com/de/netguide/dusockC.io_multiplexing.html

3
Aryabhatta

In Ergänzung zu @ knorv answer : mit xinetd kann es wie ein Daemon funktionieren

# cat /etc/xined.d/mysrv
service mysrv
{
 disable = no
 type = UNLISTED
 socket_type = stream
 protocol = tcp
 wait = no
 server = /usr/bin/socat
 server_args = STDIN UNIX-CLIENT:/tmp/mysocket.sock
 bind = 127.0.0.1
 port = 1234
}
0
hloroform

Nicht ausprobiert: Es sieht so aus, als ob 'lighttpd' das für Sie tun kann:

http://redmine.lighttpd.net/wiki/lighttpd/Docs:ModProxyCore

0
monojohnny