如何通过Linux中的特定接口发送组播数据包

尝试了所有可能的方法后,找不到解决此问题的方法。 我有一个有两个接口eth0和eth2的机器。 我希望所有ff38:40:2001:dead:beef:cafe :: / 96数据包继续使用eth2。 我尝试了以下所有,但是当我做ping6 ff38:40:2001:dead:beef:cafe :: 1时,数据包总是在eth0上。 事情我已经尝试过,并没有工作(即数据包仍然在eth0上出去)。

$> route add --inet6 ff38:40:2001:dead:beef:cafe::/96 gw 2003::100 dev eth2 $> route add --inet6 ff38:40:2001:dead:beef:cafe::/96 dev eth2 $> route add --inet6 ff38:40:2001:dead:beef:cafe::/96 metric 1 gw 2003::100 dev eth2 

我的路由表是

 [root@dev ~]# route --inet6 |grep eth0 fe80::/64 * U 256 0 0 eth0 ff00::/8 * U 256 0 0 eth0 [root@dev ~]# route --inet6 |grep eth2 2003::/64 * U 256 68 0 eth2 fe80::/64 * U 256 0 0 eth2 ff38:40:2001:dead:beef:cafe::/96 2003::100 UG 1 0 0 eth2 */0 fe80::c671:feff:fe14:e482 UGDA 1024 0 0 eth2 ff00::/8 * U 256 0 0 eth2 

然而,ping6 ff38:40:2001:dead:beef:cafe :: 1 -I eth2工作得很好。 而且,我只在Linux机器上看到这个问题(MAC很好)。

 [root@dev ~]# ping6 ff38:40:2001:dead:beef:cafe::1 -I eth2 PING ff38:40:2001:dead:beef:cafe::1(ff38:40:2001:dead:beef:cafe:0:1) from cal eth2: 56 data bytes 64 bytes from 2012::1: icmp_seq=0 ttl=253 time=19.1 ms 64 bytes from 2012::1: icmp_seq=1 ttl=253 time=2.16 ms 64 bytes from 2012::1: icmp_seq=2 ttl=253 time=2.14 ms 64 bytes from 2012::1: icmp_seq=3 ttl=253 time=2.26 ms 64 bytes from 2012::1: icmp_seq=4 ttl=253 time=2.08 ms 64 bytes from 2012::1: icmp_seq=5 ttl=253 time=2.15 ms root@dev ~]# uname -a Linux 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux 

也许这个问题与eth0有一个ff00 :: / 8有关。 我如何推翻这条路线。 我也无法删除ff00 :: / 8路由。

Solutions Collecting From Web of "如何通过Linux中的特定接口发送组播数据包"

我并不完全相信我的解决方案是正确的,但我至少可以更清楚地了解正在发生的事情。

背景

Linux实际上有多个路由表,他们一次搜索一个特定的优先级顺序,直到找到一个具有匹配路由的表。 您可以选择根据源地址或协议搜索一些路由表; 请参阅ip-rule(8)手册页。

麻烦的是“本地”路由表,其优先级为0,尽可能高。 “本地”表由内核自动填充并保存“明显的”接口和广播路由。 对于Linux下的IPv6,这显然包含了整个组播块。

问题

我将会使用iproute2工具,而不是更传统的route ,因为它会显示我需要知道的一切。

在我的Linux上:

 $ ip -6 route show table local local ::1 via :: dev lo proto none metric 0 local fe80::213:a9ff:fe91:5bcb via :: dev lo proto none metric 0 local fe80::250:b6ff:fe44:37d1 via :: dev lo proto none metric 0 ff00::/8 dev eth0 metric 256 ff00::/8 dev eth1 metric 256 $ ip -6 route show table main fe80::/64 dev eth0 proto kernel metric 256 fe80::/64 dev eth1 proto kernel metric 256 ff15::/16 dev eth1 metric 1024 ff00::/8 dev eth1 metric 1024 $ ip -6 rule show 0: from all lookup local 32766: from all lookup main 

…我的ff15 :: 1(5 ==站点本地,>本地链路)的多播数据包在eth0上结束,因为“本地”路由表先匹配并覆盖“主”表,即使“主”表具有更具体的路线。 这种重载的行为在更大的策略路由方案中是正确的,但是将ff00 :: / 8自动添加到本地表的选择对我来说是值得怀疑的。

我的解决方案

我没有足够的经验知道这是否是一个好主意,但是:

 # ip -6 route add ff15::/16 dev eth1 table local 

现在我的ff15 :: 1数据包通过eth1路由。

这与本地表的语义有一定的一致性,因为它直接通过设备进行路由。 它不完全正确(考虑自动管理和“你不应该看看这个表”),但这是我找到的最好的解决方案。