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
?
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.
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.
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
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
}
Pas essayé: mais on dirait que 'lighttpd' peut le faire pour vous: