0x01 前言

ISP的选择对于服务提供商来说是非常重要的,这决定位于全球各地客户访问你的服务的网络质量。在成功宣告IP段之前有一些步骤是必不可少的,其中就包含标题中写到的ISP选用及BGP的一些配置,而这些配置有可能成为能否与peer成功建立连接的因素。

0x02 ISP

这里的ISP主要指可以提供互联网接入的运营商,而这些运营商大致可以分为拥有骨干网资源的运营商,为了便于理解,我称他们为一级运营商;还有其他没有骨干网资源,但集成一家或多家一级运营商资源的二级运营商,这些二级运营商也可以提供BGP peering服务,但有一定的局限性。

先说国内的情况,国内的几大运营商我们都知道,骨干网也可以在网上查询。但国内的BGP有个特点,一般情况下,在单一ISP内宣告的IP段并不会传播到其他ISP,比如和电信建立了对等关系后宣告的IP段,不会传播到联通。这大大削弱了BGP的特性,降低故障转移的能力。另外,国内一般不能宣告自己的AS号,一般是代宣告,所以国内的很多云产品都宣称是多线BGP或多线接入。

来到国际方向,得益于市场的竞争性,我们有诸多选择,而且价格差异非常大,还可以发挥自身的口才和销售展开拉锯战,从而压低价格。线路质量是影响价格的主要因素,这个线路质量概念主要涵盖线路路由、登陆点数量、选用的海缆及和其他一级ISP peer的数量。

这些信息查起来非常繁琐,信息量巨大。一般选都是看接入地区所那些ISP,罗列后按体量大小排序,最后直接询价,最终根据自身的需求选择即可。而询价期间可以向销售索取更多信息,必要时可以要求加入技术一起沟通确认。

一般来说,销售都会发一份他们家的拓扑图,有一些则可以从网上找到,比如PCCW的:

再比如Cogent:

从上面的图可以看出两家ISP的区别,而他们的价格相差也很大。Cogent在我们国家的登陆点有香港和台北两个,前往欧洲需要绕行美国或新加坡,而且跨海的线路明显较PCCW少,所以适用于与美洲大陆和东南亚通讯的业务。

至于ISP使用的海缆,一般情况下我们是无法获取的,出于安全考虑,ISP也不会告知我们,但可以通过以下站点查询:

可以通过海缆找到对应的所有者,这也是影响线路质量的一个因素,但对于我们终端用户来说,问题其实不大。

一二级ISP还有一个很重要的差异就是二级ISP一般不支持Community属性调整路由,二级ISP一般只支持通过Community调整Prepending来控制外部的选路策略。而一级ISP支持非常细粒度的路由调整策略,还有黑洞Community,支持将多个/32段IP配置黑洞路由。比如PCCW:

再比如二级运营商Equinux:

至于他们的peer也可以看出不同,PCCW的peer主要是其他一级ISP的骨干网:

0x03 价格

具体的价格没法在这里给出,价格的差异可能会很大,除了客观因素外,我们还可以和销售展开拉锯战从而获得一个双方都满意的价格,因此在同样的配置下,价格也会不一样。

除了上面说到的因素外,路由也是影响价格的一个因素。比如CN2的AS4809,我们知道它有GT和GIA,主要是路由层面有一段163的区别,他们价格也有所差异。

还有有些ISP的IPT产品支持定制化路由,比如CN2,它支持单向路由,可以只订购中国方向或国际方向的路由,也可以订购全路由。这主要的区别是你的IP只会在订购的方向广播,价格的差异也非常大。

但这种情况下会有个问题,ISP配置不当的情况下将你的IP在订购的路由方向外进行广播后,会导致这些流量无法到达你的路由器。比如我在联通订购了AS9929中国方向的路由,因为这个AS是面向国际的产品,当他们没有做好传播区域控制的时候就会导致路由传播到其他国际方向的peer,导致国际方向经AS9929传入的流量不可达。而这个不可达又不是路由不可达,而是AS9929会丢包,显示超时。

还有一个因素是带宽的突发性能,一般会有1:2的Burst,也就是在订购50Mbps的情况下,突发带宽可以去到100Mbps,但这多出来的50Mbps会按95%峰值计费,突发带宽的价格会比原价贵20%~50%。如果不要Burst,也就是Flat,那么价格会低点。有很多价格便宜,带宽大的ISP,可以一下订购1Gbps,这时候就只能选择Flat,如果要Burst,那得换成10G的口,价格会高很多。

