RIP 路由配置

RIP 路由协议介绍

路由信息协议(Routing Information Protocol,RIP)是一种基于距离向量算法的内部网关协议(IGP),是最早开发的路由协议之一。RIP 使用跳数(hop count)作为路由度量,最大跳数限制为 15,这意味着 RIP 适用于小型网络。

RIP 有两个主要版本:

  • RIPv1:不支持子网掩码,不支持认证,使用广播更新
  • RIPv2:支持子网掩码,支持认证,使用组播更新(224.0.0.9)

在本文中,我们将使用 FRRouting(FRR)来配置 RIPv2,并通过 veth 对和网络命名空间来模拟多路由器环境。

RIP 特性

RIP 具有以下特性:

  • 简单易用:配置简单,易于理解和实现
  • 基于距离向量:使用 Bellman-Ford 算法计算最短路径
  • 周期性更新:默认每 30 秒广播/组播整个路由表
  • 水平分割:防止路由环路的基本机制
  • 路由毒化:将失效路由的度量值设为 16(无穷大)
  • 触发更新:路由变化时立即发送更新,不等待定时器
  • 最大跳数限制:15 跳,超过视为不可达

RIP 的主要优点是配置简单,适合小型网络;缺点是收敛速度慢,不适合大型网络,且不支持负载均衡和高级路由策略。

RIP 基本配置

我们将创建一个包含三个路由器的简单网络拓扑,并配置 RIPv2。

网络拓扑

+------------+         +------------+         +------------+
|            |         |            |         |            |
|  Router1   +---------+  Router2   +---------+  Router3   |
|            |         |            |         |            |
+------------+         +------------+         +------------+
   |                                             |
   |                                             |
   v                                             v
10.0.1.0/24                                  10.0.3.0/24
                

环境准备

首先,我们需要创建网络命名空间和 veth 对:

# 创建网络命名空间
sudo ip netns add r1
sudo ip netns add r2
sudo ip netns add r3

# 创建 veth 对
sudo ip link add r1-r2 type veth peer name r2-r1
sudo ip link add r2-r3 type veth peer name r3-r2

# 将 veth 对分配给相应的命名空间
sudo ip link set r1-r2 netns r1
sudo ip link set r2-r1 netns r2
sudo ip link set r2-r3 netns r2
sudo ip link set r3-r2 netns r3

# 配置 IP 地址
sudo ip netns exec r1 ip addr add 10.0.12.1/24 dev r1-r2
sudo ip netns exec r2 ip addr add 10.0.12.2/24 dev r2-r1
sudo ip netns exec r2 ip addr add 10.0.23.1/24 dev r2-r3
sudo ip netns exec r3 ip addr add 10.0.23.2/24 dev r3-r2

# 启用接口
sudo ip netns exec r1 ip link set r1-r2 up
sudo ip netns exec r1 ip link set lo up
sudo ip netns exec r2 ip link set r2-r1 up
sudo ip netns exec r2 ip link set r2-r3 up
sudo ip netns exec r2 ip link set lo up
sudo ip netns exec r3 ip link set r3-r2 up
sudo ip netns exec r3 ip link set lo up

# 启用 IP 转发
sudo ip netns exec r1 sysctl -w net.ipv4.ip_forward=1
sudo ip netns exec r2 sysctl -w net.ipv4.ip_forward=1
sudo ip netns exec r3 sysctl -w net.ipv4.ip_forward=1

# 添加本地网络
sudo ip netns exec r1 ip link add lo1 type dummy
sudo ip netns exec r1 ip link set lo1 up
sudo ip netns exec r1 ip addr add 10.0.1.1/24 dev lo1

sudo ip netns exec r3 ip link add lo3 type dummy
sudo ip netns exec r3 ip link set lo3 up
sudo ip netns exec r3 ip addr add 10.0.3.1/24 dev lo3
                

安装 FRRouting

确保已安装 FRRouting(FRR):

# 添加 FRR 官方 PPA
sudo add-apt-repository ppa:frrouting/frr-stable
sudo apt update
sudo apt install frr frr-pythontools
                

启用 RIP 路由协议:

sudo sed -i 's/ripd=no/ripd=yes/g' /etc/frr/daemons
sudo systemctl restart frr
                

配置 RIPv2

现在,我们将在每个路由器上配置 RIPv2:

Router1 配置

sudo ip netns exec r1 vtysh

# 进入配置模式
configure terminal

# 配置 RIP
router rip
 version 2
 network 10.0.12.0/24
 network 10.0.1.0/24
 no auto-summary

# 保存配置并退出
write
exit
                

Router2 配置

sudo ip netns exec r2 vtysh

# 进入配置模式
configure terminal

# 配置 RIP
router rip
 version 2
 network 10.0.12.0/24
 network 10.0.23.0/24
 no auto-summary

# 保存配置并退出
write
exit
                

Router3 配置

sudo ip netns exec r3 vtysh

