![使用 socat 跨网络命名空间代理抽象命名空间 UNIX 套接字](https://linux22.com/image/783479/%E4%BD%BF%E7%94%A8%20socat%20%E8%B7%A8%E7%BD%91%E7%BB%9C%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%E4%BB%A3%E7%90%86%E6%8A%BD%E8%B1%A1%E5%91%BD%E5%90%8D%E7%A9%BA%E9%97%B4%20UNIX%20%E5%A5%97%E6%8E%A5%E5%AD%97.png)
我有一个系统服务,用于监听抽象命名空间中 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