我有一个数据包跟踪,我用它伪造scapy
并重新发送tcpreplay
。我用 重新计算 IP 和传输层校验和Scapy
,将数据包保存到磁盘pcap
文件中并调用tcpreplay
它。
通过tcpdump
并行运行,我注意到这些传出数据包的所有IP 校验和都没有任何价值。似乎tcpreplay
每次都将其删除。
现在,这是故意发生的吗?我错过了什么吗?
校验和应该是正确的,所以我认为不会tcpreplay
因为检查失败而将其删除。
我不太确定发生了什么,但我怀疑tcpreplay
检测到将用于发送数据包的接口具有Offload Checksum
活动状态并让NIC
计算正确的校验和。
尝试禁用卸载校验和
ethtool -K eth0 rx off tx off
然后重试并告诉我们
您没有指定实际使用的 tcpreplay 命令,但 tcpreplay从不编辑数据包。您可以使用 tcpreplay-edit 或 tcprewrite 来编辑数据包,但不能使用 tcpreplay。即使这样 tcpreplay-edit/tcprewrite 也会计算/修复你的校验和;不要将它们归零。
您是否在 Wireshark 中打开了由 scapy 生成的原始 pcap 并验证那里实际上存在校验和?老实说,这听起来像是垃圾进垃圾出的简单案例。
FWIW,我不知道有什么会使您的校验和归零...至少我无法想象内核为什么会对通过 PF_PACKET 接口发送的数据包执行此操作-恕我直言,这将是一个错误。
如果你弄明白了,请告诉我。
tcpreplay-edit
您可以使用包含在同一包中的解决此问题tcpreplay
,特别是此选项:
-C, --fixcsum Force recalculation of IPv4/TCP/UDP header checksums
停用接口的卸载校验和是没有意义的:当数据包发出时,它将被下一台启用校验和检查的机器拒绝(+99%)