linux - puertos - resultados de netstat
Redirigir el tráfico TCP a un socket de dominio UNIX bajo Linux (5)
Debería poder enlazar 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í hay una página web que podría ayudar: http://osr507doc.sco.com/en/netguide/dusockC.io_multiplexing.html
Supongamos que una aplicación Linux heredada escucha en un socket de dominio UNIX /tmp/foo
.
Además de comunicarme con esta aplicación heredada sobre el mecanismo de socket de dominio UNIX, deseo poder conectarme a ella a través de una conexión TCP en el puerto, por ejemplo, 1234.
¿Cuál es la forma más fácil de vincularse al puerto TCP 1234 y luego redirigir todas las conexiones entrantes al socket de dominio UNIX /tmp/foo
?
En adiciones a la answer de @knorv: con xinetd
puede funcionar como un daemon
# 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
}
Mas facil? Probablemente Netcat (aka nc
):
nc -l 1234 | nc -U /tmp/foo
El primer comando escucha en el puerto 1234 las conexiones entrantes y canaliza los datos resultantes al segundo comando. 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 obtener más conexiones, use la opción -k
:
nc -lk 1234 | nc -U /tmp/foo
Puede probar que esto está funcionando configurando un receptor para ese socket en un terminal:
nc -lUk /tmp/foo
Y escribiéndole en otro:
nc localhost 1234
socat , como recomienda knorv , es más capaz, pero más complicado de usar.
No lo intenté: pero parece que ''lighttpd'' puede hacer esto por usted:
Resulta que se puede usar socat 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 han sido probados y funcionan como se esperaba.