书接上回,在你得到了批准,拿到AS号和ip地址资源之后,就可以找其他人玩了。先去wiki那里找支持自动部署peer服务的玩家。这里先推荐技术实力最强的kioubit和iEdon。
Kioubit
从https://map.iedon.net/上也可以看到,几乎大半个网络都有和kioubit有直接的peer,可以说是当之无愧的No.1,而且他提供了oAuth服务,挺多其他提供自动peer服务的玩家,都支持直接通过kioubit的oAuth来登录了。
使用自动peer系统创建配置
我们来访问https://dn42.g-load.eu/,

直接点automatic peering,然后输入AS号,然后认证。可以通过邮箱、或者Part1里面的公钥进行签名认证。首次登陆成功之后还会给你一个密码,之后可以用密码来登录。

然后你就来到他们的门户,会列出所有已建立的peer及其状态:

这里着重说明一下绝大多数情况下,或者说当前网络里面的主流的互联方式是什么:
VPN:使用wireguard
BGP:使用ipv6的link-local地址建立BGP会话,并启用multiprotocol-bgp和extend-nexthop
以kioubit的表单为例,最低要求是只要填上你的wireguard public key,然后设定一下你打算在接口上配置的link-local地址,然后打开两个BGP扩展,就足够完成设定了。

配置自己这边的系统
我用的是Mikrotik的RouterOS,我就用脚本来介绍一下我的设置过程吧:
# 创建一个bridge作为loopback口
/interface/bridge/create name=lo.dn42
# 创建一个新的interface list,记录后续与外部互联的接口,方便写防火墙策略
/interface/list/add name=dn42-peerings
# 创建一个新的vrf,然后将刚才的bridge加到vrf里面
/interface/vrf add name=dn42 interfaces=lo.dn42,dn42-peerings
# 创建一个wireguard接口作为模板
/interface/wireguard add name=dn42.template listen-port=12345
# 创建路由过滤器,后续根据实际情况调整
/routing/filter/rule add chain=block disabled=no rule="reject;"
/routing/filter/rule add chain=accept disabled=no rule="accept;"
# 创建bgp实例
/routing bgp instance add as=4242423077 disabled=no name=dn42 router-id=172.20.183.132
# 创建bgp链接模板,路由过滤策略先是拦截全部,我们下一步再慢慢来调整该放开哪些
/routing bgp template add as=4242423077 disabled=no input.filter=block keepalive-time=10s name=dn42 nexthop-choice=force-self output.filter-chain=block .no-client-to-client-reflection=no .redistribute=connected,static routing-table=dn42
如此一来,基础就准备好了,剩下来的就是为每个链接建立增加对应的peer设置,这里以下图的信息为例,假设wireguard的模板接口对应的公钥就是图中的那个。

# 创建wireguard隧道接口
/interface/wireguard add copy-from=dn42.template listen-port=23914 name=dn42.kioubit
# 将隧道接口加入到dn42-peerings接口列表里面,因为vrf绑定了接口列表,所以这个接口会自动进入dn42的vrf
/interface/list/member add interface=dn42.kioubit list=dn42-peerings
# 创建wireguard的peer
/interface/wireguard/peers add allowed-address=172.20.0.0/14,fd00::/8,fe80::/64 endpoint-address=de2.g-load.eu endpoint-port=20114 interface=dn42.kioubit name=kioubit public-key=\
"B1xSG/XTJRLd+GrWDsB06BqnIq8Xud93YVh/LYYYtUY="
# 手动设置接口的ipv6地址
/ipv6/address add address=fe80::3077/64 advertise=no auto-link-local=no disabled=yes eui-64=no from-pool="" interface=dn42.kioubit no-dad=no
# 创建bgp会话,引用dn42的模板
/routing/bgp/connection add afi=ip,ipv6 connect=yes instance=dn42 keepalive-time=10s local.address=fe80::3077%dn42.kioubit .role=ebgp multihop=no name=dn42.kioubit.v6 remote.address=fe80::ade0%dn42.kioubit .as=4242423914 templates=dn42
完了之后,通过/routing/bgp/session print可以看到状态。同时,可以去/routing/route print看收到的路由表了。
这时候,你就可以试试用本地的ip地址去ping出去测试网络通不通了。也可以使用kioubit的工具箱来测试一下外面能不能ping进来。
后续调整
调整路由过滤器
bgp会话能够成功建立,能收到对端的路由表之后,就可以开始调整路由过滤器了。我们需要创建2个过滤列表,分别处理入方向和出方向的路由
# 接收的路由过滤器,默认接受所有
/routing/filter/rule add chain=dn42-kioubit-in rule="accept;"
# 发送的路由过滤器,默认只通告自己的路由
/routing/filter/rule add chain=dn42-kioubit-out rule="if ( dst == 172.23.183.128/26 || dst == dst in fd48:fa31:502b::/48 ) { accept; } else { reject; }"
# 更新bgp connection的过滤器设置
/routing/bgp/connection set name=dn42.kioubit.v6 input.filter=dn42-kioubit-in output.filter-chain=dn42-kioubit-out
调整之后,你再去/routing/route print就能看到部分路由前面的F标记消失了,意味着这条路由没有被过滤,能参与到后续的算路中了。

