[爆発試験センター出品]在家也要玩BGP 之 Mikrotik Fan Boy版

cxcoolcxcool 话题数:6会员
最后编辑于 五月 27 教程 #0

文章开始之前我觉得应该先放一首歌助助兴 - -!

本文复刻: James Swineson - 在家也要玩BGP:多运营商接入策略路由配置

https://blog.swineson.me/zh/bgp-at-home-1-multi-isp-policy-routing/
https://blog.swineson.me/zh/bgp-at-home-1-5-my-filter-rules/
https://blog.swineson.me/zh/bgp-at-home-2-set-transparent-proxy-gateway-selectively-for-partial-lan-devices/

普通BGPlayer家里是很少存在 DISCO设备的 - -
因此我们将作者的全文Remastered成Mikrotik设备版 .
同时 , 本文也是上一篇 <Drcai's Noob BGPlayer in 1hour 绝赞速成班 (逃 ~>的续集 :
https://www.91yunbbs.com/discussion/641/
对BGP 不是很了解 那可以先看以上内容 .


Motivation :

多线接入的网络下如何科学的分流一直是令人非常困扰的事情 ...
每种方案都有自己的优缺点 , 不存在很完美很绝对的方案 , 因此我只能给出一种比较适合国情的方案 .

先来说说一般家用的分流方案 :
1 L3层静态路由表分流 - 比如下载一个 ChinaIP , 然后把海外的IP全部走隧道 .
2 L7层嗅探 - 通过域名来分流 , 把特殊域名的流量扔到Socks代理去 .
这两种方案存在3大缺点 :
1 统一的缺点就是需要不定时的来更新路由表与域名表. 通常做这类免费项目的人基本上是"三分钟热度" , 后续维护是个问题 .
2 这类项目通常都有一定的延迟性,不会在ISP&IDC调整IP段后实时更新 , 最勤快的项目 , 用机器人直接从bgp.he.net这里拉IP的也要1日1更 . 且he的路由表也存在1天左右的延后.
3 分类不够细致 , 比如路由表最多给你精确到国家级别 . 部分项目提供主流ASN的IP Range, 但不可能做到每日更新所有ASN .
那么就有可能造成流量浪费 , 加速器变减速器 这样的Debuff效果 .

BGP Take me Home 方案完美解决了以上问题 .
用户可以实时通过上游收到最新的路由表 , 每当一个ASN IP宣告产生变化后 , 通常在几秒到半个小时左右即可获取最新的路由表.
根据ASN进行分流 , 极大程度的提高了分流的精确度 . 有丧心病狂的BGPlayer甚至根据 GeoIP 为ASN内不同的国家的IP打上Communites 二次分流 ...那这里只说人人都能学会的低难度版本 .
利用ASN分流 , 不但可以用于多线接入的环境 . 你可以单线接入 , 起114514根隧道将路由通往全球各地 . 根据ASN号来发往你最喜欢的隧道 . 比如韩国KT的流量超级贵的 , 我就把kakao , pmang 这种网游的流量送过去即可 . 比如你们最喜欢的小伙伴"狗根"流量不值钱 , 那么把x开头s结尾的网站送到那里去 . 玩法完全是根据自己的情况"私人定制"的 .


Preparation:

说了那么多...首先你的把表给收回家 , 收BGP全表大概有两类方法~

自己动手丰衣足食 :
1 租一个 /48 IPv6 段 - 一个月5-10欧的样子 .
2 找 Vultr 代广播这个 IPv6段 - 关键就是在 Vultr VPS 开通BGP session 功能 .
3 一台6刀VULTR 高性能CPU版收IPv4的全表 .
没错开通BGP session 后 IPv4 和 IPv6 全表都能从Vultr 收到 . 不需要自己的ASN , 把IP挂靠在Vultr的ASN下即可.

抱大腿 :
1 加入神秘组织dn42 , 通过建立rDNS记录赞美大佬 .
2 屁股里夹着5毛硬币 , 在TG群高深呼喊 : 我就是那个要和你们Peer的网友 !
In fact,收路由表并不困难. 只需要建一个私有ASN,把从上游收来的全表重分布到这个ASN里即可.

硬件的话起码需要 256m的内存 , 通常你需要收1W条左右的Prefix. 不能低于这个内存了 .
因此hap ac2这是万万不可的 , RB750Gr3 能勉强收一下 . 一般推荐 RB4011收全表刚刚好.
那么自己做x86的软路由内存就不用担心了...但是CPU的配个高级点的建议用i3-3xxx级别以上 .
千万别用个 J1900 之类的, 收个路由表整个路由器卡住了 ...
如何Build一个x86路由器可以参考番外篇 :
https://www.91yunbbs.com/discussion/647


Operation:

先来素质三联~

1 使用Vultr VPS为例 , 根据上一篇BGPlayer速成班教程 , 开通BGP Session .
2 通过DD的方式安装 RouterOS CHR .
3 使用你最喜欢的隧道把这台VPS与家中的ROS路由打通 .

之后开始RouterOS超级轻松愉快的Peer Vultr流程~

先在VPS控制面板找到BGP选项卡 :

再阅读 Vultr 官方文档 :
https://www.vultr.com/docs/configuring-bgp-on-vultr

之后在RouterOS里先建立 Filter 和 BGP instance :
第一组 Filter 很简单 Import All , Export None .
那么自己起In Filter的Chain Name , Action 写 Accept 即可 .
Vultr 发给你的IPv4路由都是过滤过的 , Bogon ips : 局域网IP之类 , 都是不存在的 . 新手非常友好.
你没有任何IPv4段需要广播,所以 Out Filter Action 直接全部 DISCARD 即可 .

