3. Linux 的 OLSR

Linux 有几种 OLSR 实现,但并非所有实现都支持 IPv6。您应该了解如何在 Linux 上启用和使用 IPv6。Peter Bieringer 撰写了一篇优秀的 Linux IPv6 HOWTO

有一种 OLSR 实现正逐渐成为“标准”并且应用最广泛。它的描述性名称为 “OLSRd” (旧的 Unik-OLSR)。

OLSRd 是基于 INRA C 代码的实现,但几乎已完全重写,因此原始 INRA 代码所剩无几(这意味着它几乎是 GPL)。OLSRd 也正处于快速开发中,如果您报告错误,通常会在数小时内修复。

OLSRd 完全符合 OLSR RFC,支持插件,并且它有一个可选的 GUI 界面(用于查看正在发生的事情)。该实现还有一个信息丰富的“最新”网页,其中包含指向邮件列表和论文的链接。

3.1. 安装 OLSRd

每个月都会有多个 OLSRd 新版本发布,因此请查看 OLSRd 网站 以获取最新版本。

  1. 截至撰写本文时,最新版本为 0.4.3,但当您阅读本文时,几乎肯定会有新版本发布。从 http://www.olsr.org/index.cgi?action=download 获取最新版本。

  2. 解压缩、编译和安装源代码

          # tar jxvf uolsrd-x.y.z
          # cd unik-olsrd-x.y.z
          # make
          # make install
        
  3. 这个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、转发、配置文件解析等的信息消息)

3.2. 使用 OLSRd

3.2.1. 在一台主机上

当 OLSRd 安装并配置完成后,可以以 root 身份启动,使用命令

      # olsrd
    

中的所有设置/etc/olsrd.conf都可以通过命令行选项覆盖

      # olsrd -i eth1 -ipv6 -d 1
    

将启动olsrd监听接口eth1使用 IPv6 和调试消息。

我们启动 olsrd

    # olsrd -i eth1 -d 1 -ipv6

       *** UniK olsrd-0.4.3 ***   

    hello interval = 2.00       hello int nonwireless: = 4.00 (1)
    tc interval = 5.00          polling interval = 0.10 
    neighbor_hold_time = 6.00   neighbor_hold_time_nw = 12.00 
    topology_hold_time = 15.00  tos setting = 16 
    hna_interval = 15.00         mid_interval = 5.00
    Willingness set to 3 - next update in 20.000000 secs
    Using IP version 6
    Using multicast address ff05::15

     ---- Interface configuration ---- 

     eth1:                                          (2)
	    Address: fec0:106:2700::10
	    Multicast: ff05::15
	    Interface eth1 set up for use with index 0


     Main address: fec0:106:2700::10                (3)

     NEIGHBORS: l=linkstate, m=MPR, w=willingness   

     Thread created - polling every 0.10 seconds    (4)
     neighbor list: 11:43:17.214807
     neighbor list: 11:43:19.194967                
     neighbor list: 11:43:21.395046
     neighbor list: 11:43:23.604800
     neighbor list: 11:43:25.694875
     
(1)
这显示了 OLSRd 正在使用的所有设置。您可以通过在配置文件(/etc/olsrd.conf)中指定或在命令行中指定来覆盖这些设置。阅读 OLSR RFC 以了解所有这些设置的含义。
(2)
OLSRd 找到了我们的接口。如果您正在使用具有多个接口的 OLSRd,将生成 “多接口声明” (MID) 消息。
(3)
如果您正在使用具有多个接口的 OLSRd,它将选择指定的第一个接口作为“主”地址。
(4)
由于没有其他主机正在运行 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 的节点通信。

3.2.2. 添加其他主机

仅在一个节点上使用 OLSRd 没有意义,因此我们添加一些节点。您将看到 “邻居列表” 已更新

  neighbor list: 12:55:14.733586
  neighbor list: 12:55:18.803585
  Willingness for fec0:106:2700::11 changed from 0 to 3 - UPDATING  (1)
  neighbor list: 12:55:22.763585
  fec0:106:2700::11:l=0:m=0:w=3[2hlist:]                            (2)
  neighbor list: 12:55:26.833589
  fec0:106:2700::11:l=1:m=0:w=3[2hlist:]
  Willingness for fec0:106:2700::12 changed from 0 to 2 - UPDATING  (3)
  neighbor list: 12:55:30.903585
  fec0:106:2700::12:l=0:m=0:w=2[2hlist:]
  fec0:106:2700::11:l=1:m=0:w=3[2hlist:]
  neighbor list: 12:55:34.863585
  fec0:106:2700::12:l=0:m=0:w=2[2hlist:]
  fec0:106:2700::11:l=1:m=0:w=3[2hlist:]
  neighbor list: 12:55:39.153586
  fec0:106:2700::12:l=1:m=0:w=2[2hlist:fec0:106:2700::11:]          (4)
  fec0:106:2700::11:l=1:m=0:w=3[2hlist:fec0:106:2700::12:]          (5)
  neighbor list: 12:55:43.443605
  fec0:106:2700::12:l=1:m=0:w=2[2hlist:fec0:106:2700::11:]
  fec0:106:2700::11:l=1:m=0:w=3[2hlist:fec0:106:2700::12:]
  
(1)
检测到另一个节点(节点 B)。这指定了节点为其他节点携带和转发流量的意愿。这里的新节点fec0:106:2700::11愿意转发流量。电池电量低的host可能不愿意转发大量流量,- 因此它将声明较低的意愿值(基于电源状态的路由作为插件可用)。
(2)
该节点已添加到我们的路由表。我们还不能通过此节点到达任何其他节点,因为 2 跳邻居列表([2hlist:])为空。2 跳邻居是邻居听到的节点。
(3)
这是第三个节点(节点 C)正在运行 OLSRd。
(4)
在短时间后,当所有节点都已更新并计算了路由后,我们也可以通过另一个节点到达任何其他节点。2 跳邻居列表([2hlist:])已填充:我们可以通过节点B经由C.
(5)
在这里我们可以到达节点C经由B.

您还将看到路由表已使用新主机更新

    # 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 的真正魅力在于当您添加一堆节点并移动它们时。您仍然可以直接(如果它们很近)或通过其他节点到达每个节点。

3.2.3. 移动

当每个节点都可以到达每个其他节点时,就不好玩了。让我们开始移动节点,以便节点 “A”“B” 彼此超出(无线电)范围。因此,当我们移动节点 “A” 足够远以至于它无法听到节点 “C” 时,所有流量都必须通过节点 “B”

我们移动我们的三个节点,使节点AC必须通过节点B才能彼此到达。

提示:与其物理移动节点,不如使用ip6tables。您可以使用 MAC 地址丢弃所有数据包。您只需要在一个节点上阻止

   # ip6tables -A INPUT -m mac --mac-source XX:XX:XX:XX:XX:XX -j DROP
  

主机 A 上 OLSRd 的输出然后是

  neighbor list: 13:22:35.693587
  fec0:106:2700::11:l=1:m=1:w=3[2hlist:fec0:106:2700::12:]  (1)
  neighbor list: 13:22:40.093588
  fec0:106:2700::11:l=1:m=1:w=3[2hlist:fec0:106:2700::12:]
  neighbor list: 13:22:44.053594
  fec0:106:2700::11:l=1:m=1:w=3[2hlist:fec0:106:2700::12:]
  neighbor list: 13:22:48.233594
  fec0:106:2700::11:l=1:m=1:w=3[2hlist:fec0:106:2700::12:]
  neighbor list: 13:22:52.193605
  fec0:106:2700::11:l=1:m=1:w=3[2hlist:fec0:106:2700::12:]
  
(1)
我们可以直接到达节点B并且通过节点B我们可以到达节点C.

路由表也已更新。对于节点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 
    ...
 

3.3. HNA 消息怎么样?

“为了提供将外部路由信息注入 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 消息)。然后每个移动节点都使用最近的网关。

3.4. 插件支持

从 0.4.3 版本开始,OLSRd 也支持插件。插件可用于在 MANET 中添加扩展功能。如果只有一部分节点知道如何解释消息类型,它将通过 “默认转发算法” (参见 OLSR RFC 中的 3.4.1 节)由所有节点转发。这样,某些节点可以将特殊功能添加到 OLSR 中。

截至撰写本文时,OLSRd 版本中包含两个示例插件。其中一个插件添加了基于电源状态的路由。如果一个节点电池电量低,它可以降低其意愿,流量可能会通过其他节点路由。

3.5. 可选 GUI

OLSRd 还有一个可选的 GUI,可以显示可用节点列表并捕获数据包。要编译 GUI 前端,您必须安装 GTK2。在unik-olsrd-x.y.z目录中执行

     # cd front-end
     # make
     # make install
    

Note

记住要使用-ipc开关或设置IPC-CONNECT yes/etc/olsrd.conf来启动 OLSRd,以启用 GUI 与 OLSRd 通信。

要查看 GUI 用法的一些示例,请查看 http://www.olsr.org/index.cgi?action=gui

3.6. 其他 OLSR 实现

还有其他 OLSR 实现,但没有一个像 OLSRd 那样受欢迎,并且没有一个(除了 QOLSR?)完全符合 RFC。

3.6.1. INRIA

INRIA 是最早的 OLSR 实现之一 http://hipercom.inria.fr/olsr/#code。他们的网站已经很久没有更新了,您可以下载的 OLSR 代码仅符合 draft-ietf-manet-olsr-03.txt(现在是 RFC)。应该还有另一个更新版本的 INRIA olsr,但我没有找到。INRIA OLSR 不支持 IPv6。

3.6.2. NROLSR

“美国海军研究实验室” (NRL) 也有一个 OLSR 实现。它是用 C++ 编写的,并支持 IPv6。 http://pf.itd.nrl.navy.mil/projects/olsr/

3.6.3. CRCOLSR

CRCOLSR 是基于法国 INRIA 代码的实现。它应该由加拿大的“通信研究中心” (CRC) 维护。但截至撰写本文时,自 2003 年 4 月 3 日以来一直没有新版本发布。 http://pf.itd.nrl.navy.mil/projects/olsr/

3.6.4. QOLSR

QOLSR 旨在在无线移动自组织网络中提供“服务质量”路由。在撰写本文时,尚无 QoS 支持,并且对 ipv4/ipv6 的支持在编译时触发。用 C++ 编写。