我正在为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
完整的解释可以在这里找到。