在 Linux 網橋上記錄數據包
我正在嘗試使用在 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 上的網卡。