鸟互联网路由守护进程 iBGP

网络工程 路由 bgp
2021-07-31 18:39:05

首先:
我是 BGP 和 Bird 互联网路由守护程序的新手。

情况:

ISP1 - R1 - SW1 - R3
             |
ISP2 - R2 - SW2 - R4

我有一个用于 R1 和 ISP1 的 eBGP 实例,在 R2 和 ISP2 之间也有相同的实例。而且我在两个路由器上都有一个用于 R1 和 R2 的 iBGP 实例。

下面是我来自 R1 的 iBGP 示例配置:

protocol bgp bgp1 {
        local as 200000;                
        neighbor 10.0.0.2 as 200000; 
        multihop 1;                     
        keepalive time 5;                            
        source address 10.0.0.1;
}

这是我来自 R2 的 iBGP 示例配置:

protocol bgp bgp1 {
        local as 200000;                
        neighbor 10.0.0.1 as 200000; 
        multihop 1;                     
        keepalive time 5;                            
        source address 10.0.0.2;
}

此外,我在 R1 和 R2 之间有一个 keepalived 集群,它是
R3 和 R4默认网关。
现在,如果从 R1 到 ISP1 的链路出现故障怎么办?集群不会改变,
我没有任何互联网连接。

即使发生这种情况,我也想让流量流动。我的想法是让
R1 将整个流量发送到 R2,以便 R2 将其发送到 Internet。
我现在的问题是:
1) 用 Bird 和 iBGP 做到这一点的最佳方法是什么?
2)还有其他更好的机制吗?

问候

2个回答

我自己找到了答案:
如果您想使用
Bird Internet 路由守护程序在两个路由器之间创建故障转移,您需要执行以下步骤:

1. 每个路由器都必须连接到一个 ISP:意味着 1 个路由器到 1 个 ISP
2。在您的 AS 和 ISP 的 AS 之间形成对等体(BGP 邻居,eBGP)
3. 在两个路由器之间形成对等体 (iBGP)
4. 添加首选项(最高优先级获胜)

这是一个示例配置:

# example ID, change at R2, e.g. 144.233.0.2
router id 144.233.0.1; 
debug protocols all;

# filtering routes
function avoid_martians() 
prefix set martians; 
{   
martians = [ 169.254.0.0/16+, 172.16.0.0/12+, 192.168.0.0/16+, 10.0.0.0/8+, 0.0.0.0/0 ];

  # Avoid RFC1918 and similar networks   
  if net ~ martians then return false;

  return true; 
  }

filter bgp_in {
        if ! (avoid_martians())
                then reject;
        accept; 
       }

# tell BGP about your routes to your systems
# change to 144.233.0.3 at R2
protocol static {
        route 144.233.0.0/22 via 144.233.0.2; 
        }

protocol kernel {
        learn;
        scan time 20;
        import filter bgp_in;
        export all; 
       }

protocol device {
        scan time 10; 
        }


protocol bgp iBGP_INSTANCE {
        local as 500000;                # local AS
        neighbor 144.233.0.3 as 500000; # iBGP peering to R2, change to 144.233.0.2 at R2 
        keepalive time 5;               # keepalive timer
        graceful restart;                    
        import filter bgp_in;
        export all;
        preference 150;                 # highest preference "wins", 100 at R2
        direct;
        gateway direct; 
        }

protocol bgp eBGP_INSTANCE {
        local as 500000;                
        neighbor 155.0.0.3 as 102;      # eBGP peering to ISP1, change at R2
        direct;                         
        keepalive time 5;               
        graceful restart;               
        import filter bgp_in;
        export all;
        hold time 10;
        preference 150;                # highest preference "wins", 100 at R2
        }


上面的配置创建了两个 BGP 实例。
一个用于内部 BGP(与另一个路由器相同的 AS)和一个外部 BGP(另一个 AS 作为另一个路由器)。

正如我在配置中评论的那样,具有最高优先级的路由器将是“主路由器”。流量现在通过 R1 流向 ISP1。
但是,如果 R1 没有从 ISP 获得任何更新和/或 keepalive 消息怎么办?

答案很简单:
R1 没有从 ISP1 获得任何更新。意味着,没有到达目的地的路线。
现在 R1 和 R2 已形成对等体 (iBGP),R1 从 R2 获取更新。
这意味着现在 R1 必须将每个流量从下面发送到 R2,后者将其发送到 ISP2。

//编辑:更正错别字

您可以尝试通过 OSPF 传播默认路由 - 或 -

如果您通过 iBGP 将 ISP 通告的所有路由发送到第二个路由器,则数据包将使用另一个路由器来路由 Internet 流量,以防主路由器上的链接出现故障。

IE:

R1 路由表,ISP1 开启:

0.0.0.0/0 通过 ISP1 度量 100
0.0.0.0/0 通过 R2 公制 200

R2 路由表,ISP2 up:

0.0.0.0/0 通过 ISP2 metric 100
0.0.0.0/0 通过 R1 公制 200

如果 ISP1 出现故障,R1 路由表将是:

0.0.0.0/0 通过 R2 公制 200

因此数据包将被路由到 R2。

请记住在环回地址上建立 iBGP 对等互连并设置 next-hop-self。