# 进入配置模式
configure terminal

# 配置 RIP
router rip
 version 2
 network 10.0.23.0/24
 network 10.0.3.0/24
 no auto-summary

# 保存配置并退出
write
exit
                

或者,可以使用以下命令一次性配置:

# Router1 配置
sudo ip netns exec r1 vtysh -c "conf t" -c "router rip" -c "version 2" -c "network 10.0.12.0/24" -c "network 10.0.1.0/24" -c "no auto-summary" -c "write"

# Router2 配置
sudo ip netns exec r2 vtysh -c "conf t" -c "router rip" -c "version 2" -c "network 10.0.12.0/24" -c "network 10.0.23.0/24" -c "no auto-summary" -c "write"

# Router3 配置
sudo ip netns exec r3 vtysh -c "conf t" -c "router rip" -c "version 2" -c "network 10.0.23.0/24" -c "network 10.0.3.0/24" -c "no auto-summary" -c "write"
                

验证 RIP 配置

配置完成后,我们可以验证 RIP 是否正常工作:

# 查看 RIP 路由
sudo ip netns exec r1 vtysh -c "show ip rip"
sudo ip netns exec r2 vtysh -c "show ip rip"
sudo ip netns exec r3 vtysh -c "show ip rip"

# 查看 RIP 数据库
sudo ip netns exec r1 vtysh -c "show ip rip status"
sudo ip netns exec r2 vtysh -c "show ip rip status"
sudo ip netns exec r3 vtysh -c "show ip rip status"

# 查看路由表
sudo ip netns exec r1 vtysh -c "show ip route rip"
sudo ip netns exec r2 vtysh -c "show ip route rip"
sudo ip netns exec r3 vtysh -c "show ip route rip"
                

测试连通性

测试 Router1 是否可以访问 Router3 的本地网络:

sudo ip netns exec r1 ping 10.0.3.1 -c 4
                

测试 Router3 是否可以访问 Router1 的本地网络:

sudo ip netns exec r3 ping 10.0.1.1 -c 4
                

RIP 高级配置

除了基本配置外,RIP 还支持一些高级配置选项,如路由过滤、认证、定时器调整等。

RIP 认证

RIPv2 支持简单密码认证和 MD5 认证。以下是配置 MD5 认证的示例:

# Router1 配置
sudo ip netns exec r1 vtysh -c "conf t" -c "interface r1-r2" -c "ip rip authentication mode md5" -c "ip rip authentication key-chain ripkey" -c "key chain ripkey" -c "key 1" -c "key-string mypassword" -c "write"

# Router2 配置
sudo ip netns exec r2 vtysh -c "conf t" -c "interface r2-r1" -c "ip rip authentication mode md5" -c "ip rip authentication key-chain ripkey" -c "key chain ripkey" -c "key 1" -c "key-string mypassword" -c "write"
                

路由过滤

我们可以使用访问控制列表和分布列表来过滤 RIP 路由:

# Router1 配置:阻止 10.0.3.0/24 网络
sudo ip netns exec r1 vtysh -c "conf t" -c "access-list 1 deny 10.0.3.0/24" -c "access-list 1 permit any" -c "router rip" -c "distribute-list 1 in" -c "write"
                

默认路由

在 RIP 中配置默认路由:

# Router1 配置:生成默认路由
sudo ip netns exec r1 vtysh -c "conf t" -c "router rip" -c "default-information originate" -c "write"
                

调整 RIP 定时器

RIP 使用三个主要定时器:更新定时器、无效定时器和垃圾收集定时器。我们可以调整这些定时器以优化网络性能:

# Router1 配置:调整 RIP 定时器
sudo ip netns exec r1 vtysh -c "conf t" -c "router rip" -c "timers basic 20 80 80 120" -c "write"
                

上述命令设置了以下定时器:

  • 更新定时器:20 秒(默认 30 秒)
  • 无效定时器:80 秒(默认 180 秒)
  • 垃圾收集定时器:80 秒(默认 120 秒)
  • 超时定时器:120 秒(默认 240 秒)

被动接口

在不需要建立邻居关系的接口上,我们可以将其配置为被动接口,以减少不必要的 RIP 更新:

# Router1 配置:将 lo1 接口设置为被动接口
sudo ip netns exec r1 vtysh -c "conf t" -c "router rip" -c "passive-interface lo1" -c "write"
                

水平分割和路由毒化

水平分割和路由毒化是 RIP 防止路由环路的机制。默认情况下,这些功能是启用的,但我们可以根据需要禁用它们:

# 禁用水平分割
sudo ip netns exec r1 vtysh -c "conf t" -c "interface r1-r2" -c "no ip rip split-horizon" -c "write"

# 启用水平分割
sudo ip netns exec r1 vtysh -c "conf t" -c "interface r1-r2" -c "ip rip split-horizon" -c "write"

# 启用带毒性逆转的水平分割
sudo ip netns exec r1 vtysh -c "conf t" -c "interface r1-r2" -c "ip rip split-horizon poisoned-reverse" -c "write"
                

