背景介绍

在上一篇 ASN 注册教程发布 1 年多后,用 FRR 广播 IP 的教程终于咕出来了。
本教程会涵盖如下内容: 使用 FRR 广播 IP; LOA,RPKI 是什么;以及针对 BGP 的一些讨论。

Getting Started

你需要已经有 ASN 和 IP 才能继续进行(本文将采用 IPv6). 如果你还没有这些资源,可以考虑在 502Network 购买.

除此之外,你还需要有一台拥有 BGP Session 的 VPS. 如果你也没有这个资源,可以考虑购买 OLVPS 的伯力 VPS 可用优惠码: abcdefg

申请 BGP Session

如果你购买的是 OLVPS 的伯力 VPS, 可以直接用中文发送工单,告诉他们你需要 BGP Session, 并提供你的 ASN 和 IP Prefix 以便他们进行过白(注:非年付客户需要支付 30 块设置费)。国外商家也是同理,但你需要发送英文工单。

在商家设置好 Filter 后,会回复两个信息给你。一个是对端 IP, 一个是对端 ASN.

注:有的商家还需要你在 ASN 中加入 as-set 才能广播. 这里暂时不讨论对应的操作(因为这个是我一年前搞的,现在忘了怎么弄的了).

创建 route 对象

这里假设你的资源为 2a04:2a04:2a04::/48, AS114514

那么在创建 route6 对象时,所需要填写的 prefix 就是 2a04:2a04:2a04::/48, origin 则是 AS114514. 要播哪个段,prefix 就填啥。用哪个 ASN 播,origin 就填啥。

配置 FRR

这里以 CentOS 为例。

安装

yum install -y https://github.com/FRRouting/frr/releases/download/frr-5.0.1/frr-5.0.1-2018070501.el7.centos.x86_64.rpm

配置

编辑 /etc/frr/daemons, 启用 zebra 和 bgpd. 完成之后,你的 FRR 设置文件看起来应该是这个样子的

...
zebra=yes
bgpd=yes
ospfd=no
ospf6d=no
ripd=no
ripngd=no
isisd=no
ldpd=no
pimd=no
nhrpd=no
eigrpd=no
babeld=no
sharpd=no
pbrd=no
...

运行服务

然后把 FRR 服务拉起来。

systemctl enable frr
service frr start

交互式配置

输入 vtysh, 用命令行配置 FRR, 告别手写 config 的痛苦体验。

进入配置模式。

host# configure t
host(config)# router bgp 114514
host(config-router)# bgp router-id 0.0.0.1

假设你上游的对端 IP 是 2a01::1, 对端 ASN 为 AS19198,那么你需要这样配置下面的部分。

host(config-router)# neighbor 2a01::1 19198 external
host(config-router)# address-family ipv6
host(config-router-af)# neighbor 2a01::1 active
host(config-router-af)# network 2a04:2a04:2a04::/48
host(config-router-af)# exit
host(config-router)# exit
host(config)# exit
host# write memory

完成。

查看 BGP 状态

host# show bgp

你看到的输出应该是和下面差不多。

host# show bgp summary

IPv4 Unicast Summary:
BGP router identifier 0.0.0.1, local AS number 114514 vrf-id 0
BGP table version 0
RIB entries 0, using 0 bytes of memory
Peers 1, using 21 KiB of memory

Neighbor         V         AS MsgRcvd MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd
2a01::1          4      19198    7387    7404        0    0    0       1m NoNeg

Total number of neighbors 1

IPv6 Unicast Summary:
BGP router identifier 0.0.0.1, local AS number 114514 vrf-id 0
BGP table version 1
RIB entries 1, using 152 bytes of memory
Peers 1, using 21 KiB of memory

Neighbor         V         AS MsgRcvd MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd
2a01::1          4      19198    7387    7404        0    0    0       1m            0

这说明你的路由已经拨出去了,只要等待上游收敛就可以了。

LOA

如果你找国外的主机商要 BGP Session 的话,他们可能会要求你提供 LOA. LOA(Letter of Agency) 是上游为了确保你的 IP 不是偷的而要求的一个东西。下面是一个例子。

To whom it may concern,
As [你的名字], I hereby authorize AS114514 to announce the following IP address.
2a04:2a04:2a04::/48
By signing this LOA, I certify I am authorized to do that.
Yours faithfully,
[签上你的名字]

但是这个 LOA 一看就有一个问题。你如何证明你能证明你有权签 LOA 呢(听起来有点狗血吧)?事实确实是这样的。是个阿毛阿狗,随手都能提供出一份 LOA 来,但是上游又没有办法去验证。所以对于上游来说,LOA 只是相当于一个记录,和甩锅的根据。其并不能杜绝偷 IP.

RPKI

为了解决偷 IP, 漏路由等等问题,人们制订了 RPKI.

TL;DR

RPKI(RFC6480) 是一种加密算法,其可以将指定 IP 段和其正确的源 ASN 联系起来。
这样,当一个 ISP 发现了一段与 RPKI 不符的宣告时,它可以选择拒收路由,以确保网络的正常运行。

RPKI 是只有 LIR 才能设置的东西,一般情况下来讲,LIR 都会提前帮你设置好。如果需要更改的话,联系他们就可以了。

写在最后

如果你发现了本文有什么疏漏或者是错误,欢迎在评论区指出。

除另有声明外,本博客文章均采用 知识共享(Creative Commons) 署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。