Linux

如何在沒有文件路徑的情況下嗅探 unix dgram 套接字?

  • July 24, 2018

那篇文章中,我意識到:

UNIX 域套接字綁定到文件路徑。

所以,我需要通過這裡socat提到的嗅探 DGRAM Unix 套接字。但是當我嘗試為此目的檢索路徑時,我發現目標應用程序使用了一個沒有文件路徑的套接字。

ss -apex命令顯示有和沒有文件路徑的結果,例如:

u_dgr UNCONN 0 0 /var/lib/samba/private/msg.sock/32222   1345285 * 0   users:(("nmbd",pid=32222,fd=7))
u_dgr UNCONN 0 0 * 8567674   * 0   users:(("gnome-shell",pid=16368,fd=23))

ss 手冊頁* 8567674我無法找到,例如沒有文件路徑是什麼意思。

所以,兩個問題:

  1. 為什麼在某些情況下沒有指向 unix 套接字的文件路徑?
  2. 如何在socat沒有文件路徑的情況下通過嗅探 unix DGRAM 套接字?

問題 #1

Q1:從 ss 手冊頁我找不到,這是什麼意思,例如 * 8567674 沒有文件路徑。

文件中,它解釋了 Address:Port 列,如下所示:

摘抄

ADDRESS_PATTERN的格式和語義取決於地址族。

  • inet - ADDRESS_PATTERN由 IP 前綴組成,後跟冒號和埠可選。如果前綴或埠部分不存在或替換為 *,則表示萬用字元匹配。
  • inet6 - 與inet相同,只是前綴指的是 IPv6 地址。不像inet冒號變得模棱兩可,所以 ss 允許使用方案,就像在 URL 中使用的那樣,其中地址被支持$$ … $$.
  • unix - ADDRESS_PATTERN是 shell 樣式的萬用字元。
  • 數據包格式看起來像inet,只有介面索引而不是埠和鏈路層協議 id 而不是地址。
  • netlink - 格式看起來像inet,只有套接字 pid 保留而不是埠和 netlink 通道而不是地址。

PORT在語法上是帶有萬用字元地址部分的*ADDRESS_PATTERN 。*當然,對於 UNIX 套接字,它是未定義的。

最後一句話就是你的答案。

問題2

Q2:為什麼有些情況下沒有unix socket的文件路徑?

請參閱此 SO Q&A,標題為:如何在不創建套接字文件的情況下使用 unix 域套接字

摘抄

您可以使用“抽象套接字地址”創建一個 unix 域套接字。只需將傳遞給綁定的sun_path字元串的第一個字元設置為。在此初始之後,將字元串寫入其餘部分並將其填充為with (或其他任何內容)。sockaddr_un``'\0'``NUL``sun_path``UNIX_PATH_MAX``NULs

以這種方式創建的套接字將沒有任何文件系統條目,….

問題 #3

Q3:如何在沒有文件路徑的情況下通過socat嗅探unix DGRAM socket?

一旦你知道什麼叫做什麼,再次Google搜尋:socat docs

摘抄

  • 抽象聆聽:
  • 摘要-發送到:
  • 摘要-RECVFROM:
  • 摘要-RECV:
  • 抽象客戶: >

> > ABSTRACT 地址幾乎與相關的 UNIX 地址相同,只是它們不定址基於文件系統的套接字,而是替代 UNIX 域地址空間。為了歸檔它,套接字地址字元串在內部以“\0”為前綴。此功能(僅?)在 Linux 上可用。選項組與相關的 UNIX 地址相同,只是 ABSTRACT 地址不是 NAMED 組的成員。 > > >

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