Appearance
OSPF
最近不少群友有把自己的其他服务器也接入自己的 AS 的需求,那这篇教程也是时候该出了。
总览
我们先不急着开始配,先了解一下我们需要一个什么效果。
DN11 作为一个发展了有一段时间的实验性网络,我们目前有很大一批人,他们手上都已经有了一个节点,并且在这个节点上配置了 BGP 从而联通到其他节点。那这个情景下,他们的自治域就是由那一个节点组成的单节点自治域。我们现在需要添加一个新的节点到这个自治域,我们需要解决两个问题。
- 这两个节点之间需要组网
- 需要把某一个节点获取到的 BGP 路由与其他节点做一个同步
这两件事情我们分别将通过 OSPF 和 IBGP 实现。OSPF 是 DN11 的老东西,从使用者的角度看,就一个通过获取全局拓扑计算最短路的路由协议。IBGP 是 BGP 的一种,BGP 协议分为两种 EBGP 和 IBGP, 他们分别用于将 BGP 路由发给其他 AS 和将 BGP 路由同步到自己 AS 的其他节点。
本篇我们着重解决第一个问题,AS 内部节点的组网。
入口文件
由于这次的配置文件比较长,我们会把他切分到各个文件中,所以先介绍一下入口文件 bird.conf
的配置
bird
log syslog all;
debug protocols all;
router id 172.16.4.6;
protocol device{
}
protocol kernel{
ipv4 {
import none;
export all;
};
}
ipv4 table OSPF_table;
ipv4 table BGP_table;
include "/etc/bird/ospf.conf";
include "/etc/bird/bgp.conf";
include "/etc/bird/ibgp.conf";
protocol pipe pipe_ospf_table{
table master4;
peer table OSPF_table;
import filter {
krt_prefsrc=172.16.4.6;
accept;
};
export none;
}
protocol pipe pipe_bgp_table {
table master4;
peer table BGP_table;
import filter {
if source != RTS_BGP then reject;
krt_prefsrc=172.16.4.6;
accept;
};
export none;
}
我们很容易会发现,入口文件这里使用了三个 include
关键字,我们在这个入口文件里分别引用了三个文件,后续我们的 OSPF IBGP 和 EBGP 的实际逻辑都会在里面去实现。
需要注意的时候,bird 的配置文件是有序的,从上面的配置文件中可以看出来,在我们 include 之前,我们声明了两张路由表。如果我们调换一下位置,bird 就会报错说这个 symbol 是未定义的。当然你也可以把这几个表的声明给放到相应的文件内,这是没有问题的,bird 本身不存在作用域问题。我这里放在入口文件是为了入口文件本身能够逻辑自洽,也是为了整体看上去比较清真。
后面两个 pipe 分别是为了导入 ospf 路由和 bgp 路由到 master4, master4 表的路由最终在 kernel 协议里导入到系统表。这里给 BGP_table 加了 filter 是为了防止用于静态宣告的 Static 路由进入系统表。
铺设 OSPF
理论上讲保证自治域内部的通畅是一个自治域的基本要求,一般需要先把自己配通了再去想着和其他人 peer。所以确保自己内网的通畅是第一步。我们下面使用 OSPF 来确保 AS 内部的连通性。
bird
protocol ospf v2 selfnet {
ipv4 {
table OSPF_table;
export all;
import all;
};
area 0.0.0.0 {
# change it
stubnet 172.16.4.6/32;
# change it
interface "wg0" {
cost 20;
type ptp;
};
# change it
interface "lan" {
type nonbroadcast;
};
};
}
上面的这段配置,声明了一个名为 selfnet ospfv2 的协议实例,名字可以随便取。在这个实例中,首先声明了启用 ipv4 并将 OSPF_table 表中的所有路由导出到 OSPF,同时也将从 OSPF 收到的所有路由导入到 OSPF_table。
随后,声明了一个 area id 为 0.0.0.0 的 area,这是一个 OSPF 的区域,用于控制 LSA 洪泛在某个特定范围内,其中 0.0.0.0 代表骨干(backbone),area id 在大型 OSPF 网络中有一些应用,就以这里的规模,无需理会。
在 area 0.0.0.0 中,声明了三个不同的东西,首先介绍 type ptp
,它这里表示一个点对点的链路,需要在 interface 中填写和另一台服务器的隧道的接口名称,OSPF 会自动在这个接口里通过多播来发现新的 OSPF 邻居。
除此之外这个 area 块里还声明了一个 stubnet 和一个 nonbroadcast,一般来说这两个是选其一。如果该设备是你的一个云服务器,上面没有什么子网可言,写一个 stubnet 就够了,内容是你的服务器在 DN11 中的 IP。如果你不知道这是什么,可以随便取一个并将其绑定在 lo 口,例如:
bash
ip addr add 172.16.4.6 dev lo
为了让这个添加到 lo 的 ip 永久生效,你需要看看你的系统的网络是怎么管理的,下面展示 ubuntu 下的 netplan 的配置。
yaml
# cat /etc/netplan/70-lo.yaml
network:
ethernets:
lo:
addresses: [172.16.4.6/32]
version: 2
后续就可以使用这个 IP 在 DN11 中访问你的服务器了。
而 nonbroadcast 用于告诉 OSPF 去学习一个接口的路由但不在这个接口发送 OSPF 广播。如果你的设备下面有一个子网,比如说家里,宿舍里,建议把你的子网网段迁移到 DN11 段并且通过这个方式让 OSPF 来学习并广播这个接口上的地址。
完成上面的操作后你需要在另一台机器上做相同的操作,然后拉隧道并添加你的隧道到 ospf 的配置文件,就像上面的 wg0 一样。
ospf 的 cost 随你喜欢,我个人一般综合判断带宽和延时决定大概给多少 cost。
用于 OSPF 的隧道配置与此前在 bgp 章节讲述的一致,不再赘述
注意 OSPF 要求两边 MTU 一致,如果你在调试 bird 的时候发现日志里有提到 MTU 问题,请添加 MTU = 1420
在两边的 [Interface]
下。还是有问题的话尝试继续减小 MTU。
如果两边能通过隧道 IP ping 通了那说明你的 AS 内部已经通了,可以进行下一步配置了。
上面配好之后如果你先注释掉 IBGP 的配置文件的 include,你会发现你和别人起 EBGP 的那台设备一切正常,而另一台机器只有 OSPF 的路由,缺少到其他 AS 的路由,这便是 IBGP 想要解决的问题。我们在下一篇中会通过 IBGP 来同步 AS 不同边界网关获取到的外部 EBGP 路由。
疑难解答
OSPF 没连上
ip addr
看看你的 wg 接口绑定了几个 IP 上去,多于一个那就 remake WireGuard 配置文件。如果你在 PostUp 里绑 IP 了那就不要 Address 字段了。
也有可能是 MTU 问题,看看 bird 日志 journalctl -xeu bird
,用 op 的看 web。