D-Bus

在網路命名空間中連接 D-Bus

  • May 25, 2019

我正在使用網路命名空間,以便我可以擷取單個程序的網路流量。命名空間通過 veth 對通過“主機”連接,並通過 NAT 進行網路連接。到目前為止,這適用於 IP 流量和命名的 Unix 域套接字。

當程序需要與 D-Bus 會話匯流排通信時,就會出現問題。D-Bus 守護程序在一個抽象套接字上監聽,該套接字由這個環境變數指定:

DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-jIB6oAy5ea,guid=04506c9a7f54e75c0b617a6c54e9b63a

看起來,抽象的 Unix 域套接字命名空間在命名空間中是不同的。有沒有辦法從網路命名空間訪問這個 D-Bus 會話?

無法連接到偵聽不同網路命名空間中的抽象 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

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可以執行的操作),但它也可以socat像第一個解決方案一樣以自動化方式代理 dbus,而無需 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

引用自:https://unix.stackexchange.com/questions/184964