将数据包从一个接口复制到另一个接口

Emi*_*ano 10 networking linux iptables packet-capture

我有一个带有 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 来实现这一目标?或者我需要编写一个应用程序来完成这项工作吗?我该怎么做才能“复制”数据包?

Ger*_*mbs 7

如果您的内核足够新,您可以使用iptables --tee将帧从 eth0 转发到捕获机器。


und*_*ine 6

您可以使用 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
Run Code Online (Sandbox Code Playgroud)

对于传出流量:

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
Run Code Online (Sandbox Code Playgroud)