Linux 有几种 OLSR 实现,但并非所有实现都支持 IPv6。您应该了解如何在 Linux 上启用和使用 IPv6。Peter Bieringer 撰写了一篇优秀的 Linux IPv6 HOWTO。
有一种 OLSR 实现正逐渐成为“标准”并且应用最广泛。它的描述性名称为 “OLSRd” (旧的 Unik-OLSR)。
OLSRd 是基于 INRA C 代码的实现,但几乎已完全重写,因此原始 INRA 代码所剩无几(这意味着它几乎是 GPL)。OLSRd 也正处于快速开发中,如果您报告错误,通常会在数小时内修复。
OLSRd 完全符合 OLSR RFC,支持插件,并且它有一个可选的 GUI 界面(用于查看正在发生的事情)。该实现还有一个信息丰富的“最新”网页,其中包含指向邮件列表和论文的链接。
每个月都会有多个 OLSRd 新版本发布,因此请查看 OLSRd 网站 以获取最新版本。
截至撰写本文时,最新版本为 0.4.3,但当您阅读本文时,几乎肯定会有新版本发布。从 http://www.olsr.org/index.cgi?action=download 获取最新版本。
解压缩、编译和安装源代码
# tar jxvf uolsrd-x.y.z # cd unik-olsrd-x.y.z # make # make install |
这个olsrd将被安装到/usr/bin/并且默认配置文件olsrd.conf可以在以下位置找到/etc
查看/etc/olsrd.conf配置文件,并更改值以适合您的系统。此文件中的所有值都可以使用命令行选项覆盖到olsrd。主要需要更改的选项是
# Debug level(0-9) # If set to 0 the daemon runs in the background DEBUG 1 # IP version to use (4 or 6) IPVERSION 6 # A list of whitespace separated interface names INTERFACES eth1 |
稍后,当您知道 OLSRd 配置正确时,您可以将 “DEBUG” 设置为0使其在后台运行。然后您也可以将其添加到您的 init 脚本中。但要首先测试一切,请至少将其设置为1(将其设置得更高会产生更多关于 APM、转发、配置文件解析等的信息消息)
当 OLSRd 安装并配置完成后,可以以 root 身份启动,使用命令
# olsrd |
中的所有设置/etc/olsrd.conf都可以通过命令行选项覆盖
# olsrd -i eth1 -ipv6 -d 1 |
将启动olsrd监听接口eth1使用 IPv6 和调试消息。
我们启动 olsrd
另一个值得注意的事情是,路由表中添加了一个条目
# route -A inet6 Destination: Next Hop Flags Metric Ref Use Iface ... ff05::15/128 ff05::15 UAC 0 1 1 eth1 ... |
这是 IPv6 组播地址,OLSR 使用它与其他运行 OLSR 的节点通信。
仅在一个节点上使用 OLSRd 没有意义,因此我们添加一些节点。您将看到 “邻居列表” 已更新
您还将看到路由表已使用新主机更新
# route -A inet6 Destination: Next Hop Flags Metric Ref Use Iface ... fec0:106:2700::11/128 :: UH 1 0 0 eth1 fec0:106:2700::12/128 :: UH 1 0 0 eth1 ... |
OLSR 的真正魅力在于当您添加一堆节点并移动它们时。您仍然可以直接(如果它们很近)或通过其他节点到达每个节点。
当每个节点都可以到达每个其他节点时,就不好玩了。让我们开始移动节点,以便节点 “A” 和 “B” 彼此超出(无线电)范围。因此,当我们移动节点 “A” 足够远以至于它无法听到节点 “C” 时,所有流量都必须通过节点 “B”
我们移动我们的三个节点,使节点A和C必须通过节点B才能彼此到达。
提示:与其物理移动节点,不如使用ip6tables。您可以使用 MAC 地址丢弃所有数据包。您只需要在一个节点上阻止
# ip6tables -A INPUT -m mac --mac-source XX:XX:XX:XX:XX:XX -j DROP |
主机 A 上 OLSRd 的输出然后是
路由表也已更新。对于节点A要到达节点C它必须通过节点B:
# route -A inet6 Destination: Next Hop Flags Metric Ref Use Iface ... fec0:106:2700::11/128 :: UH 1 1 0 eth1 fec0:106:2700::12/128 fec0:106:2700::11 UGH 2 0 0 eth1 ... |
“为了提供将外部路由信息注入 OLSR MANET 的能力,具有此类非 MANET 接口的节点会定期发布主机和网络关联 (HNA) 消息,其中包含足够的信息供接收者构建适当的路由表。”
“这种情况的一个例子可能是节点配备了连接到较大网络的固定网络(例如,以太网)以及运行 OLSR 的无线网络接口。” --- RFC3626:OLSR,第 12 节(第 51 页)。
具有网关 (GW) 的 OLSR,它发送 HNA 消息。然后所有其他节点都可以访问“互联网”
要让一个节点充当网关并发送 HNA 消息,您必须更改HNA6在/etc/olsrd.conf:
# HNA IPv6 routes # syntax: netaddr prefix # Example Internet gateway HNA6 :: 0 |
当您启动OLSRd时,您将看到节点定期发送 HNA 消息
... Sending HNA (48 bytes)... ... |
当其他节点收到 HNA 消息时,它们会更新其路由表
# route -A inet6 Destination: Next Hop Flags Metric Ref Use Iface ... ::/0 fec0:106:2700::1 UG 1 0 0 eth1 ... |
您也可以在 MANET 中使用多个节点充当网关(发送 HNA 消息)。然后每个移动节点都使用最近的网关。
从 0.4.3 版本开始,OLSRd 也支持插件。插件可用于在 MANET 中添加扩展功能。如果只有一部分节点知道如何解释消息类型,它将通过 “默认转发算法” (参见 OLSR RFC 中的 3.4.1 节)由所有节点转发。这样,某些节点可以将特殊功能添加到 OLSR 中。
截至撰写本文时,OLSRd 版本中包含两个示例插件。其中一个插件添加了基于电源状态的路由。如果一个节点电池电量低,它可以降低其意愿,流量可能会通过其他节点路由。
OLSRd 还有一个可选的 GUI,可以显示可用节点列表并捕获数据包。要编译 GUI 前端,您必须安装 GTK2。在unik-olsrd-x.y.z目录中执行
# cd front-end # make # make install |
![]() | 记住要使用-ipc开关或设置IPC-CONNECT yes在/etc/olsrd.conf来启动 OLSRd,以启用 GUI 与 OLSRd 通信。 |
要查看 GUI 用法的一些示例,请查看 http://www.olsr.org/index.cgi?action=gui
还有其他 OLSR 实现,但没有一个像 OLSRd 那样受欢迎,并且没有一个(除了 QOLSR?)完全符合 RFC。
INRIA 是最早的 OLSR 实现之一 http://hipercom.inria.fr/olsr/#code。他们的网站已经很久没有更新了,您可以下载的 OLSR 代码仅符合 draft-ietf-manet-olsr-03.txt(现在是 RFC)。应该还有另一个更新版本的 INRIA olsr,但我没有找到。INRIA OLSR 不支持 IPv6。
“美国海军研究实验室” (NRL) 也有一个 OLSR 实现。它是用 C++ 编写的,并支持 IPv6。 http://pf.itd.nrl.navy.mil/projects/olsr/
CRCOLSR 是基于法国 INRIA 代码的实现。它应该由加拿大的“通信研究中心” (CRC) 维护。但截至撰写本文时,自 2003 年 4 月 3 日以来一直没有新版本发布。 http://pf.itd.nrl.navy.mil/projects/olsr/