返回

libnetfilter_queue 的困惑:修改 TTL 后的报文去哪了?

Linux

libnetfilter_queue 的困境:修改 TTL 后的报文无法送达

前言

修改 IP 报文头的 TTL(生存时间)是一个常见的网络操作,用于控制报文在网络上的转发次数。使用 libnetfilter_queue 库执行此操作非常方便,但有时,修改后的报文无法到达目的地。本文将深入探究此问题的原因并提供解决方案。

背景

libnetfilter_queue 是一个用户空间库,允许程序员与 Linux 内核的 Netfilter 框架进行交互。使用该库,我们可以拦截、修改和重定向网络流量。

问题

使用 libnetfilter_queue 修改 IP 报文头的 TTL 值后,报文似乎无法到达目的地。对此我们进行了如下尝试:

  • 检查回调函数:确认 TTL 值从 64 修改为 88。
  • 修改 TTL 为相同值:TTL 从 64 修改为 64,但结果相同。
  • 添加 nfq_udp_mangle_ipv4 调用:添加此调用后,报文可以被接收方 nc 进程收到并打印消息。

探索 nfq_udp_mangle_ipv4

nfq_udp_mangle_ipv4 是 libnetfilter_queue 中的一个函数,用于修改 UDP 报文头。尽管我们的修改只针对 IP 报文头,但 nfq_udp_mangle_ipv4 的调用却至关重要。

原因

nfq_udp_mangle_ipv4 更新了 UDP 校验和。虽然 nfq_ip_mangle 修改了 IP 报文头,但它不会更新 UDP 校验和。UDP 校验和用于确保报文在传输过程中没有被修改。如果校验和不正确,接收方将丢弃报文。nfq_udp_mangle_ipv4 通过更新 UDP 校验和,确保接收方能够验证报文的完整性并正确处理它。

结论

要使经过 libnetfilter_queue 处理后的报文能够到达目的地,需要调用 nfq_udp_mangle_ipv4 来更新 UDP 校验和。否则,接收方会丢弃报文,因为报文的 UDP 校验和不正确。

常见问题解答

Q1:为什么只修改 IP 报文头,却需要调用 nfq_udp_mangle_ipv4?

A1:nfq_udp_mangle_ipv4 更新 UDP 校验和,这对于接收方验证报文的完整性至关重要。

Q2:在什么情况下需要使用 nfq_udp_mangle_ipv4?

A2:只要修改 IP 报文头可能会影响 UDP 校验和,就需要使用 nfq_udp_mangle_ipv4。

Q3:除了 nfq_udp_mangle_ipv4,还有其他方法可以更新 UDP 校验和吗?

A3:有,可以使用 libnet 等其他库或手动计算校验和。

Q4:nfq_ip_mangle 有没有其他用途?

A4:nfq_ip_mangle 可用于修改 IP 报文头中的各种字段,例如源 IP 地址、目标 IP 地址、TTL 等。

Q5:libnetfilter_queue 的其他常见问题是什么?

A5:其他常见问题包括处理大流量时的性能问题、与其他内核模块的兼容性以及在虚拟环境中使用时的注意事项。