DPDK — PDUMP 抓包工具


 

目錄

 

 

前文列表

DPDK — 安裝部署
DPDK — TestPMD

DPDK PDUMP

librte_pdump 庫是在 DPDK 16.07 版本引入的一個 DPDK 數據包捕獲開發框架,dpdk-pdump Tool 就是基於 librte_pdump 庫開發出來的 DPDK App 抓包工具。因為 DPDK App 是完全內核旁路(Kernel-bypass)的用戶態網絡協議棧,所以無法使用 tcpdump 工具來進行抓包。使用 dpdk-pdump 可以用於抓取被 DPDK App 接管的指定接口、隊列的數據包。

官方文檔:http://doc.dpdk.org/guides/howto/packet_capture_framework.html

安裝部署

DPDK PDUMP 依賴基於 libpcap 的 PMD 驅動,需要預先安裝:

  • libpcap 網絡數據包捕獲函數庫(A system-independent interface for user-level packet capture)。
  • libpcap-devel 用於編譯和使用基於 libcap 的 PMD 輪詢模式驅動程序。
yum install -y libpcap.x86_64 libpcap-devel.x86_64

默認情況下,該驅動程序被禁用,需要通過修改 Target Env 的配置文件來開啟:

$ vim dpdk-18.08/x86_64-native-linuxapp-gcc/.config
CONFIG_RTE_LIBRTE_PMD_PCAP=y
CONFIG_RTE_LIBRTE_PDUMP=y

$ make

最后再安裝 pdump:

$ cd dpdk-18.08/app/pdump
$ make && make install

librte_pdump 庫

Server 端:

  • rte_pdump_init():初始化 PDUMP 抓包框架,並創建線程和 Server Socket。Socket 在線程里監聽 Client Start/Stop 抓包的請求。
  • rte_pdump_uninit():清理退出 PDUMP 抓包框架,並關閉線程和 Server Socket。

Client 端:

  • rte_pdump_enable():在一個端口隊列開啟抓包。
  • rte_pdump_enable_by_deviceid():在一個設備 ID(vdev 名稱或者 PCI 地址)和隊列抓包。

每調用一次這兩個 API,PDUMP 庫就會創建一個獨立的 Client Socket,並發送 pdump enable 的請求到 Server。Server 監聽到這個請求就會通過給定的端口或者設備 ID 以及隊列的組合,在 Ethernet RX/TX 注冊回調函數,之后 Server 就會鏡像數據包到一個新的內存池,並將讓它們在 Client 傳入的 rte_ring 隊列上入隊。Server 會發送響應給 Client 關於請求處理的狀態。在收到 Server 的回應后,Client 的 Socket 就關閉了。

  • rte_pdump_disable():在一個端口隊列停止抓包。
  • rte_pdump_disable_by_deviceid():停止在一個設備 ID(vdev 名稱或者 PCI 地址)和隊列抓包。

每調用一次這兩個 API,PDUMP 庫就會創建一個獨立的 Client Socket,並發送 pdump disable 的請求到 Server。Server 監聽到這個請求就會通過給定的端口或者設備 ID 以及隊列的組合,在 Ethernet RX/TX 刪除回調函數,之后 Server 就會鏡像數據包到一個新的內存池,並將讓它們在 Client 傳入的 rte_ring 隊列上入隊。Server 會發送請求回應給 Client 關於請求處理的狀態。在收到 Server 的回應后,Client 的 Socket 就關閉了。

  • rte_pdump_set_socket_dir():設置 Server 或 Client 的 Socket 文件的路徑。注意,這個接口是非線程安全的,並在 DPDK 18.05 版本移除。

運行原理

在使用 dpdk-pdump 時,dpdk-pdump 會作為 Secondary(從)進程,並依附於 Primary(主)進程,即 DPDK App,例如:testpmd、l2fwd、l3fwd。Primary 進程作為 Server 端,需要 include rte_pdump 庫進行開發,初始化 PDUMP 抓包框架。Secondary 進程作為 Client 端,同樣需要 include rte_pdump 庫進行開發,通過標准接口向 Primary 進程發送 Start/Stop 抓包的請求,然后 Primary 進程會拷貝一份數據包到 Ring 中,Secondary 進程再從 Ring 中讀取出來,並發送到 PCAP PMD 設備。可以保存為 pcap 文件,或發送至 Linux Console 等外部接口輸出。

注意:因為 dpdk-pdump 抓包存在報文 Copy 的過程,所以對性能會有影響,建議僅在 DEBUG 時使用。

在這里插入圖片描述

PDUMP 的工作流程