第二组 Filter 同样很简单, Import None , Export All . 用于内网私有AS中.

建立2个 BGP instance :

与 Vultr Peer 用的Instance 根据VPS面板中提供的AS号来填写 AS .
传递路由表出去的那个私有AS号需根据RFC规则 : 64512到65535之间自选一个 .
RouterID 只不过是给BGP instance 起个名字 , 随便填 .
Filter 分别选择刚才建立好的两组 .
私有ASN的 Instance 必须勾选 : Redistribute Other BGP(BGP重分布) . 否则从其它BGP instance 收来的路由是不共享的.

接下来开始设置 Peer :
Vultr 的IPv4 Peer 完全根据官方说明来 , Multrihop别忘记选上 , Filter设置后直接上 !

因为 RouterOS 通过 RA获取的 IPv6网关不在路由器中显示 , 因此需要通过神奇的方式找出网关 .
根据 RFC 3307 规则 :https://www.iana.org/assignments/ipv6-multicast-addresses/ipv6-multicast-addresses.xhtml
ping FF02:0:0:0:0:0:0:2 即可获取网关信息 .
把IPv6 Peer 地址指向这个网关 , 避免 BGP 一启动 Peer 的路由被覆盖 .

以上内容感谢 @shirakun @genezx 指导. 作者本人表示对IPv6相关内容并不熟悉.

Vultr 与 IPv4 地址 Peer 那么就只能收 IPv4的路由表 , 与 IPv6 地址 Peer 那么就只能收 IPv6的路由表 .
高级选项当中需把 Address Family 设置成 IPv6 .

私有ASN的 Peer 就稍微有点讲究了 :

Remte Address - 偷懒写隧道两头的即可 , 按照道理应该起在Loopback口上
Remote AS :  起 IBGP , 两头同一个私有ASN .
Hold Time : 因为国内网络环境不是很好 , 这里建议设置长一点 , 甚至于设置为 infinity , 然后通过手动方式 Refresh . 
避免BGP 断开导致路由表丢失 .
Address Family 这里 , 你可以同时把刚才收到的 ipv4 和 ipv6 一概通过这个Peer发出去 .

Vultr 这头的设置就全部完毕了.Peer established的那一刻就开始收全表了 , 83W个 Prefix , 内存一瞬少一半 .

家中RouterOS的设定方法大概是相同的 ~

只需要一个私有ASN去 Peer Vultr 的 VPS即可 . 设置方式和VPS上的一摸一样即可 .
主要区别就在 IN-Filter 上 , 不用再收全表了 , 只收需要分流的ASN :

BGP AS Path的写法参考 : Mikrotik 没有教 , 参考其他家一样的 . 注意AS path 是不能用 ()来偷懒的:
http://www.h3c.com/cn/d_201010/922170_30005_0.htm
范例中的 BGP AS Path含义为:以 AS15169 与 AS14618 结尾的路由 .
新手只需要记住以"_"开头 , ASN后带上"$" , 每个ASN用"|"来分割即可 .
Action 当中 - Set In Nexthop Direct : 直接指定 Interface 作为出口 , 用于 PPPoe Interface非常方便 .
静态IP的话你可以用 Set In Nexthop 来手动指定下一条效果是一样的 .
Set Routing Mark : 然后通过 ip-route-rule 或者 mangle 使局域网内部分IP走这个路由表 . 如果不设置的话 , BGP学习到的路由默认就跑到 main 表里去了 .
Main表里不同种类的路由挤在一起,你就的好好了解一下各类路由协议的优先级了 .

没错, 又是这张图 - -

路由器的选路原则是怎么样的呢 ?
这个问题请大家自行学习CCNA等各类教材 , 这里只举一个简单的例子 :

首先 , 子网掩码越大(IP段越小) , 越优先 .
接下来他才考虑 distance的问题 . 比如 你在 IBGP中收到了 1.1.1.0/24 , 在 Filter 中统一设置出口成 cmtoiplc了 .
然而我这条不想走这个出口 , 那可以添加一条静态路由指定到其它出口 :

同样的IP段distance越小的越优先 .

日常用的ASN我为大家贴出来了 :

Route Filter 的 Chain 是从上往下执行的 .
在为所有需要分类的ASN做好 Filter后 , 最后一条 In-Filter 直接 Action Discard 把无关路由排除在外即可 . Out-Filter 一律 Discard .


Education :

看完这篇教程你可能非常顺利的就能通过ASN进行分流 , 但还远远不够 .
不光同一个路由表下有着复杂的选路原则 . OSPF&BGP 这2个协议内部分别同样有非常复杂和独特的选路原则...
这可能要等CCNP全部学完后才能完全掌握 .
现在的年轻人总是不想学网络基础 , 一上手就要学嗨客技术,这是不行的...
BGP 选路原则不知道那是日常 , OSI 模型分别是哪7层 , L2层的交换原理是怎么样的一概不知 . 打开电脑 , 第一件事情先运行 ./ssdp.sh
对着人家网站疯狂发包以示自己的高超水平 , 发现对面ping不通 , 沾沾自喜 .
原来是自己路由器负载太大 , 死机了...你的包就从来没有出过自己的路由器... 所以千万不要这样...

这里推荐一个 Youtube 频道 : The Network Berg :

使用Mikrotik设备弯道超车看他的视频就对了 ~

基础姿势的学习 CCNA/CCNP 还是的慢慢"铺"完 , 避免各类翻车发生 :
https://space.bilibili.com/301363652/video

Drcai
2021/5/27
v1.1

此话题使用的标签:
登录注册后才能评论。