在 Linux 桥上记录数据包

在 Linux 桥上记录数据包

我正在尝试使用在 espressobin v5 SOC 上创建的桥接器来记录数据包。我已经使用 archlinux arm 包对其进行了设置。该板是开箱即用的,可提供固有的交换和路由功能。我想我已经禁用了所有这些功能,因为我不需要路由功能。我只需要具有数据包检查的桥接功能。

目的是将此设备放置在一系列 voip 电话的上游,并使用它来检查发往这些电话的数据包并记录它们。记录的数据包将作为单独进程(不在本问题范围内)的指示器,以指示电话正在响铃。当有人接听电话时,这些数据包将停止记录(协议从 UDP 更改为 TCP,从而使记录规则无效)。

ootb Espressobin 设置了一个桥接器 br0,用于连接到 lan0 lan1。我禁用了 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 上,运行一个通过端口 15000 进行通信的小型 nodejs 服务器,espressobin 放置在我的工作站和 10.0.1.198 之间,如下所示:

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

当我从 expressobin curl 到 10.0.1.198 时(http://10.0.1.198:15000)我可以看到被记录的数据包。

当我从工作站 curl 到 10.0.1.198 时,我没有看到任何记录的数据包。我本来希望看到数据包。

根据文档 ebtables 无法实现完整的 IPv4,因此 modprobe br_netfilter

我的问题是,我是否走在正确的道路上,还是我正在执行不可能完成的任务?

如果这在一定程度上是由于 ebtables 的限制,那么有什么可能的方法可以实现我在桥上记录数据包的目标(如果有的话)。

答案1

ESPRESSObin 系统使用板载以太网交换机芯片,该芯片由 Linux DSA(分布式交换机架构)支持。我的理解是,当您桥接两个连接到此交换机芯片的以太网端口时,从一个端口发往另一个端口(而不是发往 SoC 本身)的所有帧将完全绕过主 SoC 并由交换机芯片处理。这就是为什么tcpdump没有显示流量的原因;它实际上从未接触过 SoC 上的网卡。

相关内容