【发布时间】:2011-01-10 02:39:44
【问题描述】:
假设有一个旧版 Linux 应用程序正在侦听 UNIX 域套接字 /tmp/foo。
除了通过 UNIX 域套接字机制与这个遗留应用程序通信之外,我还希望能够通过端口 1234 上的 TCP 连接连接到它。
绑定到 TCP 端口 1234 然后将所有传入连接重定向到 UNIX 域套接字/tmp/foo 的最简单方法是什么?
【问题讨论】:
标签: linux unix networking sockets tcp
假设有一个旧版 Linux 应用程序正在侦听 UNIX 域套接字 /tmp/foo。
除了通过 UNIX 域套接字机制与这个遗留应用程序通信之外,我还希望能够通过端口 1234 上的 TCP 连接连接到它。
绑定到 TCP 端口 1234 然后将所有传入连接重定向到 UNIX 域套接字/tmp/foo 的最简单方法是什么?
【问题讨论】:
标签: linux unix networking sockets tcp
原来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
这些示例已经过测试并按预期工作。
【讨论】:
stunnel 包裹起来以增加复杂性!
su=nobody 部分
-H tcp://127.0.0.1:4321 告诉 Docker 守护进程侦听本地端口(请注意,它允许任何可以打开到 @987654327 的连接的人访问 docker 守护进程@. 没有 uid/gid 检查或任何东西,但 netcat/socat 方法也是如此)
最简单?可能是 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
socat 和recommended by knorv 一样,功能更强大,但使用起来更复杂。
【讨论】:
nc -U 选项吗?我没有要测试的 Quantal 机器,但在 Precise nc 上有 -U 选项,我在评论中所说的效果很好。你试过我写的吗?如果您发现nc 不适合您,我建议您尝试socat;它可以比nc 做更多的事情,对它的工作方式进行更细粒度的控制,但要弄清楚如何使用它有点复杂。
nc -l 1234 | nc -U /tmp/foo 给出了nc: invalid option -- 'U' 和nc -h for help。 socat 工作正常 :)
netcat-traditional 和 netcat-openbsd。 netcat-openbsd 是我安装的,似乎比netcat-traditional 有更多的功能。您可以同时安装它们,nc 和 netcat 符号链接到一个或另一个。
socat,它将把响应转发回给我们。
您应该能够绑定到 TCP 1234,为 /tmp/foo 获取套接字 fd,并使用 select 调用来“侦听”1234 和 /tmp/foo 上的数据。任何写入 1234 的数据,您都重写为 /tmp/foo,反之亦然。
您现在充当代理并来回传输数据。
这里有一个可能有帮助的网页:http://osr507doc.sco.com/en/netguide/dusockC.io_multiplexing.html
【讨论】:
除了@knorv 的answer:加上xinetd,它可以像守护进程一样工作
# 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
}
【讨论】:
没有尝试过:但看起来 'lighttpd' 可以为你做到这一点:
【讨论】: