我有一个关于IPv6和SO_BINDTODEVICE
的情况,我真的需要帮助!我希望有这样的设置:
在我的计算机上运行Linux,传入的流量在eth0
。这些数据包将发往多个应用程序之一。在分组有效载荷中找到的一些比特决定分组所指向的多个应用中的哪一个。即无论数据包的目的地是哪个应用程序,目标IP地址都是相同的。这很重要。
为了实现这一点,我使用SO_BINDDTODEVICE
设计了它。这是我的工作:
我为每个应用程序设置了一个“虚拟”界面。在我的示例中,我有两个应用程序,即我已设置dummy0
和dummy1
接口。
Linux内核中的钩子函数(PRE_ROUTING
钩子)检查传入数据包内容中的位并决定它将指向哪个应用程序。经过决定,PRE_ROUTING
挂钩将Linux skb
结构(skb->dev
)中的设备设置为指向'dummy0'或'dummy1'。
每个应用程序打开一个RAW套接字(未绑定到任何地址),并将SO_BINDTODEVICE套接字选项分别绑定到其中一个虚拟接口dummy0
和dummy1
。
使用IPv4数据包运行此设置,它都按预期工作。发往应用程序1的数据包在绑定到设备dummy0
的RAW套接字上接收,发往应用程序2的数据包在绑定到设备dummy1
的RAW套接字上接收。
我的问题是相同的设置不适用于IPv6数据包! : - (
IPv6数据包进入Linux IP堆栈但未找到应用程序的路径。而是为每个传入的IPv6数据包返回ICMPv6“参数问题,不支持的下一个报头”数据包。当然,因为我没有任何句柄,但是因为我正在使用RAW套接字,所以我的数据包的副本应该发送到我的socet。我可以看到(使用strace
)在任何RAW套接字上都没有收到任何内容。它如何适用于IPv4,但不适用于IPv6。有效载荷完全相同!
我尝试将RAW套接字绑定到特定的目标IPv6地址,并尝试将其添加到“虚拟”接口,但没有成功。
我所阅读的手册没有具体说明与SO_BINDTODEVICE
以及IPv6有关的任何内容,但也没有说明它不起作用。
拜托,有人可以帮帮我吗? 非常感谢提前!
BR Martin