1. BGP基础回顾:协议原理、AS路径属性、路由选择策略、会话状态机

各位同学好,我是老周。今天咱们开始聊BGP攻击监控,但别急着上手——先得把地基打牢。BGP这东西,说白了就是互联网的「电话簿」。没有它,你家路由器根本不知道数据包该往哪儿送。

我刚开始接触BGP时,觉得它就是个路由协议嘛,跟OSPF差不多。后来被现实狠狠教育了一回——有一次AS路径被篡改,整个网段流量被劫持到境外,用户投诉电话打爆了。嗯,从那以后我再看BGP,眼神都不一样了。

1.1 BGP协议原理:到底在干什么?

BGP全称是边界网关协议,版本4。它跟OSPF、IS-IS这些内部网关协议最大的区别是什么?

它不是找最短路径,而是找「可达路径」。

你想想看,互联网上有几十万个自治系统(AS),每个AS都有自己的路由策略。A公司不想让流量经过B公司,C运营商跟D运营商有商业协议——这些「人为因素」OSPF根本处理不了。BGP就是干这个的:在AS之间交换可达性信息,同时允许你自定义策略。

核心要点:BGP是路径矢量协议,不是链路状态协议。它不关心链路带宽、延迟,只关心「经过哪些AS能到达目标」。

我在项目中遇到过最典型的场景:客户有两个上游运营商,一个便宜但绕路,一个贵但直连。用BGP的本地优先级属性,就能让流量优先走贵的那个,便宜的那个做备份。这种灵活性,内部网关协议给不了。

1.2 AS路径属性:BGP的「身份证」

AS_PATH,这是BGP最核心的属性。它记录了路由从源头到当前AS所经过的所有AS编号。

举个例子:

网络 203.0.113.0/24
AS_PATH: 64500 64510 64520

这表示要到达203.0.113.0/24,需要依次经过AS 64500、64510、64520。BGP路由器看到这个路径,就知道「哦,这条路绕了三个AS」。

AS_PATH有两个关键作用:

  • 防环:如果路由器发现自己的AS号已经在路径里,直接丢弃这条路由。这是最基础的防环机制。
  • 选路:一般来说,AS_PATH越短,路由优先级越高。但注意,这只是默认行为——你可以用策略覆盖它。

避坑指南:我曾经见过有人手动修改AS_PATH来影响选路,结果搞出了路由黑洞。AS_PATH prepend(路径预置)是个合法操作,但一定要算清楚:加多了,流量可能绕远路;加少了,达不到预期效果。

除了AS_PATH,还有几个重要属性:

属性 作用 我的经验
NEXT_HOP 下一跳IP地址 很多人忽略它,但下一跳不可达时路由会失效
LOCAL_PREF 本地优先级(越高越优先) 我习惯用它来做主备切换,比MED好用
MED 多出口区分(越低越优先) 注意:MED只在相邻AS之间传递
COMMUNITY 路由标记 这个属性被严重低估了,后面讲攻击监控时会重点用

1.3 路由选择策略:BGP是怎么做决定的?

BGP路由器收到多条到达同一目标的路由时,它怎么选?

我经常跟新人说:BGP选路就像相亲,有一整套「打分标准」。分数最高的那个胜出。

BGP选路决策顺序(Cisco标准):

  1. 权重(Weight)——最高优先,Cisco私有属性
  2. 本地优先级(Local Preference)——越高越好
  3. 本地生成路由——优于从邻居学来的
  4. AS路径长度——越短越好
  5. 起源类型——IGP优于EGP,EGP优于incomplete
  6. MED值——越低越好
  7. 路径类型——eBGP优于iBGP
  8. 下一跳度量——越小越好
  9. ……(还有好几条,但实际用到的不多)

为什么会这么复杂?因为BGP要兼顾的东西太多了:商业策略、网络性能、可靠性……

注意:不同厂商的实现顺序可能有细微差别。比如华为和Cisco在MED之后的处理就不完全一样。我建议你查一下自己设备的具体文档,别想当然。

我个人习惯在排查路由问题时,先看LOCAL_PREF,再看AS_PATH长度。80%的选路异常都能在这两步找到原因。

1.4 BGP会话状态机:从Idle到Established

BGP邻居建立过程,有6个状态。我画了个图,你一看就明白:

BGP会话状态机 Idle Connect Active OpenSent OpenConfirm Established 启动 超时 TCP连接成功 重试 收到OPEN 收到KEEPALIVE 任何错误 → Idle

这个图你得记牢了。排查BGP邻居问题时,第一步就是看状态机停在哪儿了。

  • Idle:初始状态。BGP在等一个触发事件(比如配置了邻居)。如果一直卡在Idle,检查配置和网络连通性。
  • Connect:正在尝试TCP连接。TCP端口179,这个你得记住。
  • Active:TCP连接失败,正在重试。我见过最多的坑是防火墙没放行179端口。
  • OpenSent:TCP连接已建立,发了OPEN消息,等对方回复。
  • OpenConfirm:收到对方的OPEN,发了KEEPALIVE,等确认。
  • Established:邻居建立成功,开始交换路由。

实战技巧:我曾经遇到一个案例,BGP邻居一直在Active和Connect之间来回跳。查了半天,发现是MTU问题——TCP三次握手能完成,但BGP OPEN消息太大被分片了。把接口MTU从1500改成9000,问题解决。这种坑,书本上不会写。

1.5 小结:这些基础为什么重要?

你可能会问:老周,这些基础跟攻击监控有什么关系?

关系大了去了。BGP攻击的本质是什么?就是利用这些基础机制的漏洞。

  • 伪造AS_PATH → 劫持流量
  • 篡改LOCAL_PREF → 改变选路
  • 伪造BGP OPEN消息 → 建立非法邻居
  • 发送大量UPDATE → 耗尽路由器CPU

不懂基础,你连攻击是怎么发生的都看不懂,更别说监控了。

好了,这一章就到这里。下一章我们开始聊BGP攻击的常见手法——到时候你会发现,攻击者用的都是今天讲的这些「基础操作」。


公众号:蓝海资料掘金营,微信deep3321