ISP路由表分发中的AS与BGP
摘要
本文面向,初级网络工程师,数据挖掘工程师,涉及EGP(外部网关协议; Exterior Gateway Protocol),IGP(内部网关协议; Interior Gateway Protocol)两类协议,AS(自治系统;Autonomous System)构成,whois内容解析及部分RPSL(路由策略规范语言;Routing Policy Specification Language)语法,了解所谓的运营商库中的ISP到底是个什么鬼。资深运维玩家速速退散~_~
文中引用数据更新日期截止2016/12/10, 引用的部分链接来自wiki,需要**。
防混淆声明
再开始之前,由于不同书籍的出版时间及可信度的不同,在正文之前,对可能存在的错误定义进行更正及统一,本文所讲到的EGP及IGP指两类协议,并非某一个具体的算法。最早的[RFC 827]定义了一个叫EGP的协议,而此后相继使用了BGP(边界网关协议; Border Gateway Protocol),BGP4来替换该算法,现以扩展到可支持ipv6的BGP4+,在类别中,这3个算法均属于EGP这一类协议。另外,由于在新的RFC文档中,采用了Router一词,因此,有部分书籍将这两类协议翻译为ERP(外部路由协议; Exterior Router Protocol)和IRP(内部路由协议; Interior Router Protocol),实际上,他们所指的其实是同一个意思。另外所有通过了中级资格证考试的读者可以跳到第三节以节省阅读时间。
从IGP开始聊
具体的算法不讲,本文重点不在这,只讲思想。
这类协议有很多种,例如RIP,IGRP,OSPF,IS-IS,EIGRP,这里就不一一翻译了,过度强调中文其实没什么意义,他们的区别主要还是在算法实现上不同,以及协议的链路距离指标不同,即链路距离产生的代价。最简单的RIP,路由器间两两互相通信,每个路由器并不了解这整个网络的拓扑,它们只向其他相邻的路由器报告自己的可达距离,超过并包括16及表示不可达(有些书籍从0开始定义可达距离,用来表示不需要经过路由器的内网距离),并互相更新。
而OSPF和IS-IS是按链路状态来转发路由的,简而言之就是,用这俩协议的路由器存储着整个内部网络的路由拓扑,而RIP只知道一部分。OSPF相对于RIP的另外一个优点就是设置了路由传播代价,没错,就是在拓扑线上加点数字表示这条路好不好走,算一下开销再选择。
到了BGP
基本上还是和IGP同样的思想,怎么转之类的都差不多,搞个路由表啊之类的,但是为什么又单独搞了个协议呢,因为场景。这里涉及到一个自治系统的概念,大致意思就是,我自己内部的电脑能互相通信,即使不和外部通信,我也能玩联机游戏,大不了不上网。但是想接入互联网的话就的跟其他网络做一下通告,我是谁,我这个网有谁才能正确的向其他AS转发报文。这个时候就需要一个身份证来表示自己的身份,就是ASN(Autonomous System Number),想要这个号码,就得掏钱买,IP也是。跟谁买呢?国际上的五大组织已经承包了这些东西。插入一张图来说明一切。
NIC表示Network Information Center(网络信息中心)前面的字母分别是非洲,亚太,拉丁美+加勒比地区
美帝和欧洲的名字很奇怪啊,特意查了整理如下
划分方法大概是照着这个来的吧(美帝战区图,咳咳,其实没啥关系)
在国家也可以向国家的分配机构申请(买)了,CNNIC,并且要求一个月内使用其申请的AS号与一家ISP互设BGP协议,3-6个月内与两家以上(包括两家)的ISP互设BGP协议[1]。因此我们就可以理解为什么百度(AS38365),网易(AS45062),均在各个ISP库的列表里出现了。
好的,说回为什么场景不同,目前来讲,全球互联的(存在BGP服务器通报的)骨干网IP前缀路由表共有72739条,通过链路状态协议同步路由表,时间略长也不合适。除了技术上的原因,这里面涉及很多复杂的政治问题和安全问题,比如在中国内部流通的流量就没有必要从外面跑。因此在AS的边界路由器上会设置很多规则,比如,允许来自AS1的网络包进入本网络不允许AS2的进入,或者允许来自AS1的4.0.0.0/8进入本网络,或者让购买了本网络带宽的其他AS优先进入,这里的设置语法后面讲。
最终的BGP需要找到一条能通的路由,而不是一条可以最短的。因此BGP采用的是路径向量选择协议(这里指类别,区别于RIP的距离向量协议和OSPF的链路状态协议)。
AS
关于定义和概念我们讲了这么多,还是直观点的好,我们来看一下中国联通骨干网(AS4837)它在全国范围内的ip地理位置分布(注意,这里的骨干网并非全球骨干网,即该AS并非一个根节点,在它之上还有其他AS作为他的提供商)
我们再来看神舟长城(AS9389)的ip地理位置分布, 神舟长城又是从中国联通购买服务(可能有些优化吧,具体的处理逻辑只能从策略上看了)。
跟踪一次AS转播,以www.google.com为例,在tracerouter得到的路由追踪信息中我们可以看到
每一个ip所在的CIDR为
一段请求,经过源AS中的路由,到达自治系统的边界路由器,被转发到了AS8100,又从AS8100的一个边界被路由到了另外一个边界路由,最终进入AS15169的内部域。注意,此处的Provider并不一定是专门的运营商Internet Service Provider,有些公司为了处理多个ISP入口的流量,申请了ASN。如果在流量逻辑上和上级ISP没有太多的出入,就没有必要申请一个ASN,就算使用了BGP协议,起源域也可以使用一个私有ASN如同私有IP一样进行连接,在IANA的规定中将[64512-65534][4200000000-4294967294]保留为私有ASN用于上述情况,其他保留ASN请访问官方网站。
那所有IP都有对应的ASN嘛?不是,因为不是所有的IP都选择接入互联网,如果我接入了那我就一定有ASN嘛?是的。在一个局域网玩游戏,自己设置IP,怎么设置都行,让大家能通信就好,但是如果你要和其他局域网玩,两个局域网的管理员就得互相商量一下,怎么设置IP,怎么通信,以此来更改路由器设置。如果想和全世界玩,就得服从人家的协议了。
在某些基于多协议标签交换中为了实现VPN之间的交流,同样也可以为VPN单独申请一个ASN,以区分彼此并进行路由[2]。
Whois信息
对于ASN的whois信息可能各个数据库的存储格式都有所不同,以RIPE的数据库为例子。下面是由RPSL语言所写的中国网通AS的信息
其中import就是AS的路由表导入规则
Import语法如下
import: from <peering-> [action <action->]
. . .
from <peering-N> [action <action-N>]
accept <filter>
意思就是说,从所有的from后米娜的peering导入符合filter规则的路由表,以上的import信息表示,接受所有来自AS701,A S11919, AS6453, AS9225, AS4134, AS4538, AS4789, AS9800, AS4799的路由表,并分别设置了100,120的优先级。
更细粒度的语法
import: from AS2
action pref = ;
accept { 128.9.0.0/ }
则表示,接受来自AS2的路由128.9.0.0/16
而export的语法类似
export: to <peering-> [action <action->]
. . .
to <peering-N> [action <action-N>]
announce <filter>
向所有符合filter的peer转发路由上面的例子之一则表示向AS4134转发AS9929,AS9812,AS9810,AS9813,AS9816,AS9819,AS17432,AS7639的路由。
对于其他路由协议,多协议路由协议,和协议间的反射路由的完整import和export语法如下:
import:[protocol <protocol->] [into <protocol->]
from <peering-> [action <action->]
. . .
from <peering-N> [action <action-N>]
accept <filter>
export:[protocol <protocol->] [into <protocol->]
to <peering-> [action <action->]
. . .
to <peering-N> [action <action-N>]
announce <filter>
详细的解释请翻阅RFC[2622]文档.
BGP劫持
因为协议的特殊性,在计算路由路线时,通常在会合路由表中的所有ip前缀进行匹配,如果满足变长掩码的需求,就会把通过该路由将数据转发,如果存在相同的IP前缀,则找到一个ip块更小的路由,既掩码最长的那一个。攻击者通常会攻击边界路由器,使将错误的或者未经使用的ip前缀散发出去,将错误的路由信息广播至上级和其他对等体的路由表中,从而达到获取本不应该接受到的路由的数据消息。
就BGP本身而言,这种攻击很难从协议上进行更改,因为设计中虽然是建立在TCP之上,但是协议本身并没有验证数据源可靠与否的设计。唯一一个难点在于,边界路由的连接必须在物理上进行端口设置,而且BGP互换报文的TTL只有1,也就是必须在1秒之内建立连接才能进行下一步操作,比如,边界路由器RA和边界路由RB如果要互设BGP,那么必须在路由器的console中设置BGP会通过哪一个物理端口。因此,这种攻击服务器中如果有人为改动的话,是很难防范的。
2014年记录到的BGP劫持曾经拦截了比特币矿机到采矿器服务器的连接,将流量转移到了攻击者自己的矿池,就简简单单看着流量就收集了在当时价值8万美刀的比特币。
参考文献
http://www.rfc-editor.org/info/rfc827
http://www.rfc-editor.org/info/rfc1105
http://docstore.mik.ua/orelly/networking/tcpip/ch07_05.htm
http://docstore.mik.ua/orelly/networking/tcpip/ch07_04.htm
http://www.cnnic.net.cn/jczyfw/ipas/assq/201206/t20120612_26541.htm
http://baike.c114.net/view.asp?MPLS
原文链接:http://blog.tingyun.com/web/article/detail/1348
ISP路由表分发中的AS与BGP的更多相关文章
- 如何在Quagga BGP路由器中设置IPv6的BGP对等体和过滤
在本教程中,我们会向你演示如何创建IPv6 BGP对等体并通过BGP通告IPv6前缀.同时我们也将演示如何使用前缀列表和路由映射特性来过滤通告的或者获取到的IPv6前缀. 拓扑 服务供应商A和B希望在 ...
- [每日自动更新]Hillstone 山石网科 StoneOS ISP路由表配置文件
1.数据基于APNIC,准确有效 2.适用于StoneOS 4.0~5.5各版本 3.对APNIC数据进行路由聚合,实现最小子网 4.覆盖中国大陆地区电信.联通.移动三大运营商,长宽.电信通等二级运营 ...
- python---补充locals()变量在变量分发中的使用
在Django,tornado等框架中,变量分发渲染模板是一件再平常不过的事,但是当变量过多时,如何快速的进行变量传递 此时就可以用到locals()获取本地变量,将变量变为字典传入 def intr ...
- 【转】Android中的事件分发和处理
原文链接:http://www.apkbus.com/home.php?mod=space&uid=705730&do=blog&id=61207 上次跟大家分享了一下自定义V ...
- Android中的事件分发和处理
上次跟大家分享了一下自定义View的一下要点,这次跟大家聊一下View的事件分发及处理,为什么主题都是View,因为作为一名初级应用层Android工程师,跟我打交道最多的莫过于各种各样的View,只 ...
- cocos2dx 中触摸事件分发一些解读
触摸事件分发中几个代码解读: 怎么说呢,感觉cocos2dx中的消息分发机制,相对于android中触摸事件分发机制要简单的多.因为android中要做区域判断,过滤器,以及父子组件分发给谁等等的逻辑 ...
- Android中的事件分发机制
Android中的事件分发机制 作者:丁明祥 邮箱:2780087178@qq.com 这篇文章这周之内尽量写完 参考资料: Android事件分发机制完全解析,带你从源码的角度彻底理解(上) And ...
- CCNP路由实验之七 动态路由之BGP
CCNP路由实验之七 动态路由之BGP 动态路由协议能够自己主动的发现远程网络,仅仅要网络拓扑结构发生了变化,路由器就会相互交换路由信息,不仅能够自己主动获知新添加的网络,还能够在当前网络连接失 ...
- BGP路由协议详解(完整篇)
原文链接:http://xuanbo.blog.51cto.com/499334/465596/ 2010-12-27 12:02:45 上个月我写一篇关于BGP协议的博文,曾许诺过要完善这个文档,但 ...
随机推荐
- 【深入浅出jQuery】源码浅析2--奇技淫巧
最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...
- SAE+WordPress快速搭建个人博客
前些天一时冲动,买了个域名,我想总不能放着不用吧,干脆就搭建了一个个人博客.下面我把搭建的过程分享给大家.注意,此文并不是攻略,只是为了记录下这个从无到有的过程,当然,假如解决了你的疑惑,那当然是极好 ...
- 使用Metrics监控应用程序的性能
在编写应用程序的时候,通常会记录日志以便事后分析,在很多情况下是产生了问题之后,再去查看日志,是一种事后的静态分析.在很多时候,我们可能需要了解整个系统在当前,或者某一时刻运行的情况,比如当前系统中对 ...
- [异常解决] windows用SSH和linux同步文件&linux开启SSH&ssh client 报 algorithm negotiation failed的解决方法之一
1.安装.配置与启动 SSH分客户端openssh-client和openssh-server 如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有 ...
- maven archetype二三事
maven plugin 创建maven archetype 骨架的plugin是 <plugin> <groupId>org.apache.maven.plugins< ...
- MySQL基础之存储过程
学过之后却没有总结,今天好不容易有点时间来看看. 存储过程的优势 1.简化复杂的SQL语句,将多个SQL语句封装成为一个存储过程,可以在其中加上一些流程控制语句 2.存储过程封装在数据库内部,编译之后 ...
- Hibernate整合Spring异常'sessionFactory' or 'hibernateTemplate' is required
今日在写GenericDao时,发现了一个异常,内容如下: org.springframework.beans.factory.BeanCreationException: Error creatin ...
- Hawk 1.2 快速入门2 (大众点评18万美食数据)
本文将讲解通过本软件,获取大众点评的所有美食数据,可选择任一城市,也可以很方便地修改成获取其他生活门类信息的爬虫. 本文将省略原理,一步步地介绍如何在20分钟内完成爬虫的设计,基本不需要编程,还能自动 ...
- FFmpeg学习1:视频解码
在视频解码前,先了解以下几个基本的概念: 编解码器(CODEC):能够进行视频和音频压缩(CO)与解压缩(DEC),是视频编解码的核心部分. 容器/多媒体文件(Container/File):没有了解 ...
- JavaScript实现图片轮播组件
效果: 自动循环播放图片,下方有按钮可以切换到对应图片. 添加一个动画来实现图片切换. 鼠标停在图片上时,轮播停止,出现左右两个箭头,点击可以切换图片. 鼠标移开图片区域时,从当前位置继续轮播. 提供 ...