使用 socat 跨网络命名空间代理抽象命名空间 UNIX 套接字

使用 socat 跨网络命名空间代理抽象命名空间 UNIX 套接字

我有一个系统服务,用于监听抽象命名空间中 UNIX 域套接字上的命令。我现在需要从另一个网络命名空间中的进程访问它。由于套接字位于抽象命名空间中,因此它是特定于网络命名空间的。

我可以通过 socat 来实现这一点:

socat ABSTRACT-CONNECT:@proxy-socket EXEC:'"ip netns exec my-netns socat STDIO ABSTRACT-LISTEN:@proxy-socket,nofork"'

这可以正确监听我命名空间中的套接字,并将连接代理到默认命名空间中的实际套接字。但它只会针对一个连接执行此操作;一旦该连接关闭,socat 将退出。

我可以这样做:

socat ABSTRACT-LISTEN:@prooy-socket,fork EXEC:'"ip netns exec default socat STDIO ABSTRACT-CONNECT @proxy-socket,nofork"'

如果ip netns exec提供了一种在默认命名空间中执行进程的方法,但似乎没有。

有没有更好的方法可以解决这个问题?

答案1

如果不使用EXEC目标socat,而是仅使用共享文件系统位置和 unix 套接字,会怎样?

例如,如果我有两个网络命名空间:

ip netns add red
ip netns add blue

还有一个抽象套接字监听red

while :; do date; sleep 1; done |
ip netns exec red socat abstract-listen:@example,fork -

我可以运行一个代理,将抽象套接字连接到共享文件系统位置中的 unix 套接字:

ip netns exec red socat \
  abstract-connect:@example unix-listen:/tmp/socket,fork

然后在blue命名空间中我可以将该 unix 套接字代理到抽象套接字:

ip netns exec blue socat \
  unix-connect:/tmp/socket abstract-listen:@example,fork

现在我可以连接到命名空间中的抽象套接字blue,并看到流入命名空间中的抽象套接字的数据red

$ ip netns exec blue socat abstract-connect:@example -
Sun Jan 29 09:45:42 AM EST 2023
Sun Jan 29 09:45:43 AM EST 2023
Sun Jan 29 09:45:44 AM EST 2023

相关内容