我正在使用网络命名空间,以便可以捕获单个进程的网络流量。命名空间通过 veth 对通过“主机”进行连接,并通过 NAT 进行网络连接。到目前为止,这适用于 IP 流量和命名 Unix 域套接字。
当程序需要与 D-Bus 会话总线通信时,就会出现问题。 D-Bus 守护程序侦听此环境变量指定的抽象套接字:
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-jIB6oAy5ea,guid=04506c9a7f54e75c0b617a6c54e9b63a
看来抽象的Unix域套接字命名空间在命名空间上是不同的。有没有办法从网络命名空间访问此 D-Bus 会话?
答案1
Linux 网络命名空间 ip网络确实分离了 unix 套接字,并且当 dbus 使用它时,它就无法从新的命名空间访问,我们可以想象一个功能可以保留对 unix 套接字的访问,但截至 05/2019 尚未实现。 Unix 套接字可以通过以下方式观看netstat -a -p --unix
替代解决方案用于socat
代理 dbus 套接字,对此有详细介绍回答和这里
替代解决方案根据与 dbus 所需的通信,可以创建新的会话总线实例dbus 启动从名称空间内部dbus-launch my-command-or-app
注意,可以使用其他方法,例如dbus 运行会话
替代解决方案 netns 执行可以在没有 root 访问权限的命名空间上运行应用程序/命令(类似于消防监狱可以做)但socat
它还可以像第一个解决方案一样以自动化方式代理 dbus ,并且无需 root 访问权限。
替代解决方案 xdg-dbus-代理也可以在没有 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
答案2
连接到侦听不同网络命名空间中的抽象 Unix 套接字的 DBus 守护程序是不可能的。可以ss -x
通过包含以下内容的地址来识别此类地址@
:
u_str ESTAB 0 0 @/tmp/dbus-t00hzZWBDm 11204746 * 11210618
作为解决方法,您可以创建一个非抽象 Unix 或 IP 套接字来代理抽象 Unix 套接字。这是在网络命名空间之外完成的。然后,您可以从网络命名空间内连接到该地址。例如,假设上面的抽象套接字地址,在命名空间之外运行:
socat UNIX-LISTEN:/tmp/whatever,fork ABSTRACT-CONNECT:/tmp/dbus-t00hzZWBDm
然后,您可以在命名空间内通过设置此环境变量进行连接:
DBUS_SESSION_BUS_ADDRESS=unix:path=/tmp/whatever
答案3
Linux 网络命名空间仅涵盖网络资源,例如 IPv4 和 IPv6 堆栈、网络接口、IP 地址、IP 路由……但是,unix 套接字不属于网络命名空间。套接字使用文件系统作为其地址空间,因此它们是相关的(如果您甚至可以这样称呼的话),以挂载命名空间以通过文件系统访问它们。然而,即使没有可用的共享安装点,您也可以通过文件描述符传递 unix 套接字。
因此,DBus 通信与 Linux 网络命名空间无关,也不受其影响。因此,无法从网络名称空间访问 DBus(因为这不适用)。