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

kno*_*orv 37 unix sockets linux networking tcp

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

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

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

kno*_*orv 56

原来socat可以用来实现这个目的:

socat TCP-LISTEN:1234,reuseaddr,fork UNIX-CLIENT:/tmp/foo
Run Code Online (Sandbox Code Playgroud)

并增加了一点安全性:

socat TCP-LISTEN:1234,bind=127.0.0.1,reuseaddr,fork,su=nobody,range=127.0.0.0/8 UNIX-CLIENT:/tmp/foo
Run Code Online (Sandbox Code Playgroud)

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


Bri*_*ell 21

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

nc -l 1234 | nc -U /tmp/foo
Run Code Online (Sandbox Code Playgroud)

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

nc -lk 1234 | nc -U /tmp/foo
Run Code Online (Sandbox Code Playgroud)

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

nc -lUk /tmp/foo
Run Code Online (Sandbox Code Playgroud)

并在另一个写入它:

nc localhost 1234
Run Code Online (Sandbox Code Playgroud)

socor,如knorv推荐,更有能力,但使用起来更复杂.

  • 这种方法的问题在于生成的管道是单向的.如果我们期望来自侦听unix-domain套接字的进程的响应,通过TCP套接字进行通信的唯一方法是`socat`,它会将响应转发给我们. (3认同)
  • @gucki看起来Ubuntu上有两个nc包.`netcat-traditional`和`netcat-openbsd`.`netcat-openbsd`是我安装的,似乎比`netcat-traditional`有更多的功能.您可以同时安装它们,将`nc`和`netcat`符号链接到其中一个. (2认同)