본문 바로가기

프로그래밍/네트워크

[화웨이] 네트워크 과제 6 - BGP 과제 진행

과제 내용

2 - 1 -- 5 - 6
|     |     |    |
3 - 4    8 - 7

0. BGP 로만 구성, 전체 장비가 핑이 돼야 함.
1. 다른 프로토콜을 이용하여 neighbor 가 맺어지면 안 됨
2. 1-2-3-4 끼리 ibgp, 5-6-7-8 끼리 ibgp 로 구성되고 두 구간 사이가 ebgp로 연결되어야 함
3. 1,2,3,4 는 as 10, 5,6,7,8 은 as 20을 사용

 

토폴로지 구성 

 

기본 토폴로지 구성은 ospf 와 동일하다.

 

BGP 구성

과제에 맞게 ibgp 를 구성해서 전체 장비가 핑이 되기 위해서는 1-3, 2-4 간 연결을 구성해야 하는데, 직결 인터페이스나 다른 라우팅 없이 진행하기 때문에 full mesh로 구성하면 최초에 장비끼리 TCP 연결을 맺을 방법이 없어진다. 따라서 RR 혹은 Confederation으로 구성해야 한다. 1-2-3-4-1 은 Confederation으로 구성하고 5-6-7-8-5는 RR로 구성한 다음, 이 둘을 eBGP로 연결해 보기로 했다.

 

 

Confederation 구성

bgp <65001, confederation sub-AS>
 router-id <1.1.1.1, loopback ip>
 confederation id <10, 외부에서 보이는 실제 AS>
 confederation peer-as <65002, 같은 confederation 내 다른 sub-AS>
 peer 1.1.1.2 as-number 65001
 peer 1.1.1.2 connect-interface LoopBack0
 peer 1.1.1.4 as-number 65002
 peer 1.1.1.4 ebgp-max-hop 3
 peer 1.1.1.4 connect-interface LoopBack0
 peer 20.1.1.2 as-number 65001
 peer 20.1.1.13 as-number 65002

 network 1.1.1.1 255.255.255.255
 network 20.1.1.0 30
 network 20.1.1.12 30

 

bgp 의 AS를 지정할 때 Confederaion id(AS number)가 아니라 sub-AS로 시작한다. router-id를 지정하는 부분은 ospf와 동일하니까 넘어가고, confederation id를 내부에서 지정해 준 다음, 다른 sub-as 들을 peer-as로 등록해 준다.

 

1-4 간은 서로 다른 sub-as 이기 때문에 ebgp로 연결을 한다. 따라서 loopback 끼리 인터페이스를 만들게 되면, ebgp의 TTL은 1인데, loopback - interface - interface - loopback 이렇게 3 hop으로 동작하게 되기 때문에 peer 가 맺어지지 않는다. 따라서 ebgp-max-hop을 3으로 늘려준다.

 

peer를 맺을때에는 인터페이스 아이피 끼리도 peer 를 맺어야하는데, 그 이유는 BGP는 루프백으로 peer 를 맺을 경우, 경로가 미리 확보되어 있어야 TCP 세션이 형성된다. 그러나 이번 과제에서는 다른 라우팅 프로토콜을 사용할 수 없기 때문에, 먼저 인터페이스끼리 피어링을 맺어 경로를 확보한 뒤, 루프백 아이피로의 피어링을 해야 한다.

 


Route Reflector 구성

출처는 : https://www.cisco.com/c/en/us/td/docs/routers/ncs4000/software/configure/guide/configurationguide/configure-bgp-route-reflect-cli.pdf

 

사실 라우터끼리 상호 간에 RRC로 지정하는 건 일반적인 구성은 아니다. 이 구조는 라우팅 루프나 예기치 못한 버그를 일으킬 수 있기 때문에, RR 끼리는 가급적 풀-메쉬/논 클라이언트 피어로 구성해야 해서, 피해야 하는 구성이지만, 지금 과제에서는 이걸 사용해 보는 게 목적이기 때문에 그냥 써보기로 한다.

 

 

bgp 20
 router-id 1.1.1.5
 peer 1.1.1.6 as-number 20
 peer 1.1.1.6 connect-interface LoopBack0
 peer 1.1.1.6 reflect-client
 peer 1.1.1.6 next-hop-local
 peer 1.1.1.8 as-number 20
 peer 1.1.1.8 connect-interface LoopBack0
 peer 1.1.1.8 reflect-client
 peer 1.1.1.8 next-hop-local
 peer 30.1.1.2 as-number 20
 peer 30.1.1.13 as-number 20
 import-route direct

 

