Sum*_*mit 6 linux routing multicast ipv6
尝试了所有可能的方法无法找到解决此问题的方法.我有一台带有两个接口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
Run Code Online (Sandbox Code Playgroud)
我的路由表是
[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
Run Code Online (Sandbox Code Playgroud)
但是,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
Run Code Online (Sandbox Code Playgroud)
也许这个问题与eth0的ff00 ::/8这个事实有关.我该如何否决这条路线.我也无法删除ff00 ::/8路由.
Jan*_*der 13
我并不完全相信我的解决方案是正确的,但我至少可以对正在发生的事情有所了解.
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
Run Code Online (Sandbox Code Playgroud)
...我的ff15 :: 1(5 == site-local,> link-local)的组播数据包最终在eth0上,因为"本地"路由表首先匹配并覆盖"主"表,即使"主"表有更具体的路线.在更大的策略路由方案中,这种重写行为是正确的,但是对本地表自动添加ff00 ::/8的选择对我来说是个问题.
我没有足够的经验知道这是不是一个好主意,但是:
# ip -6 route add ff15::/16 dev eth1 table local
Run Code Online (Sandbox Code Playgroud)
现在我的ff15 :: 1数据包通过eth1路由.
这与本地表的语义有些一致,因为它直接通过设备进行路由.它感觉不完全正确(考虑自动管理和"你不应该看这个表"),但这是我发现的最佳解决方案.
| 归档时间: |
|
| 查看次数: |
10949 次 |
| 最近记录: |