-1

我一直在研究一个在 Linux 内核之上运行的路由设备上使用 TUNTAP 接口(在 TUN 模式下)的程序。这是一个多播隧道协议,我正在尝试通过我的应用程序将 MLD 连接发送到内核,以便可以在其他地方接收。然而,即使我已经对接口上发送的数据包进行了四次检查,Linux 内核在数据包被传递之前会丢弃它。

乏味地我一直在通过 linuxkernel 跟踪数据包的路径,试图找出它被丢弃的原因,我想我已经在某种程度上弄清楚了为什么它没有被处理。Hop-by-Hop 选项(包含 MLD 所需的 Router-Alert 选项)在 ipv6_rcv 函数的 net/ipv6/ip6_input.c 中被解析,但不是继续在 ip6_rcv_finish 中处理数据包,而是数据包由于 ipv6_rcv 函数末尾的 NF_HOOK 以某种方式将数据包解释为正在由其他东西处理,因此被丢弃。(NF_STOLEN 而不是 NF_ACCEPT)

一旦 ipv6_rcv 函数完成执行,其他东西就会执行 ip6_mc_input,(仍然在 net/ipv6/ip6_input.c 中)但是从这里开始,逐跳选项不被处理,这意味着当内核最终处理第 4 层协议时,它没有任何东西可以处理协议,因为逐跳选项是要预先处理的。这意味着内核由于未知协议而丢弃了数据包。

我想弄清楚的是什么在调用 ip6_mc_input。我已经在 elixir 上看了很多可以调用它的东西,但是有很多可能性,因为它是从 rt6_info 结构中的指针调用的,由于很多东西都使用它,因此很难追踪。有谁知道任何可以帮助我搜索的东西?

IGMP 连接工作正常,但 IPv4 的内容可能非常相似,因此来自该上下文的信息也可能会有所帮助。

供参考,使用的linux内核版本为v4.4.6

4

1 回答 1

0

我弄清楚发生了什么事。

使用打印出 ip6_mc_input 调用者的文件位置的宏,我发现数据包来自我的 ipt_netmap.c 文件。看起来数据包正在被 IPTables 接收,这些 IPTables 没有被编程来处理跃点选项。事实证明我有一个不需要设置的配置选项集,所以禁用它为我解决了这个问题。

于 2020-01-28T23:31:08.513 回答