我有一个 Linux 系统(设为 A),它有 2 个以太网卡,即 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 来实现这一点?还是我需要编写一个应用程序来实现这一点?我应该怎么做才能“复制”数据包?
答案1
如果你的内核足够新,你可以使用iptables --tee将帧从 eth0 转发到捕获机器。
答案2
您可以使用 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
对于传出流量:
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
答案3
在网上搜索 tcpbridge,它就是这个工作的执行者。它也可以用于与虚拟机通信。
答案4
就像是rinetd 可能工作(TCP 重定向器/服务器仅有的我相信,所以没有 ARP、第 2 层等),但老实说,获得一些具有端口镜像功能的托管交换机,或者如果该盒子仅用于 wireshark,您可以向其中添加另一个 NIC,桥接两个接口,将其放在机器 A 的 eth0 前面,并有一个专用的嗅探机器。