本章是尝试在Vultr上从0开始搭建单点BGP网络
BIRD的操作手册在BIRD2用户指南查看,请自备一定耐心和英语阅读能力
前置假设:
- 你有一台Vultr的机器,IPv6是2001:19f0:4401:bb0:5400:1234:1234:1234,IPv4是31.41.59.26,你的AS为AS114514
- 你自己的IP段为2001:470:eb80::/44
Bird配置编写
首先BIRD需要一个router ID,通常是这台机器的IP地址,你也可以自定义这个ID,但是不能和你网内的其他机器重复
router id 31.41.59.26;
然后我们需要三个必备协议:direct,device,kernel
protocol device {
scan time 10;
}
通常情况下这种device协议配置可以满足所有要求
protocol direct {
ipv6;
interface "lo","RTR*";
}
direct协议能让bird获取网卡上的IP,因为你不是真正的运营商,会有像eth0这样物理网卡上不是你IP的网卡,所以你不能写interface "*";
这样会获取所有网卡上的IP,从而导致你漏油
protocol kernel {
scan time 10;
ipv6 {
import none;
export filter {
krt_prefsrc = 2001:470:eb80::1;
accept;
};
};
metric 2000;
}
kernel协议能让bird向内核导出路由,通常是import none export all,你也可以根据bgp_community来进行filter,文中krt_prefsrc是定义了bird向内核导出时设置的源IP,如果没有这一句,在通过你自己网络访问互联网的时候,可能会使用隧道两端的IP,这是我们不想看到的
然后我们还需要一个static协议,像这样
protocol static{
ipv6;
}
static协议不仅定义了某个段的IP的静态路由,还可以用来广播你自己的前缀
protocol static announce6{
ipv6;
route 2001:470:eb80::/44 reject; #通过创造一个unreachable的前缀来广播你的IP段
route 2001:470:eb80::/48 reject; #广播/44下面的/48
route 2001:19f0:ffff::1/128 via fe80::fc00:3ff:fe06:93cc%eth0;
#将Vultr的BGP网关默认路由到你eth0的本地IP上
}
做完这些后就可以准备与Vultr连接了,通常Vultr给V6的对端是一个私有AS,所以在导入的时候要删掉并prepend vultr真正的as
protocol bgp VULTR_V6
{
local 2001:19f0:4401:bb0:5400:1234:1234:1234 as 114514;
ipv6{
import filter{
bgp_path.delete([64512..131071, 4200000000..4294967295]); #删掉私有AS
bgp_path.prepend(20473); #Prepend上Vultr真正的AS
if (net.len > 48) then reject; #大于/48的前缀拒绝
accept; #剩下的接收
};
export filter{
if (net.len > 48) then reject; #大于/48的前缀拒绝
if net ~ [2001:470:eb80::/44] then accept; #如果是你自己的前缀就放行
reject; #剩下的拒绝
};
next hop self;
};
graceful restart on;
multihop 2;
neighbor 2001:19f0:ffff::1 as 64515;
password "你的密码";
}
兄啊,演示文档的ip地址IETF是有保留的啊(恼)
RFC 3849(IPv6 Address Prefix Reserved for Documentation): https://datatracker.ietf.org/doc/rfc3849/
RFC 5737(IPv4 Address Blocks Reserved for Documentation): https://datatracker.ietf.org/doc/rfc5737/
另外,tab缩进万岁(逃