在這里插入圖片描述

  1. DPDK App 采用 rx-worker-tx 的模型進行報文的處理,其中調用 rte_pdump_init 會啟動 dump_thread;
  2. dpdk-pdump 采用 secondary 模式啟動,與 App 共享 mmap 映射的內存空間;
  3. dodk-pdump 啟動過程中會創建 mbuf_pool 和 ring,用於后續接收 App 中報文的拷貝;
  4. dpdk-pdump 會通過 rte_eth_dev_attach 方式創建 vdev,且采用 eth_pcap 驅動進行初始化,留意 init 中的 open_tx_pcap;
  5. dpdk-pdump 向 App 發送開啟抓包的消息(UDP 方式),消息內容為前面創建的 mbuf_pool、ring 以及抓包的 Port 和對應的 Queue;
  6. App 中的 dump_thread 收到消息后,獲取相應信息,在 Port 上注冊 call_back 函數;
  7. 對於開啟抓包的 Port,在 rx_burst/tx_burst 時會先調用 call_back(回調函數),這里對應 pdump_rx/pdump_tx,它會由 mbuf_pool 中分配 mbuf 進行報文的復制,同時 enqueue 到 ring 中;(mbuf_pool 和 ring 在步驟 3 中創建,在步驟 5 中傳遞給 App);
  8. dpdk-pdump 進行 ring 的 dequeue 操作獲取拷貝報文;
  9. 拷貝報文通過 rte_eth_tx_burst 發送給 vdev;
  10. vdev 通過 eth_pcap 的 tx_pkt_burst 發送報文,即調用 eth_pcap_tx_dumper 完成報文的 pcap 存儲(pcap_dump)。

操作步驟

以 testpmd 為例,使用 dpdk-pdump 進行抓包。

  1. 啟動 testpmd 作為 Primary 進程
$ ./testpmd -l 1,2,3 --socket-mem 1024 -n 4 --log-level=8 -- -i
  1. 啟動 dpdk-pdump 作為 Secondary 進程
$ ./build/app/dpdk-pdump -- --pdump 'port=0,queue=*,rx-dev=/tmp/capture.pcap'
  1. 查看 pcap 文件
$ tcpdump -nr /tmp/capture.pcap

dpdk-pdump 指令

./build/app/dpdk-pdump -- --pdump '(port=<port id> | device_id=<pci id or vdev name>), (queue=<queue_id>), (rx-dev=<iface or pcap file> | tx-dev=<iface or pcap file>), [ring-size=<ring size>], [mbuf-size=<mbuf data size>], [total-num-mbufs=<number of mbufs>]' [--server-socket-path=<server socket dir>] [--client-socket-path=<client socket dir>]
  • –pdump:是必選的,多個 --pdump 可以用於捕獲不同的接口和隊列
  • –server-socket-path:是可選的,指定 Server socket 的目錄。root 用戶就默認為 /var/run/.dpdk/,非 root 用戶默認為 ~/.dpdk/。
  • –client-socket-path:是可選的,指定 Client Socket 的目錄。root 用戶就默認為 /var/run/.dpdk/,非 root 用戶默認為 ~/.dpdk/。

–pdump 的子參數:

  • port:需要被抓包的以太網 Port id。
  • device_id:需要被抓包的以太網 PCI 設備的 id。
  • queue:需要被抓包的以太網 PCI 設備的 Queue id,* 表示所有隊列。
  • rx-dev:入口方向被抓取的報文,參數應該是一個 pcap 文件名或者 Linux 接口。
  • tx-dev:出口方向被抓取的報文,參數應該是一個 pcap 文件名或者 Linux 接口。

NOTE:如果兩個方向都分別要,tx-dev 與 rx-dev 應該被同時指定兩個不同的文件或者接口;如果兩個方向都同時要,tx-dev 與 rx-dev 應該指定相同的文件或接口。

  • ring-size:指定用於存儲數據包的 Ring 的大小,默認是16384。用於主程序向抓包程序入隊用的。

  • mbuf-sizze:MBuf Data 的 大小,用於 mempool 的創建,默認是2176。用於入隊列的mbuf用的。用於主程序向抓包程序傳數據用的。

  • total-num-mbufs:指創建 mbug 的個數,默認值為 65535。

  • –server-socket-path 和 --client-socket-path 用於指定 Server 和 Client 之間進行通信的 Socket 路徑。默認的,DPDK App 的 Socket 路徑為 /var/run/dpdk/rte/,但是在多 DPDK App 進行的環境中,可能回味每個 DPDK App 指定不同的路徑,從而隔離開配置空間。此時就需要使用 --server-socket-path 來指定特定 DPDK App 的配置路徑了。

注意:DPDK 18.05 后把 rte_pdump_set_socket_dir() 函數移除了,所以 --server-socket-path 是不生效的,依舊會到 /var/run/dpdk/rte 路徑下讀取配置和 Socket 文件。

Use the Data Plane Development Kit Pdump Feature with Open vSwitch*

https://software.intel.com/content/www/us/en/develop/articles/dpdk-pdump-in-open-vswitch-with-dpdk.html

在這里插入圖片描述

相關閱讀:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM