您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

如何在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 == site-local,> link- local)的多播数据包最终到达eth0,因为“本地”路由表首先匹配并覆盖了“主”表,即使“主”表具有更具体的路由。在较大的策略路由方案中,此替代行为是正确的,但是将ff00 :: / 8自动添加到本地表的选择对我来说是个问题。

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

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

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

这与本地表的语义有些一致,因为它直接通过设备进行路由。感觉并不完全正确(考虑自动管理和“您不必看这张表”),但这是我找到的最佳解决方案。

其他 2022/1/1 18:13:39 有675人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