Using netcat to pipe unix socket to tcp socket

crashandburn picture crashandburn · Aug 21, 2014 · Viewed 8.8k times · Source

I am trying to expose a unix socket as a tcp socket using this command:

nc -lkv 44444 | nc -Uv /var/run/docker.sock

When I try to access localhost:44444/containers/json from a browser, it doesn't load anything but keeps the connection open (the loading thingy keeps spinning), but the console (because of the -v flag) shows proper http response.

Any ideas on how to get this working?

PS: I know I can use socat, or just tell docker to also listen on a tcp socket, but I am using the project atomic vm image, and it won't let me modify anything except /home.

Answer

pqnet picture pqnet · Aug 21, 2014

You are only redirecting incoming data, not outgoing data. try with:

mkfifo myfifo
nc -lkv 44444 <myfifo | nc -Uv /var/run/docker.sock >myfifo

See http://en.wikipedia.org/wiki/Netcat#Proxying

Edit: in a script you would want to generate the name for the fifo at random, and remove it after opening it:

FIFONAME=`mktemp -u`
mkfifo $FIFONAME
nc -lkv 44444 < $FIFONAME | nc -Uv /var/run/docker.sock > $FIFONAME &
rm $FIFONAME
fg