web-dev-qa-db-fr.com

Redirection du trafic TCP vers un socket de domaine UNIX sous Linux

Supposons qu'une application Linux héritée écoute sur un socket de domaine UNIX /tmp/foo.

En plus de la communication avec cette application héritée via le mécanisme de socket de domaine UNIX, je souhaite pouvoir me connecter via une connexion TCP sur le port, par exemple 1234.

Quel est le moyen le plus simple de se lier au TCP port 1234, puis de rediriger toutes les connexions entrantes vers le socket de domaine UNIX /tmp/foo?

34
knorv

Il s'avère que socat peut être utilisé pour y parvenir

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

Et avec un peu de sécurité supplémentaire:

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

Ces exemples ont été testés et fonctionnent comme prévu.

53
knorv

Plus facile? Probablement Netcat (aka nc ):

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

La première commande écoute les connexions entrantes sur le port 1234 et dirige les données résultantes vers la deuxième commande. Le second se connecte au socket de domaine Unix /tmp/foo et écrit son entrée dans ce socket. Notez que cela n'acceptera qu'une seule connexion et se terminera dès que cette connexion sera abandonnée. Si vous souhaitez continuer à écouter davantage de connexions, utilisez l'option -k:

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

Vous pouvez vérifier que cela fonctionne en configurant un écouteur pour ce socket dans un terminal:

nc -lUk /tmp/foo

Et en lui écrivant dans un autre:

nc localhost 1234

socat , comme recommandé par knorv , est plus capable, mais plus compliqué à utiliser.

18
Brian Campbell

Vous devriez pouvoir vous lier à TCP 1234, obtenir un fd de socket pour/tmp/foo et utiliser l'appel de sélection pour "écouter" les données sur 1234 et/tmp/foo. Toutes les données écrites dans 1234 sont réécrites dans/tmp/foo et inversement.

Vous agissez maintenant en tant que proxy et transférez les données dans les deux sens.

Et voici une page Web qui pourrait vous aider: http://osr507doc.sco.com/fr/netguide/dusockC.io_multiplexing.html

3
Aryabhatta

En plus de @ knorv's answer : with xinetd cela peut fonctionner comme un démon

# 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

Pas essayé: mais on dirait que 'lighttpd' peut le faire pour vous:

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

0
monojohnny