在網路命名空間中連接 D-Bus
我正在使用網路命名空間,以便我可以擷取單個程序的網路流量。命名空間通過 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