与网络命名空间中的 D-Bus 连接

Lek*_*eyn 7 d-bus network-namespaces unix-sockets

我正在使用网络命名空间,以便我可以捕获单个进程的网络流量。命名空间通过 veth 对通过“主机”连接,并通过 NAT 进行网络连接。到目前为止,这适用于 IP 流量和命名的 Unix 域套接字。

当程序需要与 D-Bus 会话总线通信时,就会出现问题。D-Bus 守护进程侦听此环境变量指定的抽象套接字:

DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-jIB6oAy5ea,guid=04506c9a7f54e75c0b617a6c54e9b63a
Run Code Online (Sandbox Code Playgroud)

看来抽象 Unix 域套接字命名空间在命名空间中是不同的。有没有办法从网络命名空间访问这个 D-Bus 会话?

int*_*ika 6

Linux 网络命名空间 ip-netns确实分离了 unix 套接字,当 dbus 使用它时,就无法从新的命名空间访问它,我们可以想象一个功能可以保留对 unix 套接字的访问,但截至 05/2019 尚未实现。Unix 套接字可以通过以下方式观看netstat -a -p --unix

使用代理 dbus 套接字的替代解决方案socat,此答案此处详细介绍

替代解决方案取决于与 dbus 所需的通信,可以使用dbus-launch从命名空间内部创建新的会话总线实例,请dbus-launch my-command-or-app注意,可以使用其他方法,例如dbus-run-session

替代解决方案 netns-exec可以在没有 root 访问权限的命名空间上运行应用程序/命令(类似于firejail可以执行的操作),但它也可以像第一个解决方案一样以自动化方式代理 dbus socat,并且无需 root 访问权限。

替代解决方案 xdg-dbus-proxy也可以在没有 root 的情况下完成这项工作,并具有许多附加选项(例如过滤)...如果您想允许访问单个 dbus 位置,这可能是有关安全性的最佳选择,该应用程序开始分布在主要发行版,因为它是 firejail 的一部分,因此可能不需要从源代码构建,可以在此处找到手册页,或者man xdg-dbus-proxy如果安装了应用程序,则以下是如何使用它:

在主机上:xdg-dbus-proxy $DBUS_SESSION_BUS_ADDRESS /tmp/proxybus xdg-dbus-proxy $DBUS_SESSION_BUS_ADDRESS /tmp/proxybus --filter --talk=org.foo.bar --see=org.gtk.* --own=org.my.name

在命名空间上:DBUS_SESSION_BUS_ADDRESS=unix:path=/tmp/proxybus app-using-dbus


Lek*_*eyn 5

连接到侦听不同网络命名空间中的抽象 Unix 套接字的 DBus 守护程序是不可能的。ss -x可以通过包含以下内容的地址来识别此类地址@

u_str  ESTAB      0      0      @/tmp/dbus-t00hzZWBDm 11204746              * 11210618           
Run Code Online (Sandbox Code Playgroud)

作为解决方法,您可以创建一个非抽象 Unix 或 IP 套接字来代理抽象 Unix 套接字。这是在网络命名空间之外完成的。然后,您可以从网络命名空间内连接到该地址。例如,假设上面的抽象套接字地址,在命名空间之外运行:

socat UNIX-LISTEN:/tmp/whatever,fork ABSTRACT-CONNECT:/tmp/dbus-t00hzZWBDm
Run Code Online (Sandbox Code Playgroud)

然后,您可以在命名空间内通过设置此环境变量进行连接:

DBUS_SESSION_BUS_ADDRESS=unix:path=/tmp/whatever
Run Code Online (Sandbox Code Playgroud)