我有一组
pcap
文件,其中包含来自两台主机的 UDP 流量,并且必须定期对此流量执行一些分析。
理想情况下,我希望避免频繁设置具有特定 IP 等的本地接口来重播这些文件。我希望能够简单地在环回界面上重播它们,使用
tcprewrite
更改 pcap
。
这是目前的样子:
# Remove mac addresses for loopback interface
# Remove VLAN tags
tcprewrite \
--enet-smac=00:00:00:00:00:00 \
--enet-dmac=00:00:00:00:00:00 \
--enet-vlan=del \
--infile="${INFILE}" \
--outfile="${OUTFILE}.tmp"
# Change source and destination IP to loopback
# Regenerate IP checksums
tcprewrite \
--srcipmap=0.0.0.0/0:127.0.0.1 \
--dstipmap=0.0.0.0/0:127.0.0.1 \
--fixcsum \
--infile="${OUTFILE}.tmp" \
--outfile="${OUTFILE}"
看起来几乎可以工作了。然后,我可以使用
tcpreplay
在环回上简单地重播这些文件,并且在 tcpdump
上使用 lo
看到数据包。尽管如此,似乎任何常规用户空间套接字都看不到环回上的此流量。
根据我的理解,这似乎与linux上环回接口处理第2层的方式有关。看来我需要将第 2 层标头 (DLT) 从普通的
ethernet
重写为 BSD 环回使用的 null
协议。
任何有将以太网捕获的 UDP 流量重放到环回接口的经验的人将不胜感激。我无法弄清楚如何做到这一点,或者是否可以使用
pcap
/tcprewrite
。
我尝试遵循 https://www.tcpdump.org/linktypes.html 并强制使用
0
(DLT_NULL) 的 DLT 标头类型和 2
(IPv4) 的内容,但没有成功:
tcprewrite \
--enet-smac=00:00:00:00:00:00 \
--enet-dmac=00:00:00:00:00:00 \
--enet-vlan=del \
--dlt=user \
--user-dlt=0 \
--user-dlink=02,00,00,00 \
--infile="${INFILE}" \
--outfile="${OUTFILE}.tmp"
Fatal Error in tcpedit.c:tcpedit_packet() line 135:
From plugins/dlt_null/null.c:dlt_null_encode() line 201:
DLT_NULL and DLT_LOOP plugins do not support packet encoding
取消MAC地址并更改IP地址就足够了。你不需要玩 DLT。
您共享的用于修改数据包的命令似乎是正确的,不久前我在开发系统日志代理来重放环回接口上的流量时使用了类似的方法。
我确信您在用户空间中看不到数据包的原因是
tcpreplay
如何在网络堆栈和NIC驱动程序之间注入数据包。
您有两种选择在环回接口上重放数据包:
选择哪个选项取决于您的环境,但是只要您的内核支持,tc是最方便的。
有一个关于该主题的综合指南,在此来源中探讨了这两个选项。