复杂拓扑中的 RIP 配置

现在,我们将创建一个更复杂的网络拓扑,包含四个路由器,并配置 RIPv2:

网络拓扑

                    +------------+
                    |            |
                    |  Router4   |
                    |            |
                    +------------+
                          |
                          | 10.0.24.0/24
                          |
+------------+         +------------+         +------------+
|            |         |            |         |            |
|  Router1   +---------+  Router2   +---------+  Router3   |
|            |         |            |         |            |
+------------+         +------------+         +------------+
   |                                             |
   |                                             |
   v                                             v
10.0.1.0/24                                  10.0.3.0/24
                

环境准备

# 创建网络命名空间
sudo ip netns add r4

# 创建 veth 对
sudo ip link add r2-r4 type veth peer name r4-r2

# 将 veth 对分配给相应的命名空间
sudo ip link set r2-r4 netns r2
sudo ip link set r4-r2 netns r4

# 配置 IP 地址
sudo ip netns exec r2 ip addr add 10.0.24.1/24 dev r2-r4
sudo ip netns exec r4 ip addr add 10.0.24.2/24 dev r4-r2

# 启用接口
sudo ip netns exec r2 ip link set r2-r4 up
sudo ip netns exec r4 ip link set r4-r2 up
sudo ip netns exec r4 ip link set lo up

# 启用 IP 转发
sudo ip netns exec r4 sysctl -w net.ipv4.ip_forward=1

# 添加本地网络
sudo ip netns exec r4 ip link add lo4 type dummy
sudo ip netns exec r4 ip link set lo4 up
sudo ip netns exec r4 ip addr add 10.0.4.1/24 dev lo4
                

配置 RIPv2

更新 Router2 的 RIP 配置,并配置 Router4:

# Router2 配置
sudo ip netns exec r2 vtysh -c "conf t" -c "router rip" -c "network 10.0.24.0/24" -c "write"

# Router4 配置
sudo ip netns exec r4 vtysh -c "conf t" -c "router rip" -c "version 2" -c "network 10.0.24.0/24" -c "network 10.0.4.0/24" -c "no auto-summary" -c "write"
                

验证配置

# 查看路由表
sudo ip netns exec r1 vtysh -c "show ip route rip"
sudo ip netns exec r4 vtysh -c "show ip route rip"

# 测试连通性
sudo ip netns exec r1 ping 10.0.4.1 -c 4
sudo ip netns exec r4 ping 10.0.1.1 -c 4
                

RIP 与其他路由协议的比较

RIP 是最简单的动态路由协议之一,但在某些方面不如其他路由协议。以下是 RIP 与 OSPF 和 BGP 的比较:

特性 RIP OSPF BGP
算法 距离向量 链路状态 路径向量
收敛速度 中等
资源消耗 中等
可扩展性 小型网络 中大型网络 互联网规模
路由度量 跳数 成本 多种属性
最大跳数 15 无限制 无限制
更新方式 周期性 触发式 触发式
适用场景 简单网络 企业内部网络 互联网/ISP

在选择路由协议时,应考虑网络规模、复杂性、收敛要求和资源限制等因素。对于小型网络,RIP 可能是一个简单而有效的选择;对于中大型网络,OSPF 通常是更好的选择;对于 ISP 和互联网级别的网络,BGP 是必不可少的。

RIP 故障排除

在配置 RIP 时,可能会遇到各种问题。以下是一些常见问题及其解决方法:

邻居关系问题

  • 版本不匹配:确保所有路由器都使用相同的 RIP 版本
  • 认证失败:检查认证类型和密钥是否匹配
  • 网络语句缺失:确保已配置正确的网络语句

路由不通问题

  • 路由过滤:检查是否有访问控制列表或分布列表阻止了路由
  • 自动汇总:检查是否启用了自动汇总(auto-summary)
  • 跳数限制:确保目标网络在 15 跳以内

调试命令

# 启用 RIP 调试
sudo ip netns exec r1 vtysh -c "debug rip packet"
sudo ip netns exec r1 vtysh -c "debug rip events"

# 查看日志
sudo ip netns exec r1 vtysh -c "show logging"

# 禁用调试
sudo ip netns exec r1 vtysh -c "no debug all"
                

总结

RIP 是一种简单而实用的动态路由协议,适用于小型网络。虽然它有一些限制,如最大跳数为 15 和收敛速度慢,但它的简单性和低资源消耗使其在某些场景下仍然有用。

在本文中,我们介绍了 RIP 的基本概念、配置方法和高级选项,并通过实际示例演示了如何在 veth 对和网络命名空间环境中配置 RIP。我们还比较了 RIP 与其他路由协议的异同,并提供了故障排除的方法。

通过掌握 RIP 的配置和使用,我们可以更好地理解动态路由的工作原理,为学习更复杂的路由协议奠定基础。