5번 장비에서 6,8번 장비에 RRC를 걸고, 마찬가지로 6번장비에서 5,7번 장비에 RRC 를 건다.

 

이렇게 구성하면 5번이 7번으로 가야 할 때에는 6번에서 전달해 준 라우팅으로 보내주고, 6번이 8번으로 가야할때에는 5번이 전달해준 라우팅으로 가게 돼서 4개 장비가 서로 라우팅이 된다.

 

network 명령을 이용해서 루프백과 인터페이스를 전부 입력해 주는 것과 import-route direct로 올리는 것의 동작은 동일하다. 단 상황에 따라 일부 인터페이스를 사용하지 않아야 하는 경우가 있는 경우 import-route는 정책 설정이 복잡해지므로 자주 사용하지는 않는 편이다.

 

 

* 다른 방식을 안쓰고 iBGP만을 사용하여 구성하는 방법

 

R1과 R3가 직접적으로 연결되지 않은 상황에서, 중간에 있는 R2와 R4가 R1-R3 사이 인터페이스 아이피 대역을 BGP에 광고하게 되면, R1과 R3는 서로의 인터페이스를 목적지로 하는 경로를 학습할 수 있다. 이 경우, R1과 R3는 물리적으로 직접 연결되어 있지 않더라도, 해당 아이피로 도달 가능한 경로가 존재하므로 iBGP 세션을 맺을 수 있다.

 

다만 이것도 역시 정상적인 구조는 아니기때문에,(구성 복잡도가 full-mesh 보다도 높은 안좋은 설계이다) 괴제상 부득이한 세팅으로 봐야할듯.

 

 

 

eBGP 구성

 

원래대로면 ebgp를 받는 장비는 다른 ibgp 장비들에게 라우팅을 전파해 줄 때에 next-hop-local을 지정해 주어야한다. RR로 구성한 5번쪽 장비들은 이미 RR/RRC 구성을 할때에 next-hop-local 을 지정해 줬기 때문에 상관이 없다.

 

다만 1번 쪽 장비들은 원래는 5번으로 가는 next hop을 변환하지 않고 ibgp에 뿌려줄 경우 해당 경로를 알 수가 없어서 문제가 생겨야겠지만, 과제상의 구조에서는 해당 설정을 하지 않아도 3번 장비가 멀쩡하게 5~8번 장비까지 핑을 보낼 수 있게 된다.

 

이유는 해당 next-hop 아이피인 인터페이스 ip를 1번 장비가 광고하고 있고, 1번 장비로 가는 길을 confederation을 통해 ebgp로 받고 있으며, 해당 경로는 또 양측 라우터들이 인터페이스를 광고해주고 있기 때문에 이렇게 재귀적으로 라우팅이 성립한다. 다만 실제 BGP 구성에서는 당연히 명시해주는것이 바람직하다.  

 

테스트

 

전체 장비의 핑을 확인했고, 1번과 7번이 통신이 잘 되는지를 스크린샷으로 남겼다.

 

 

 

 

버그 내역

5번 라우터를 RR로 만들고 next-hop-local을 걸었으나, ibgp 간에서는 Next-hop을 변경하지 않는 특성으로 인해 5-7번이 연결이 되지 않는 문제가 있었음. 따라서 import-route direct (redistribute) 기능을 이용해서 직결된 내용을 ibgp에 싣도록 명시해야 해결됨.

 

완성 이후에 알게 된 버그(?)인데 RR 5-7 간 peer를 설정하면 split horizon 이슈로 6번 장비에서 라우팅을 폐기한다. 즉 5-7 미연결 - 6번이 서로를 라우팅 해줌 - tcp 연결 - 5-7 피어 구성 - 6번에서 라우팅 폐기 - 5-7 연결 해제 - 6번이 서로 라우팅 해줌... 을 무한히 반복하는 상황이 있었다. 본문에서 적었듯이 원칙적으로는 이런 RR 구성을 하면 안 되는데 이런 게 그 이유 중 하나인 것 같다.

1-5 장비 간 peer 가 루프백으로 맺어지지 않는 문제가 있었음. ebgp-max-hop 명령어를 인지하지 못해서 생긴 문제로 루프백-물리-물리 인터페이스-루프백의 3 hop으로 논리 구성된 상황에서 TTL 이 1인 ebgp 연결을 시도해서 생긴 문제로 max-hop을 3으로 늘려줘서 해결함