还有一个因素是带宽的大小,50Mbps和500Mbps的价格是不一样的,这个容易理解。

最后一个因素是合约期,至少会有1年的合约期,越长价格越便宜。ISP的合约和我们国内的不太一样,我们在合同内一般都会注明可以协商提前终止合同而不需要罚款;国际则是相反,有些可以提前终止且不需要追加罚款,但需要把剩余合约期的费用补全。比如合约期是12个月,但用一半想终止,是没问题的,但需要将剩余的6个月费用一次性补全。

简单来说,影响单价的因素有很多,可以根据具体的需求选择一级或二级运营商,而二级运营商的价格可能会贵点,因为他们的upstream多,路由一般是优化过的,覆盖面广,整体来讲比自行拉完全部ISP要便宜很多。

0x04 配置

根据业务的不同,BGP的调整也有很大区别,这完全是一门艺术,但这里不探讨优化层面的问题。

订购BGP服务之后,供应商会和你协调接入适宜,一般需要物理接入。完成后会交付两端的IP信息、AS号和密码。有些ISP还需要客户提供LOA(Letter of Authorization)用于授权ISP宣告其拥有的AS及IP,可能还需要在RADB中注册,但这个数据库是收费的,所以可以要求ISP代为注册,不收费。

最后还需要确认一个很重要的信息:我们能广播多少个prefix?这一般是ISP固定的数值,不够用的情况下可以协商提额。但一般情况下是够用的,因为你只能宣告自己的AS和IP。如果在没有得到授权的情况下宣告,宣告失败的同时还会收到警告信。再如果宣告的prefix数量大于限值,BGP session会强制断开,这个非常重要。这种情况会出现在没有控制好宣告的IP又配置了路由重分发功能,会将从A BGP session接收到的路由信息从其他BGP session宣告出去。

在配置前需要将ISP提供的IP地址配置到自己的设备上,然后使用自己的BGP AS号进入BGP视图并配置router-id:

# 进入BGP视图
bgp 100000

# 配置路由器ID
router-id 10.1.1.1

# 启用平滑重启
graceful-restart

然后配置peer信息:

peer 1.1.1.1 as-number 4809
peer 1.1.1.1 description CT GIA
peer 1.1.1.1 password cipher change_me

在启用peer前需要进行以下操作:

  1. 建立用于控制宣告的route-policy
    • 主要用于附加Community属性
  2. 建立用户接收路由的route-policy
    • 主要避免接收全量路由信息
  3. 建立用于控制宣告IP的ip-prefix
    • 主要用于控制宣告的IP,避免误宣告或超限

提一下上面的第2点,一般情况下,我们都会在路由器上配置一条或多条静态路由指定默认出口,当有多条的情况下需要使用preference设定优先级。因为全量路由信息非常大,路由器接收到这些信息会存放在内存,如果你的路由器性能较低或内存较小,务必要做好筛选工作。

首先建立route-policy,我使用as-path-filter进行筛选,用正则判断最终的AS号,匹配则接收。以下是相关文档:

比如我需要接收1.2.4.0/24这个网段对应AS号下的所有IP,通过查询可以得到这些AS号:

按需选择其中一个,或全都加入,使用以下命令:

# 在名为ctg-v4-import的filter内建立一条规则引入最后一个AS号为24151结尾的所有prefix
ip as-path-filter ctg-v4-import permit _24151$

通过这种方式,可以将某个国家或地区的AS号都引入,这样就可以让特定方向的流量通过指定的线路出去,没有找到路由的就走默认路由。

如果需要引入某个ISP所有peer的IP,可以直接写:

_4809_

在建立用于宣告的route-policy前,需要配置一个ip-prefix,这个ip-prefix内含需要宣告的prefix:

ip ip-prefix asn-100000 index 10 permit 10.1.2.0 24
ip ip-prefix asn-100000 index 20 permit 10.1.3.0 24

然后建立用于宣告的route-policy:

# 进入route-policy视图
route-policy ctg-v4-export permit node 50

# 加入判断
if-match ip-prefix asn-10000

# 附加Community
apply community 4809:3000

这个ip-prefix asn-10000可以复用,稍后配置BGP的时候会用到。

