Linux

對網路數據包執行任務和自定義邏輯

  • February 27, 2020

我正在尋找一種以特定方式在 Linux 伺服器中處理數據包的方法 - 我需要在每個數據包上執行一些自定義邏輯,然後(可能)對數據包採取一些操作並讓核心根據需要路由它。我的特定案例是:

  1. 擷取 IGMP 數據包(在我的主機上的 Linux 網橋內傳遞)並根據我擁有的一些允許值列表驗證它們的內部欄位(多播組和校驗和)。如果未找到匹配項,則丟棄數據包。
  2. 當接收到 IPv6 數據包(通過我的 Linux 機器路由)時,將源地址與一些“可疑”地址字典進行比較。如果為真,則打開數據包(直到 HTTP 標頭和內部)並執行一些測試以確保它有效(例如驗證埠號、內容長度、標頭結構)
  3. 擷取 TCP 段後,檢查其中啟用的標誌數,如果數量大於 5,則將數據包的副本發送到另一個目的地(例如,IDS 設備)並正常轉發數據包。

我查看了一些 Linux 實用程序和工具,例如、tc和其他解決方案 ( ),但找不到一種簡單的方法來以簡單的方式解決這些技術以實現我想要的。如果我的驗證和操作可以在現代、靈活的環境和程式碼中執行,那就更好了(這裡不要求 python 或 Java,但 bash 比一些類似核心的 C 程式碼更可取)。XDP``DPDK``FD.io``VPP

在 Linux 機器中實現此類操作的常用方法是什麼?任何允許以程式方式進行所有提到的修改和功能的最佳實踐或技術?

乾杯。

使用 XDP INGRESS 將是 igmp 和 tcp 場景的理想選擇。但是對於 ipv6,因為你有更多的檢查和界限,不確定它會如何翻譯。這裡的缺點是沒有特定的使用者應用程序,因此無法在沙箱 JIT 中使用使用者零複製模式和 eBPF 逐包處理。id 的數據包鏡像也很困難。

使用 TAP 或 KNI 的 DPDK 確實是一種可行的方法,因為您可以批量分攤成本。但這涉及到使用者空間攔截。

以下是我的建議

  1. 如果您有 hw ack 或 flow.director,則將感興趣的流量分叉到自定義埠或隊列。
  2. 在自定義埠上使用 DPDK 並檢查。如果匹配 ida 的鏡像,然後通過 tap 或 kni 注入核心。

或者

  1. 如果沒有硬體過濾器,請嘗試使用使用者空間 ebpf 從傳入流量中過濾 igmp、ipv6 和 tcp 內容。
  2. 使用者空間應用程序然後執行過濾器和鏡像邏輯,然後注入回核心。

引用自:https://serverfault.com/questions/994822