在Linux下将TCP流量重定向到UNIX域套接字

时间:2010-01-27 19:01:44

标签: linux unix networking sockets tcp

假设一个旧的Linux应用程序正在侦听UNIX域套接字/tmp/foo

除了通过UNIX域套接字机制与这个遗留应用程序通信之外,我希望能够通过端口1234上的TCP连接来连接它。

绑定到TCP端口1234然后将所有传入连接重定向到UNIX域套接字/tmp/foo的最简单方法是什么?

5 个答案:

答案 0 :(得分:56)

结果socat可用于实现此目的:

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

并增加了一点安全性:

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

这些示例已经过测试并按预期工作。

答案 1 :(得分:19)

最简单的?可能是Netcat(又名nc):

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

第一个命令在端口1234上侦听传入连接,并将结果数据传递给第二个命令。第二个连接到Unix域套接字/tmp/foo,并将其输入写入该套接字。请注意,这只接受单个连接,并在删除该连接后立即退出。如果您想继续侦听更多连接,请使用-k选项:

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

您可以通过在一个终端中为该套接字设置侦听器来测试这是否有效:

nc -lUk /tmp/foo

在另一个人写信:

nc localhost 1234

socatrecommended by knorv,更有能力,但使用起来更复杂。

答案 2 :(得分:3)

您应该能够绑定到TCP 1234,获取/ tmp / foo的套接字fd并使用select调用'listen'来获取1234和/ tmp / foo上的数据。写入1234的任何数据,你重写为/ tmp / foo,反之亦然。

您现在充当代理并来回传输数据。

这是一个可能有用的网页:http://osr507doc.sco.com/en/netguide/dusockC.io_multiplexing.html

答案 3 :(得分:0)

没试过:但看起来'lighttpd'可以为你做到这一点:

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

答案 4 :(得分:0)

另外@ knorv的answerxinetd它可以像守护进程一样工作

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