全局TOP
Bird2.png
配置说明
- Bird文档地址https://bird.network.cz/?get_doc&f=bird.html&v=20
- 全系为Debian,全通过Tunnel P2P连接。其中Node C和Node D为Debian 10 无法直接安装BIRD2,我只需要添加IPV4,所以用BIRD1替代。Node A 和Node B为Debian 11 安装BIRD2。
- 其中Node A 只被动接受路由,Node B发送路由并且接受Node C发送的路由,Node C只发送路由,Node D临时设置不接受路由也不发送路由,只做出口。
- 所有Nodes通过BFD进行连线状态检测,发现down立即切换二号路线。
- Node D中的WARP Tunnel关闭设定全局路由表:Table = off
详细配置
- Node A
router id 10.120.0.2;#唯一路由ID,自定义
filter Block_All { #定义一个过滤器,全部拒绝
reject;
}
protocol device Local {
scan time 60;
}
protocol kernel Main {
scan time 60;
metric 64;
ipv4 {#使用IPV4
import filter Block_All;#使用过滤器禁止从本机内核路由表导出到全局路由表
export all;#允许从全局路由中导入路由表到本机内核路由表
};
}
protocol bfd Nodes {#新建一个名为Nodes的BFD块
interface "vpn0" {#监听设备改为Tunnel的NIC
passive;#被动模式
min rx interval 100 ms;
min tx interval 100 ms;
idle tx interval 300 ms;
multiplier 10;
};
neighbor 10.120.0.1 dev "vpn0";#本机到本机的邻居的路由也就是Node B,走vpn0这个设备
}
protocol ospf v2 Lan {#新建一个名为Lan OSPF协议块,因为是BIRD2,协议版本选V2
tick 2;
rfc1583compat yes;
ipv4 {#使用IPV4
import all;#允许从全局路由表,从邻居也就是Node B获取路由表
export filter Block_All;#禁止从本机导出路由至全局路由表
};
area 10.120.0.0 {#此Tunnel区域名
interface "vpn0" {#监听设备为Tunnal的NIC
type ptmp;#点对点模式,关闭boardcast寻找邻居
hello 10;
retransmit 6;
cost 10;
transmit delay 5;
dead count 5;
wait 50;
bfd;
neighbors {
10.120.0.1;#邻居ip,也就是Node B 的ip
};
};
};
}
- Node B
router id 192.168.100.253; #唯一路由ID
filter Block_All { #定义一个过滤器,全部拒绝
reject;
}
protocol device Local {
scan time 60;
}
protocol kernel Main {
scan time 60;
metric 64;
ipv4 {
import filter Block_All;#导入过滤器,从本机内核路由导出至全局路由表
export all;#允许所有区域全局路由导入至本机内核路由表
};
}
protocol static Routes { #定义一个名为Routes的静态IP路由块,发送的路由表全从这里读取
include "routes.conf";#包含此路由表文件
ipv4 {#使用IPV4
import all;#从本机本块中导出路由至全局路由表
export filter Block_All;#使用过滤器禁止全局路由表导入至本块所包含的路由表文件
};
}
protocol bfd Nodes {#定义一个名为Nodes的BFD块
interface "tun*" {#包含的Tunnel设备NIC,到Node A
min rx interval 100 ms;
min tx interval 100 ms;
idle tx interval 300 ms;
multiplier 10;
};
interface "vpn*" {#包含的Tunnel设备NIC,到Node C/D
min rx interval 100 ms;
min tx interval 100 ms;
idle tx interval 300 ms;
multiplier 10;
};
#所有的邻居(nodes)路由
neighbor 10.110.0.2 dev "tun1";#(TOP图中未使用)
neighbor 10.120.0.2 dev "tun2";#(TOP图中已使用)
neighbor 10.130.0.2 dev "tun3";#(TOP图中未使用)
neighbor 10.11.0.1 dev "vpn1";#(TOP图中未使用)
neighbor 10.12.0.1 dev "vpn2";#(TOP图中已使用)
}
protocol ospf v2 Tun1 {#定义一个名为TUN1的OSPF v2版本的协议块
tick 2;
rfc1583compat yes;
ipv4 {#使用IPV4
import filter Block_All;#禁止从本区域全局路由表中导入至本机
export all;#允许本机导出路由表到本区域全局路由表
};
area 10.110.0.0 {#本区域ID
interface "tun1" {#对等NIC名
hello 10;
retransmit 6;
cost 10;
transmit delay 5;
dead count 5;
wait 50;
type ptmp;#使用P2P模式连接,禁止Boardcast发现邻居
bfd;#使用BFD检测连接状态
neighbors {
10.110.0.2;#对等邻居IP
};
};
};
}
protocol ospf v2 Tun2 {#定义一个名为TUN2的OSPF v2版本的协议块,对等Node为Node A
tick 2;
rfc1583compat yes;
ipv4 {
import filter Block_All;#禁止从本区域全局路由表中导入至本机
export all;#允许从本机导出路由表到本区域全局路由表
};
area 10.120.0.0 {#本区域ID
interface "tun2" {#对等NIC名
type ptmp;
hello 10;
retransmit 6;
cost 10;
transmit delay 5;
dead count 5;
wait 50;
bfd;
neighbors {
10.120.0.2;
};
};
};
}
protocol ospf v2 Tun3 {
tick 2;
rfc1583compat yes;
ipv4 {
import filter Block_All;
export all;
};
area 10.130.0.0 {
interface "tun3" {
type ptmp;
hello 10;
retransmit 6;
cost 10;
transmit delay 5;
dead count 5;
wait 50;
bfd;
neighbors {
10.130.0.2;
};
};
};
}
protocol ospf v2 USA {#定义一个名为USA的OSPF v2版本的协议块,对等Node为Node C
tick 2;
rfc1583compat yes;
ipv4 {
import all;#允许从本区域全局路由表导入至本机
export filter Block_All;#禁止从本机导出路由表到本区域全局路由表
};
area 10.11.0.0 {#区域ID
interface "vpn1" {#对等NIC,对等Node为Node C
type ptmp;#P2P模式
hello 10;
retransmit 6;
cost 10;
transmit delay 5;
dead count 5;
wait 50;
bfd;#使用BFD检测连接是否正常
neighbors {
10.11.0.1;#邻居IP,也就是Node C的IP
};
};
};
}
protocol ospf v2 TW {#定义一个名为TW的OSPF v2版本的协议块,对等Node为Node D
tick 2;
rfc1583compat yes;
ipv4 {#使用IPV4
import all;#允许本区域全局路由表导入至本机
export filter Block_All;#禁止从本机导出路由表到本区域全局路由
};
area 10.12.0.0 {#本区域ID
interface "vpn2" {#对等NIC,对应为Node D
type ptmp;#使用P2P模式连接
hello 10;
retransmit 6;
cost 10;
transmit delay 5;
dead count 5;
wait 50;
bfd;#使用BFD检测连接是否正常
neighbors {
10.12.0.1;#对端IP
};
};
};
}
- Node C,本机安装的为BIRD非BIRD2,默认为IPV4,不需要ipv4块和ospf v2
router id 10.11.0.1;#唯一路由ID
filter Block_All {
reject;
}
protocol device Local {
scan time 60;
}
protocol kernel Main {
scan time 60;
metric 64;
import filter Block_All;#禁止本机内核路由导入至全局路由
export all;#允许全局路由导入到本机内核路由
}
protocol static {#定义一个静态路由块,不填名字会自动随机命名
route 15.235.0.0/16 via "vpn";#一条静态路由表,走WARP端口,格式同Node B 的include中的文件内容相同
import all;#导入至全局路由
export filter Block_All;#静止导入到本块
}
protocol bfd Nodes {#定义一个名为Nodes的BFD块
interface "tun2" {#Tunnel NIC
passive;
min rx interval 100 ms;
min tx interval 100 ms;
idle tx interval 300 ms;
multiplier 10;
};
neighbor 10.11.0.2 dev "tun2";#到对端邻居的路由,对应Node B
}
protocol ospf Lan {#定义一个名为Lan的OSPF块,非BIRD2不需要V2
tick 2;
rfc1583compat yes;
import filter Block_All;#禁止从本区域全局路由导入至本机
export all;#允许从本机导入路由到本区域全局路由
area 10.11.0.0 {#区域ID
interface "tun2" {#Tunnel NIC
type ptmp;#使用P2P模式
hello 10;
retransmit 6;
cost 10;
transmit delay 5;
dead count 5;
wait 50;
bfd;#使用BFD检测连接
neighbors {#对端IP,对应Node B
10.11.0.2;
};
};
};
}
- Node D,本机安装的为BIRD非BIRD2,默认为IPV4,不需要ipv4块和ospf v2
router id 10.12.0.1;#唯一路由ID
filter Block_All {
reject;
}
protocol device Local {
scan time 60;
}
protocol kernel Main {
scan time 60;
metric 64;
import filter Block_All;#禁止本机内核路由导入到全局路由
export filter Block_All;#禁止全局路由导入到本机内核路由
}
protocol bfd Nodes {#定义一个名为Nodes的BFD块
interface "tun2" {#Tunnel NIC
passive;#被动模式
min rx interval 20 ms;
min tx interval 50 ms;
idle tx interval 300 ms;
};
neighbor 10.12.0.2 dev "tun2";#到对端的路由,这里对应是Node B
}
protocol ospf Lan {#定义一个名为Lan的OSPF块
tick 2;
rfc1583compat yes;
import filter Block_All;#禁止本机路由导入到本区域全局路由
export filter Block_All;#禁止本区域全局路由导入到本机路由
area 10.12.0.0 {#本区域ID
interface "tun2" {#Tunnel NIC
type ptmp;#P2P模式
hello 10;
retransmit 6;
cost 10;
transmit delay 5;
dead count 5;
wait 50;
bfd;#使用BFD检测连接状况
neighbors {
10.12.0.2;#对端邻居IP,这里对应Node B
};
};
};
}
- 关于静态路由部分,可以参考文档https://bird.network.cz/?get_doc&v=20&f=bird-6.html#ss6.14
本人在Node B添加包含的路由表如下:
route 147.135.0.0/16
via 10.11.0.1 bfd;#主要出口,使用BFD测活
via 10.12.0.1 bfd;#备份出口,主要出口挂了用备用出口
在Node C添加的路由如下:
route 15.235.0.0/16 via "vpn";#到15.235.0.0/16出口为WARP
在Node A上Traceroute,正确分流。
-
最终效果图
Fina.png
A.png
B.png
C.png
D.png