Linux

將數據包從一個介面復製到另一個介面

  • September 4, 2019

我有一個帶有 2 個乙太網卡的 Linux 系統(讓它成為 A),即 eth0 和 eth1,它們連接到兩個完全不相關的 LAN。

基本上 eth0 用於正常的應用程序流量,而 eth1 僅用於調試目的。調試意味著使用交叉電纜將 eth1 連結到另一個執行 Wireshark 的 linux 盒子(讓它成為 B)。我希望 Wireshark 能夠處理在 A 的 eth0 上傳輸的應用程序數據包。

基本上我需要將傳輸數據包從 eth0 介面復製到介面 eth1,以便框 B 上的 Wireshark 可以嗅探它們(由於某些原因,我無法物理訪問 LAN eth0)。我還可能需要根據某些規則(順便說一下,僅基於 TCP/IP 欄位)指定將哪些數據包從 eth0 複製到 eth1。

另請注意,不需要將 A 的 eth0 置於混雜模式,因為我只想複製以 A 作為目標的數據包子集

有沒有辦法單獨使用 iptables 來實現這一點?還是我需要編寫一個應用程序來完成這項工作?我應該怎麼做才能“複製”數據包?

如果您的核心足夠新,您可以使用iptables –tee將幀從 eth0 轉發到擷取機器。

您可以使用 tc mirred 動作。例如:對於傳入流量:

tc qdisc add dev eth0 ingress
tc filter add dev eth0 parent ffff: \
  protocol all prio 2 u32 \
  match u32 0 0 flowid 1:1 \
  action mirred egress mirror dev eth1

對於傳出流量:

tc qdisc replace dev eth0 parent root handle 10: prio
tc filter add dev eth0 parent 10: \
  protocol all prio 2 u32 \
  match u32 0 0 flowid 10:1 \
  action mirred egress mirror dev eth1

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