2010-01-27 14 views
34

Supongamos que una aplicación heredada de Linux está escuchando en un socket de dominio UNIX /tmp/foo.Redirigir el tráfico TCP a un socket de dominio UNIX bajo Linux

Además de comunicarse con esta aplicación heredada por el mecanismo de socket UNIX Quiero ser capaz de conectarse a él a través de una red TCP-conexión en el puerto 1234. decir

¿Cuál es la manera más fácil para unirse a TCP puerto 1234 y luego redirigir todas las conexiones entrantes al socket de dominio UNIX /tmp/foo?

Respuesta

49

Resulta que socat puede ser utilizado para lograr esto:

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

Y con un poco de seguridad adicional:

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

Estos ejemplos se han probado y funcionan como se esperaba.

+0

socat, netcat, de cualquier manera. ¡Incluso podría envolver 'stunnel' para obtener más niveles de complejidad! –

+0

Si alguien quiere usar eso para compartir el docker socket, debe eliminar '' 'su = nobody''' parte – Dmitriusan

+0

Para compartir el docker socket, simplemente dile al Docker daemon que escuche un puerto local pasando' -H tcp: //127.0.0.1: 4321' (tenga en cuenta que permite el acceso al daemon docker para cualquiera que pueda abrir una conexión a '127.0.0.1'. No hay cheques uid/gid ni nada, pero eso también es cierto para el' netcat'/'socat' approach) – svvac

3

Debería poder vincularse a TCP 1234, obtener un socket fd para/tmp/foo y usar la llamada de selección para 'escuchar' los datos tanto en 1234 como en/tmp/foo. Cualquier información escrita en 1234, usted reescribe a/tmp/foo y viceversa.

Ahora actúa como un proxy y transfiere datos hacia adelante y hacia atrás.

Y aquí es una página web que podría ayudar: http://osr507doc.sco.com/en/netguide/dusockC.io_multiplexing.html

17

¿Más fácil? Probablemente Netcat (también conocido como nc):

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

El primer comando escucha en el puerto 1234 para conexiones entrantes, y los tubos de los datos resultantes a la segunda orden. El segundo se conecta al socket de dominio Unix /tmp/foo y escribe su entrada en ese socket. Tenga en cuenta que esto solo aceptará una única conexión y saldrá tan pronto como se desconecte. Si desea seguir escuchando para más conexiones, utilice la opción -k:

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

usted puede probar que esto está funcionando mediante la creación de un oyente para ese socket en un terminal:

nc -lUk /tmp/foo 

Y la escritura a ella en otro:

nc localhost 1234 

socat, como recommended by knorv, es más capaz, pero más complicado de usar.

+0

parece que nc en ubuntu (quantal) no es compatible con los zócalos de Unix :( – gucki

+0

@gucki ¿Realmente no tiene la opción 'nc -U'? No tengo una máquina Quantal para probar, pero sí en Precise 'nc' tiene la opción' -U', y lo que dije en mi comentario funciona bien. ¿Has probado exactamente lo que escribí? Si no encuentras que 'nc' funciona para ti, recomendaría probar' socat' ; puede hacer mucho más que 'nc', con un control mucho más fino de cómo funciona, pero es un poco más complicado averiguar cómo usarlo. –

+1

Sí, acabo de volver a probar (netcat 1.10-40): 'nc -l 1234 | nc -U/tmp/foo' da' nc: opción inválida - 'U'' y 'nc -h para ayuda'.' socat' funciona bien :) – gucki

0

En additons a @ de answer knorv: con xinetd que puede funcionar como un demonio

# 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 
} 
Cuestiones relacionadas