与此同时,可以用/routing/bgp/advertisements print 来查看自己向外发布的路由。
ROA校验和flapalertd
首先,我们需要做一些准备,因为这部分需要容器配合。
# 给系统打开容器功能
/system/device-mode set container=yes
# 手动断电重启(在vps的控制面板上重启)
# 安装container的包,重启之后,就能用了
/system/package/update check-for-updates
/system/package enable container
/system/package apply-changes
# 创建一个bridge,然后将容器接到这里来
/interface/bridge add name=containers
/ip/address add interface=containers address=192.168.22.1/24
/interface/veth add name=container.dn42-roa address=192.168.22.2/24 gateway=192.168.22.1
/interface/veth add name=container.dn42-flapping address=192.168.22.3/24 gateway=192.168.22.1
/interface/bridge/port add bridge=containers interface=container.dn42-roa
/interface/bridge/port add bridge=containers interface=container.dn42-flapping
# 打通容器到互联网的ipv4 nat
/ip/firewall/nat add action=masquerade chain=srcnat out-interface=ether1
# 创建2个容器,分别用来处理ROA记录和flapalertd的记录,我这里用的是burble的ROA,和strexp家的flapalertd数据
/container add cmd=" -cache https://dn42.burble.com/roa/dn42_roa_46.json" interface=container.dn42-roa name=dn42-roa remote-image=rpki/stayrtr:latest restart-policy=on-failure root-dir=/containers_root/dn42-roa start-on-boot=yes
/container add cmd="--cache,https://flap42-data.strexp.net/roa.json\?rate=0&vote=7" interface=dn42-flapping name=dn42-flapping remote-image=rpki/stayrtr:latest restart-policy=on-failure root-dir=/containers_root/dn42-flapping start-on-boot=yes
# 检查两个容器的日志,确认能够正常拉到数据
/container/log print where container=dn42-roa
/container/log print where container=dn42-flapping
# 配置rpki
/routing rpki add address=192.168.20.2 group=dn42-roa port=8282
/routing rpki add address=192.168.20.3 group=dn42-flapping port=8282
# 检查一下rpki能否正常连接
/routing/rpki/session print
# 如果两个rpki状态都是sync,那么可以开始调整入方向的路由过滤器
/routing/filter/rule set chain=dn42-kioubit-in rule="rpki-verify dn42-flapping;\
\nif ( rpki invalid ) { set comment flapping; reject; }\
\nrpki-verify dn42-roa;\
\nif ( rpki invalid ) { set comment roa_invalid; reject; }\
\naccept;"
# 调整过之后,收到路由会进行2次rpki检查,首先检查一下有没有在flapalertd的列表里面。如果在,就给路由写个备注“flapping”,然后过滤掉。如果不在flapalertd的列表里面,再进行roa检查,如果roa验证失败,就给路由写个备注“roa_invalid”,然后过滤掉。
# 如果两次rpki检查都不是invalid,那么就接受这条路由,参与后续路由计算。
这样,你就能对收到的路由进行ROA校验了,同时,也能过滤掉那些正在不停抖动的路由。如果后续对外发布路由表,发transit的话,过滤掉抖动路由可以显著地减少对方的CPU资源的消耗。又或者你的网络有多个节点的情况下,可以明显的减少对内部网络的资源消耗。