将多播IP6数据包转发到另一个接口



我正在为contiki实现多播。我在NAT和eth0接口上有几个Ubuntu虚拟机。

其中一个虚拟机连接了一个Contiki Border路由器(一个zigduino),它制作自己的接口tun0。(另请参阅http://anrg.usc.edu/contiki/index.php/RPL_Border_Router)

其中一个虚拟机将udp数据包多播到ff1e::。我可以在wireshark上看到,每个虚拟机都会接收到这个多播数据包。我的边界路由器tun0接口从未看到这个udp数据包。我想将连接到边界路由器的VM接收到的所有多播数据包从eth0接口转发到tun0接口,从而允许我的边界路由器看到数据包并将其注入到他的网络中。

如何在Ubuntu中做到这一点?我有点困了,试着添加路线,但不起作用。

附录:我的带有路由器的vm的ifconfig:

eth0      Link encap:Ethernet  HWaddr 00:50:56:24:dd:45  
      inet addr:192.168.59.131  Bcast:192.168.59.255  Mask:255.255.255.0
      inet6 addr: fe80::250:56ff:fe24:dd45/64 Scope:Link
      inet6 addr: bbbb::2/64 Scope:Global
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:40205 errors:0 dropped:0 overruns:0 frame:0
      TX packets:25436 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:25834566 (25.8 MB)  TX bytes:4091267 (4.0 MB)
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:734 errors:0 dropped:0 overruns:0 frame:0
          TX packets:734 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:51481 (51.4 KB)  TX bytes:51481 (51.4 KB)
tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:127.0.1.1  P-t-P:127.0.1.1  Mask:255.255.255.255
          inet6 addr: fe80::1/64 Scope:Link
          inet6 addr: aaaa::1/64 Scope:Global
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:12 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:586 (586.0 B)  TX bytes:1046 (1.0 KB)

这是针对IPv6的!我试过这样的东西:

sudo ip -6 route add ff1e::/64 via fe80::1 dev tun0

不起作用。

编辑:

我尝试了下面的建议。我的路线现在看起来是这样的:

sudo ip -6 route
aaaa::/64 dev tun0  proto kernel  metric 256 
aa00::/8 via bbbb::2 dev eth0  metric 1024 
bbbb::/64 dev eth0  proto kernel  metric 256 
fe80::/64 dev eth0  proto kernel  metric 256 
fe80::/64 dev tun0  proto kernel  metric 256 
ff1e::/64 via fe80::1 dev eth0  metric 1024 

请注意,第二条路由是我的虚拟机(其地址为bbbb::3、bbbb::4…)用来联系我在网络中的节点(其地址如aaaa::11:22ff:fe33:4402)的路由,这是有效的。节点连接到bbbb::2虚拟机。

但是,当VM发布到例如ff1e:101:a::4时,bbbb::2上的eth0接口会检测到这一点,但仍然不会将其转发到tun0。Tun0有一个aaaa::1/64全局地址,但"sudo ip-6 route add ff1e::/64 via aaaa:1 dev eth0"命令给出"RTNETLINK answers:No route to host"。尝试添加完整的IPv6多播地址(如"sudo ip-6 route add ff1e:101:a::4/128 via fe80::1 dev-eth0")也不会产生任何结果,但确实添加了路由。

编辑编辑:在第二次建议后添加表格:

looci@looci:~$ sudo ip -6 route add ff1e::/64 dev tun0 table local
looci@looci:~$ ip -6 route
aaaa::/64 dev tun0  proto kernel  metric 256 
aa00::/8 via bbbb::2 dev eth0  metric 1024 
bbbb::/64 dev eth0  proto kernel  metric 256 
fe80::/64 dev eth0  proto kernel  metric 256 
fe80::/64 dev tun0  proto kernel  metric 256 
ff1e::/64 via fe80::1 dev eth0  metric 1024 
ff1e:101:a::4 via fe80::1 dev eth0  metric 1024 
looci@looci:~$ ip -6 route show table local
local ::1 via :: dev lo  proto none  metric 0 
local aaaa:: via :: dev lo  proto none  metric 0 
local aaaa::1 via :: dev lo  proto none  metric 0 
local bbbb:: via :: dev lo  proto none  metric 0 
local bbbb::2 via :: dev lo  proto none  metric 0 
local fe80:: via :: dev lo  proto none  metric 0 
local fe80:: via :: dev lo  proto none  metric 0 
local fe80::1 via :: dev lo  proto none  metric 0 
local fe80::250:56ff:fe24:dd45 via :: dev lo  proto none  metric 0 
ff1e::/64 dev tun0  metric 1024 
ff00::/8 dev eth0  metric 256 
ff00::/8 dev tun0  metric 256 
looci@looci:~$ ip -6 route show table main
aaaa::/64 dev tun0  proto kernel  metric 256 
aa00::/8 via bbbb::2 dev eth0  metric 1024 
bbbb::/64 dev eth0  proto kernel  metric 256 
fe80::/64 dev eth0  proto kernel  metric 256 
fe80::/64 dev tun0  proto kernel  metric 256 
ff1e::/64 via fe80::1 dev eth0  metric 1024 
ff1e:101:a::4 via fe80::1 dev eth0  metric 1024 

我宁愿写sudo ip -6 route add ff1e::/64 via fe80::1 dev eth0,这意味着在目标为ff1e::的eth0上接收的每个数据包都会到达地址fe80::1。但别忘了用sudo sysctl -w net.ipv6.conf.all.forwarding=1在Linux中启用IP转发。

此外,我想,如果你想将这个多播udp数据包注入6LoWPAN网络,你必须在你的rpl边界路由器中用UIP_CONF_IPV6_multicast激活多播转发,并选择一个用UIP_MCAST6_CONF_engine的多播引擎。

更新:

然后你可以试试这样的东西:

ip -6 route add ff1e::/64 dev tun0 table local

完整的解释可以在这里找到。

最新更新