我正在尝试使用在 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 上的网卡。