使用同样的方法,可以建立一个名为Blackhole的ip-prefix,然后在相同的route-policy建立一个node更小的permit规则并配置Blackhole的Community。当遇到攻击时,只需要将对应的IP加入该ip-prefix即可从运营商层面丢弃其流量,这Community在一般二级运营商是没有的,一级运营商是标配,但可加入的IP数量有限。

全部完成后再进入BGP视图,然后进入单播视图:

ipv4-family unicast

启用BGP peering:

peer 1.1.1.1 enable
peer 1.1.1.1 ip-prefix asn-100000 export
peer 1.1.1.1 route-policy ctg-v4-import import
peer 1.1.1.1 route-policy ctg-v4-export export
peer 1.1.1.1 advertise-community

如果一切正常,那么使用display即可看到连接状态:

# 列出peer
display bgp peer

# 结果
  Peer            V          AS  MsgRcvd  MsgSent  OutQ  Up/Down       State PrefRcv

  1.1.1.1         4        4809  5914135  56709     0   9947h14m   Established  1024

到这里虽然成功连接,但还没有宣告IP。宣告的IP必须在本地的路由可达,这可以是某个端口的IP、可以是iBGP或EBGP引入的路由、可以是诸如OSPF等协议引入的路由。如果是本地设备端口的IP,那么需要在ipv4-family unicast视图下执行以下命令用于宣告:

network 10.1.2.0 255.255.255.0
network 10.1.3.0 255.255.255.0

如果是通过OSPF引入的路由,则需要使用以下命令:

import-route ospf 1 route-policy local-ospf1-import

当然,还可以宣告静态路由:

import-route static route-policy local-static-import

完成后即可通过以下命令检查宣告的prefix:

display bgp routing-table peer 1.1.1.1 advertised-routes

 BGP Local router ID is 10.1.1.1
 Status codes: * - valid, > - best, d - damped,
               h - history,  i - internal, s - suppressed, S - Stale
               Origin : i - IGP, e - EGP, ? - incomplete


 Total Number of Routes: 2
      Network            NextHop        MED        LocPrf    PrefVal Path/Ogn

 *>i  10.1.2.0/24        1.1.1.1                               0      100000
 *>i  10.1.3.0/24        1.1.1.1         0                     0      100000

还可以查看引入的路由信息:

display bgp routing-table peer 1.1.1.1 accepted-routes

#
      Network            NextHop        MED        LocPrf    PrefVal Path/Ogn

 *>   1.1.8.0/24         1.1.1.1                               0      4809 4134 58543i
 *>   1.2.4.0/24         1.1.1.1                               0      4809 4134 58461 37963 24406i

至此,所有的基本配置均已完成。

如果需要查询某个IP的路由情况,可以使用以下命令:

# 查询
dis ip routing-table 1.2.4.8

# 结果
Route Flags: R - relay, D - download to fib
------------------------------------------------------------------------------
Routing Table : Public
Summary Count : 1
Destination/Mask    Proto   Pre  Cost      Flags NextHop         Interface

        1.2.4.0/24  EBGP    255  0           D   1.1.1.1         GigabitEthernet0/0/0

因为是从EBGP引入的路由,还可以看得更详细:

# 查询
display bgp routing-table 1.2.4.8

# 结果
 BGP local router ID : 10.1.1.1
 Local AS number : 100000
 Paths:   1 available, 1 best, 1 select
 BGP routing table entry information of 1.2.4.0/24:
 From: 1.1.1.1 (1.1.1.1)
 Route Duration: 999d23h30m56s
 Direct Out-interface: GigabitEthernet0/0/2
 Original nexthop: 1.1.1.1
 Qos information : 0x0
 Community:<4134:20152>
 AS-path 4809 4134 58461 37963 24406, origin igp, pref-val 0, valid, external, best, select, active, pre 255
 Not advertised to any peer yet

0x05 结语

整体配置起来不难,但维护则机器复杂且繁琐。整体的网络性能考量需要有较为全面的网络知识,以便在选择ISP的时候充分考虑各种因素,用最低的成本实现最优的网络,同时要时刻防范被攻击。

因为网络复杂性,专业的网工一般不懂编程,而实现自动化离不开编程与监控,想维持网络的稳定可靠,需要加大力度补充各类知识,力求把别人的工作也做了。