构建你的动态路由内网 - OSPF 入门小记
前言
Open Shortest Path First (OSPF) 是一种好用的动态路由协议,采用 IP proto 89 交换信息,要求两端对等。可以在广播、点对点和点对多点的环境使用。
这几天也是试了下水,发现比静态路由舒服一点,顺便也给我的内网规划了一下,这里稍微记录一下配置的东西。
阅读建议:非常推荐先会基本的计算机网络和路由原理。
安装软件包
在普通的 Linux 设备上,我们可以通过 frr 来构建这些服务。例如,在 OpenWrt 上,我们需要使用如下的包:
frr
frr-ospf6d
frr-ospfd
frr-staticd
frr-watchfrr
frr-zebra本文使用 10.2.1-2 版本
不同的版本可能命令略有差异,具体以实际为准。
Frr 基础使用
frr 提供了一个集中的命令行控制台叫做 vtysh,需要使用 root 权限运行。它的命令和 Cisco 的 IOS 长得很像,玩过 Packet Tracer 的应该知道怎么个事。
命令也是分作用域的,比如刚开始 # 下面我们只能做一些信息查询的工作,比如
show ip route: 查询 IPv4 路由信息show ipv6 route: 查询 IPv6 路由信息show ip ospf neigh: 查询 IPv4 OSPF 邻居show ipv6 ospf6 neigh: 查询 IPv6 OSPF 邻居show running-conf: 查询正在运行的配置,其实就是按照层级记录采用了的配置命令,可以手动重现write: 将当前配置写入配置文件,重启后也有效
而在基础模式下输入 conf 我们就进入了配置模式。这个模式我们可以配置全局的一些东西,比如
router-id <A.B.C.D>可以配置路由器 ID
在配置模式下,我们还可以使用 router <xxx> 来配置某一个路由协议,使用 interface <xxx> 来配置一个接口。
此外,如果想要删除某个配置,在原来配置命令的前面加 no 就可以了。
实验
场景如下,两台路由器 A 和 B 通过两个 WireGuard 隧道连接(IPv4 和 IPv6 分离),隧道内允许的 IP 都是 0.0.0.0/0 和 ::/0。
| 路由器 | Router ID | IPv4 隧道地址 | IPv6 隧道地址 (ULA) | 宣告的 IPv4 块 | 宣告的 IPv6 块 |
|---|---|---|---|---|---|
| A | 192.168.0.254 | 192.168.0.254/32 | fd00:f000::1/128, fe80::192:168:0:254/64 | 192.168.0.0/22 | fd00:10::/60 |
| B | 192.168.8.254 | 192.168.8.254/32 | fd00:f000::2/128, fe80::192:168:8:254/64 | 192.168.8.0/22 | fd00:20::/60 |
注意
Router A 的隧道地址 (192.168.0.254) 包含在其本地宣告块 (192.168.0.0/22) 内。这不是一个好的分离实践,但是我本地为了方便管理就这么干了,而由于我们使用了 /32 和 point-to-point 网络类型,有一个更长的前缀路由,OSPF 可以正常工作。
相关信息
router ospf下面的network指令不能和使用了ip ospf area x.y.z.w的interface同时存在。以下还聚合宣告了块,这要求要么 area 中有至少一个活动路由,要么配置一个静态路由然后在
router ospf下做redistribute static。后者可能还需要挂 filter,不然会把所有静态路由都宣布出去。
以下是最终的示意配置文件,供参考:
路由器 A (R-A):
!
frr version 10.2.1
frr defaults traditional
hostname R-A
log syslog
!
password [YOUR_SECURE_PASSWORD]
!
ip route 192.168.0.0/16 reject # 内部地址防环/黑洞策略
ip router-id 192.168.0.254 # 路由器A的Router ID
!
interface eth0
ip address 192.168.3.254/24 # 假设eth0的IP
ip ospf area 2.0.0.0 # 本地区域 2.0.0.0
exit
!
interface wg4
ip address 192.168.0.254/32 # 隧道IPv4地址 (简易起见与Router ID一致)
ip ospf area 0 # 骨干网区域,area 0 = 0.0.0.0
ip ospf network point-to-point # 指定为点对点网络
no ip ospf passive # 在这个接口上取消被动接口,即宣告 OSPF 信息
exit
!
interface wg6
ipv6 address fd00:f000::1/128 # 隧道IPv6 ULA地址
ipv6 address fe80::192:168:0:254/64 # 链路本地地址
ipv6 ospf6 area 0
ipv6 ospf6 network point-to-point
exit
!
router ospf
passive-interface default # 默认接口被动,即默认不宣告 OSPF
area 2.0.0.0 range 192.168.0.0/22 # 聚合/通告本地网络 (A 的本地块)
default-information originate # (可选) 宣告一个默认路由
exit
!
router ospf6
ospf6 router-id 192.168.0.254 # 这个 router-id 似乎是独立的
area 2.0.0.0 range fd00:10::/60 # 聚合/通告本地网络 (A的本地块)
exit
!
access-list vty seq 5 permit 127.0.0.0/8
access-list vty seq 10 deny any
!
line vty
access-class vty
exit
!
end路由器 B (R-B):
!
frr version 10.2.1
frr defaults traditional
hostname R-B
log syslog
!
password [YOUR_SECURE_PASSWORD]
!
ip route 192.168.0.0/16 reject # 内部地址防环/黑洞策略
ip router-id 192.168.8.254 # 路由器B的Router ID (与隧道IP一致)
!
interface eth0
ip address 192.168.11.254/24 # 假设eth0的IP
ip ospf area 1.0.0.0
ip ospf network broadcast # 这个接口是广播接口,可以通过交换机连接子 OSPF 交换机
ip ospf priority 255 # 主路由器给高优先级,DR/BDR 选举时成为 DR
ipv6 ospf6 area 1.0.0.0
no ip ospf passive
exit
!
interface wg4
ip address 192.168.8.254/32 # 隧道IPv4地址 (与Router ID一致)
ip ospf area 0
ip ospf network point-to-point
no ip ospf passive
exit
!
interface wg6
ipv6 address fd00:f000::2/128 # 隧道IPv6 ULA地址
ipv6 address fe80::192:168:8:254/64 # 链路本地地址
ipv6 ospf6 area 0
ipv6 ospf6 network point-to-point
exit
!
router ospf
passive-interface default
area 1.0.0.0 range 192.168.8.0/22 # 聚合/通告本地网络 (B的本地块)
exit
!
router ospf6
area 1.0.0.0 range fd00:20::/60 # 聚合/通告本地网络 (B的本地块)
exit
!
access-list vty seq 5 permit 127.0.0.0/8
access-list vty seq 10 deny any
!
line vty
access-class vty
exit
!
end效果
查看路由表,可以看到对方宣告过来的路由以 O>* 标记,这表明路由是 OSPF 宣告的,已被选中并安装到内核中。
然后 ping 一下,双方都可以 ping 通。
EOF~