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