Bridge

在 Linux 網橋上記錄數據包

  • June 27, 2019

我正在嘗試使用在 espressobin v5 SOC 上創建的網橋記錄數據包。我已經使用 archlinux arm 包進行了設置。該板開箱即用,可提供固有的交換和路由功能。我想我已經禁用了所有這些功能,因為我不需要路由功能。我只需要帶有數據包檢查的橋接功能。

目的是將此設備放置在一系列 voip 電話的上游,並使用它來檢查到這些電話的數據包並記錄它們。記錄的數據包將作為單獨程序的指示器(不在此問題的範圍內),以指示電話正在響鈴。當有人接聽電話時,這些數據包將停止記錄(協議從 UDP 更改為 TCP,從而使記錄規則無效)。

ootb Espressobin 設置了一個連接到 lan0 lan1 的網橋 br0。我禁用了 dnsamasq 和預設網橋 br0。

在 br0 的位置有 br1 橋接 lan0 lan1 並設置為路由器分配的靜態 IP 地址。我已經安裝了 ebtables 並執行了以下命令:

modprobe br_netfilter 
modprobe nf_conntrack

這是ifconfig

br1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 10.0.1.216  netmask 255.255.255.0  broadcast 10.0.1.255
       inet6 fe80::a423:15ff:fe81:681a  prefixlen 64  scopeid 0x20<link>
       ether a6:23:15:81:68:1a  txqueuelen 1000  (Ethernet)
       RX packets 211400  bytes 21894506 (20.8 MiB)
       RX errors 0  dropped 696  overruns 0  frame 0
       TX packets 11036  bytes 485479 (474.1 KiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
lan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet6 fe80::f2ad:4eff:fe08:6070  prefixlen 64  scopeid 0x20<link>
       ether f0:ad:4e:08:60:70  txqueuelen 1000  (Ethernet)
       RX packets 279130  bytes 32859949 (31.3 MiB)
       RX errors 0  dropped 74  overruns 0  frame 0
       TX packets 2615  bytes 132663 (129.5 KiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lan1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet6 fe80::f2ad:4eff:fe08:6070  prefixlen 64  scopeid 0x20<link>
       ether f0:ad:4e:08:60:70  txqueuelen 1000  (Ethernet)
       RX packets 13767  bytes 1200675 (1.1 MiB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 8539  bytes 361411 (352.9 KiB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

這是我的 ebtables 規則:

[root@alarm ipv4]# ebtables -t nat -L
Bridge table: nat

Bridge chain: PREROUTING, entries: 3, policy: ACCEPT
-p IPv4 --ip-src 10.0.1.198 --log-level notice --log-prefix "nf_conn" --log-ip -j CONTINUE

這是規則的輸出:

[91201.408471] nf_conn IN=lan1 OUT= MAC source = b8:27:eb:87:49:d4 MAC dest = ff:ff:ff:ff:ff:ff proto = 0x0800 IP SRC=10.0.1.198 IP DST=10.0.1.255, IP tos=0x00, IP proto=17 SPT=137 DPT=137
[91306.855593] nf_conn IN=lan1 OUT= MAC source = b8:27:eb:87:49:d4 MAC dest = ff:ff:ff:ff:ff:ff proto = 0x0800 IP SRC=10.0.1.198 IP DST=10.0.1.255, IP tos=0x00, IP proto=17 SPT=138 DPT=138
[91306.869812] nf_conn IN=lan1 OUT= MAC source = b8:27:eb:87:49:d4 MAC dest = ff:ff:ff:ff:ff:ff proto = 0x0800 IP SRC=10.0.1.198 IP DST=10.0.1.255, IP tos=0x00, IP proto=17 SPT=138 DPT=138

在 10.0.1.198 ia 上執行的小型 nodejs 伺服器通過埠 15000 進行通信,espressobin 放置在我的工作站和 10.0.1.198 之間,如下所示:

router ---- workstation (10.0.1.X)
|_____espressobin (lan0) - (lan1) ---- nodejs server (10.0.1.198)

當我從 expressobin 捲曲到 10.0.1.198 ( http://10.0.1.198:15000 ) 時,我可以看到正在記錄的數據包。

當我從工作站捲曲到 10.0.1.198 時,我看不到任何記錄的數據包。我期待看到數據包。

根據**這個**文件,ebtables 不能做完整的 IPv4,因此 modprobe br_netfilter

我的問題是我是在正確的道路上還是我在完成不可能的任務?

如果這部分是由於 ebtables 的這種限制,那麼實現我在網橋上記錄數據包的目標的可能方法是什麼(如果有的話)。

ESPRESSObin 系統使用板載乙太網交換機晶片,由 Linux DSA(分佈式交換機架構)支持。我的理解是,當您橋接兩個都連接到此交換晶片的乙太網埠時,從一個埠到另一個埠(而不是 SoC 本身)的所有幀都將完全繞過主 SoC 並由開關晶片。這就是為什麼tcpdump不顯示流量的原因;它從未真正接觸過 SoC 上的網卡。

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