본문 바로가기

네트워크

[네트워크] 20. OSPF(Open Shortest Path First)

이 게시물은 후니의 쉽게 쓴 CISCO 네트워킹 4판을 공부한 내용을 바탕으로 작성됨.


OSPF (Open Shortest Path First)

 

 

Internet Protocol version 4 - Wikipedia

 

OSPF는 IP packet의 protocol number에 89로 들어간다. 따라서 IP packet의 protocol number에 89가 존재하면 해당 패킷은 라우팅 프로토콜으로 OSPF를 사용한다. 

 

 

 

몇 가지 특징들에 대하여 알아보자.

 

  • OSPF는 네트워크에 변화가 생겼을 때 그것을 바로 전달할 수 있기 때문에 Convergence time이 짧다. (RIP는 한 라우터에서 다른 라우터로 테이블을 넘겨주는 데 30초가 걸리기 때문에 Convergence time이 매우 길다는 단점이 있었다.) (OSPF가 link state 라우팅 알고리즘이기 때문에 가능한 일이다. 사전에 AS 내의 모든 라우팅 경로를 파악해 둠) 
  • Area라는 개념을 이용하여 전체 OSPF network를 작게 분할하여 관리하므로 빠른 업데이트와 동시에 효율적인 관리가 가능하다.
  • VLSM을 지원한다. ➜ IP 주소를 효율적으로 사용할 수 있을 뿐만 아니라 라우팅 테이블의 크기를 줄이는 부수적인 효과도 있다.
  • Route Summurization 기능을 지원하여 여러 개의 라우팅 경로를 하나로 묶어주는 기능이 탁월하다.
  • Hop count 제한이 없어 대대대규모 network에도 적용이 가능하다.
  • RIP는 매 30초마다 테이블을 교환하므로 대역폭 낭비가 심하지만 OSPF는 네트워크에 변화가 발생했을 때만 테이블을 교환하여 대역폭 낭비를 최소화 하고, 심지어는 multicast를 사용하므로 대역폭을 훨씬 효율적으로 사용한다.
  • Hop count만 고려하는 RIP와는 달리 여러 요소를 고려하여 최적경로를 설정하므로 최적경로 선택의 정확도가 크게 올라간다.
  • OSPF는 표준 라우팅 프로토콜으로 모든 라우터에서 사용이 가능하며 Link state 라우팅 알고리즘이다.
  • 다른 라우팅 알고리즘들은 Topology를 크게 따지지 않지만, OSPF는 Topology 종류에 따라 알고리즘 동작이 바뀌기 때문에 Topology를 먼저 이해해야 한다.

 

 

 

 


토폴로지 Topology 종류

 

OSPF network types - PacketLife.net

 

먼저 Broadcast multi-access이다. 그냥 Broadcast Topology라고도 불린다. 한 network에 2개 이상의 router가 연결되어 있는 경우로, R1에서 하나의 메시지를 전송하면 R2,3,4 network에 전부 전송되는 구조이다.

 

 

 

 

OSPF network types - PacketLife.net

 

다음으로 Point-to-Point Topology이다. Network에 한 쌍의 router만 존재하는 경우이다. 예로 특정 라우터 두 개만을 서로 이어주는 전용선의 경우를 들 수 있다.

 

 

 

OSPF network types - PacketLife.net

 

마지막으로 NBMA(Non Broadcast Multiple Access)이다. Broadcast처럼 한 네트워크에 2개 이상의 router가 연결되어 있다. 하지만 이 경우는 Broadcast 기능을 포함하지 않는다. R2,3,4에 각각 다른 정보가 전송된다. 프레임릴레이, X.25 network가 이 경우에 해당한다.

 

 

 

 

 


OSPF 동작 알아보기

 

 

 

 

 

  1. Down State ➜ 데이터가 발생하기 전까지는 서로 통신하지 않는 Down state 상태이다.
  2. Init State ➜ OSPF를 사용하는 라우터 A는 주변에 이웃 라우터가 존재하는지 파악하기 위해 Hello packet을 보낸다. 이때 A는 인근에 존재하는 모든 OSPF 라우터에게 Hello packet을 보내는데, Broadcast가 아니라 224.0.0.5 주소의 Multicast를 이용하여 전송한다. Hello를 받은 다른 OSPF 라우터들은 A의 IP address를 자신의 Neighbor List에 넣게되며 이 과정을 Init State라고 한다.
  3. Two-way State ➜ A로부터 Hello를 받은 모든 OSPF이 A에게 자신의 정보를 Unicast로 보낸다. A는 Neighbors들로부터 받은 정보들을 Neighbor List에 차곡차곡 저장한다.

 

 

 

 

OSPF Hello Packets – R&S Journey (lpmazariegos.com)

 

 

OSPF Hello packet은 위처럼 생겼다. 여기서 Hello/Dead Interver, Area-ID, password, Stub area flag 네 개의 정보가 중요한데, 예를 들어 두 라우터 간 Hello/Dead Interver이 서로 다르면 그 둘은 절대 이웃이 될 수 없다. 위 네 값은 두 라우터가 반드시 같은 값을 가지고 있어야 한다.

 

OSPF의 동작은 가장 먼저 라우터끼리 이웃을 맺는 것으로 시작하는데, 이웃을 맺기 위한 Hello packet이 매 10초마다 한 번씩 발생하며, Hello packet에는 두 라우터가 서로 이웃이 되기 위해 반드시 일치해야하는 정보들이 담겨있다고 이해하면 된다.

 

 

OSPF packet 헤더에는 Router ID가 존재한다. OSPF 라우터들은 Router ID를 이용하여 서로를 식별하기 때문에 이는 아주 중요한 정보인데, 이 값이 달라지면 서로를 알아보지 못하게 된다. Router ID가 변경되는 경우, 다시 Hello packet을 전송하여 인사하고 정보를 교환해야 한다. Router ID는 통상적으로 그 router가 가지는 IP 주소 중 가장 높은 IP 주소를 사용한다.

 

 

예를 들어 Ethernet interface 2개, Serial interface 1개를 갖는 Router가 있다고 하자. 각각의 IP 주소는 다음과 같다.

  • Ethernet 0 : 150.100.1.1 / 24
  • Ethernet 1 : 150.200.1.1 / 24
  • Serial 0 : 203.240.100.1 / 24

위 세 개 주소중에서 숫자가 가장 높은 것은 Serial의 주소이므로, 이 라우터는 Serial 주소를 Router ID로 사용한다.

 

 

 

만약 위의 OSPF 라우터의 Serial interface가 자꾸 죽었다 살아났다 반복하면 그때마다 Router ID가 변하게 되는데, 그에 맞추어 OSPF 라우터들은 정보를 수정해야 한다. 따라서 가장 안정된 interface의 주소를 Router ID로 지정한다. 그럼에도 불구하고 interface가 간헐적으로 on/off되기 때문에, IP 주소를 변경해야 하는 사태를 아예 막을 순 없다.

 

 

따라서 루프백 Loopback interface를 Router ID로 사용한다. OSPF에서 Loopback interface를 사용하면 반드시 Loopback interface의 주소가 Router ID가 된다. Loopback interface는 다운되지 않기 때문에 Router ID가 바뀔 염려가 없다.

 

 

이 때문에 대부분의 OSPF 라우터에는 Loopback interface가 장착되어 있다. OSPF 라우터를 설계할 때 반드시 Loopback interface를 포함해야 한다. 또한, 이미 Router ID가 다른 곳으로 설정되어있는 상태에서 Loopback을 추가한다고 해서 바로 Loopback interface 주소로 Router ID가 바뀌는 것은 아니다. 한 번 재부팅을 해야 Router ID가 Loopback 주소로 변경된다.

 

 

 

 

 

 

 


 

반장 DR, 부반장 BDR

 

 

이번에는 DR(Designated Router), BDR(Backup Designated Router)에 대해서 알아본다. 

 

 

 

DR, BDR 선출과정

 

  • OSPF router들은 Priority 값을 갖는다. 디폴트 값은 1인데, 이때 Priority 2를 갖는 라우터가 있다면 그것이 DR이 된다.
  • 한 AS내에서 Priority가 가장 높은 라우터가 DR, 두 번째로 높은 라우터가 BDR이 된다.
  • 서로 맨 처음 Hello packet을 교환할 때 Priority 값을 확인하여 DR, BDR을 선출한다.
  • 만약 Priority가 가장 높은 라우터가 여러 개인 경우에는 Router ID를 비교하여 그 값이 가장 큰 것이 DR이 된다.

 

 

Priority = 2인 라우터가 DR으로 선출되고, Priority = 1인것들 중 Router ID가 가장 큰 라우터가 BDR로 선출되었다고 생각해보자. 이때 Priority = 3인 라우터가 전학온다면 반장(DR)이 될 수 있을까? ➜ 그렇지 않다.

 

 

이미 반장 선거가 끝났기 때문에 Priority가 높은 반장감이 전학 오더라도 반장이나 부반을 시켜줄수는 없다. 만약 DR이 down되면 BDR이 DR으로 올라가고 BDR 자리가 공석이 되는데, 그때 Priority = 3인 라우터가 BDR 자리에 올라갈 수 있게 된다.

 

 

만약 라우터들을 전부 다 꺼버렸다가 키면 Priority = 3인 라우터가 바로 DR이 된다. 또한, 특 라우터가 DR, BDR이 절대 되지 못하게 하려면 Priority를 0으로 설정해주면 된다.

 

 

 

 

DR, BDR의 역할 

  • 각 라우터들이 OSPF에 참여하면 DR, BDR에게 자신의 Link state를 알린다. (링크의 정보, 자신의 위치 등을 전달하여 DR, BDR이 네트워크 토폴로지 전체 구조를 파악할 수 있도록 함.)
  • Link state를 모든 라우터가 아닌 DR, BDR에만 전달하기 때문에 트래픽 발생량이 적다.
  • Link state 정보를 전달받은 DR은 해당 정보들을 모두 관리하며 Link state의 Sync를 항상 일치시킨다.
  • BDR은 DR이 업무를 제대로 수행하는지 감시하다가 DR이 down되면 자신이 DR이 되어 업무를 이어나간다.

 

 

 

 

 

 

 


OSPF 링크 변화

 

위에서 설명한 DR, BDR을 이용하여 어떻게 OSPF에서 링크의 변화를 update하는지 그 과정을 알아보도록 하자.

 

 

1️⃣ 라우터가 부팅되거나 새롭게 OSPF 라우팅으로 설정되면 그 라우터는 multicast 224.0.0.5 주소를 이용해 Hellp packet을 전송한다. (Multicast이기 때문에 OSPF 라우터들에게만 해당 메시지를 전송하며, OSPF와 관련없는 장비들에게는 보내지 않는다.)

 

2️⃣ Hello packet에 담긴 정보를 이용하여 새로운 라우터는 DR, BDR의 주소를 알게된다. (이미 반장선거는 끝난 상태에서 새로운 라우터가 들어온 상황)

 

3️⃣ 새 라우터는 자신이 가지고 있는 링크 정보를 LSA(Link State Advertisement)에 담아서 DR, BDR에게 전송한다. 이러한 방식으로 LSA 정보를 업데이트하는 것을 LSU(Link State Update)라고 부른다. 이 메시지는 224.0.0.6 주소로 Multicast를 이용하여 전송되며, DR에 LSA가 도착하면 BDR은 Timer를 세팅하고 DR이 이 정보를 다른 OSPF 라우터들에게 제대로 전달하는지 감시한다.

 

4️⃣ DR은 새로 받은 LSA 정보를 224.0.0.5의 multicast 주소를 이용하여 다른 모든 OSPF 라우터에 전송한다. 이때 LSA의 주인인 새 라우터도 포함하여 전달한다. 그 후 DR은 모든 라우터들로부터 ACK를 받으면 정보가 잘 도착한 것으로 생각한다.

 

5️⃣ 만약 BDR의 Timer가 끝날 때까지 DR이 다른 모든 OSPF 라우터들에게 LSA를 전송하지 않으면 BDR은 DR이 되고 Hello packet을 이용하여 BDR을 다시 뽑는다.

 

6️⃣ 어떤 라우터의 링크가 끊어지는 경우에 해당 라우터는 그 정보를 즉시 DR에게 전달 ➜ DR은 LSA 정보를 다시 모든 OSPF 라우터들에게 전송한다. 또한 이를 수령한 라우터들은 그 LSA를 다시 근처 네트워크로 Flooding하여 update를 진행한다.

 

 

 

정리 ➜ OSPF 라우팅에서 링크에 어떤 변화가 발생하면 그것을 일단 해당 네트워크에 있는 반장 DR에게 전송한다. DR은 새로운 정보 LSA를 네트워크 안의 모든 OSPF 라우터에게 전달하여 각자 라우팅 테이블을 업데이트 하도록 한다. 이때 만약 DR이 할 일을 다하지 않는다면 BDR이 DR 자리를 뺏는다.

 

 

 

 

 

 

 


OSPF 구성

 

 

라우터에 OSPF를 구성하는 과정은 두 단계로 생각할 수 있다.

 

  1. 라우터에 OSPF를 Enable 설정한다.
  2. OSPF로 운용할 네트워크를 정의한다.

 

 

Router#(config) router ospf [process-id]

 

OSPF를 Enable 설정하는 과정은 위 명령어로 진행된다. 이때 process-id는 한 라우터에서 여러 개의 OSPF 라우팅 프로토콜을 사용할 때 각각을 구별하기 위해서 사용된다. 하지만 여러 개 OSPF를 사용할때도 process-id를 같게 설정해도 문제 없다. 그리고 한 라우터에서 process-id 여러 개를 사용하는 경우 각 id별로 하나씩의 DB를 운용하게 되어 성능이 저하되는 문제가 발생할 수 있으므로 그냥 통일해서 사용한다.

 

 

 

 

Router#(config-router) #network address / wildcard-mask / area / area-id

 

 

네트워크를 정의하는 명령어이다. wildcard-mask는 subnet mask와 반대로 행동한다. 예를 들어 subnet mask가 255.255.0.0인 경우에 wildcard mask는 정 반대인 0.0.255.255가 된다. 이에 대한 구체적인 내용은 다음 장에서 살펴보도록 한다.

 

OSPF를 적용할 network address를 먼저 작성하고, 그 네트워크의 subnet mask를 반전시킨 wildcard mask를 써준다. 그 후 area, area-id를 작성해주면 된다.

 

 

 

 

network 150.100.1.0 0.0.0.255 area 0

 

 

예를들어 위 같은 명령어를 작성할 수 있다. 위 명령어는 150.100.1.0/24라는 network를 area 0에 넣는 것을 의미한다. 여기서 area는 전체 OSPF 영역을 분할한 작은 영역들을 의미한다. 분할된 영역 안에 있는 OSPF 라우터들끼리 우선 링크 정보를 업데이트하고, 다른 area와의 통신은 area 사이에 있는 ABR(Area Border Router) 라우터들이 정보를 전달한다.

 

또한, area의 가장 기본은 백본 area라고 불리는 area 0 이다. area를 구성할 때는 백본 area를 중심으로 두고 다른 area를 구성하는 것이 일반적인 방법이다.

 

 

 

 

 

 

 

간단한 네트워크에 OSPF를 구성해보는 연습을 해보자.

 

 

 

 

 

라우터 A 

A(config)#interface GigabitEthernet 0/0
A(config-if)#ip address 172.16.10.1 255.255.255.0
A(config-if)#no shut


A(config)#interface Serial 0/3/0
A(config-if)#ip address 192.168.12.1 255.255.255.240
A(config-if)#clock rate 2000000
A(config-if)#no shut


A(config)#router ospf 100
A(config-router)#network 172.16.10.0 0.0.0.255 area 0
A(config-router)#network 192.168.12.0 0.0.0.15 area 0

 

 

 

 

 

 

라우터 B

B(config)#interface Serial 0/3/0
B(config-if)#ip address 192.168.23.2 255.255.255.240
B(config-if)#clock rate 2000000
B(config-if)#no shut


B(config)#interface Serial 0/3/1
B(config-if)#ip address 192.168.12.2 255.255.255.240
B(config-if)#no shut


B(config)#router ospf 100
B(config-router)#network 192.168.12.0 0.0.0.15 area 0
B(config-router)#network 192.168.23.0 0.0.0.15 area 0

 

 

 

 

 

라우터 C

C(config)#interface GigabitEthernet 0/0
C(config-if)#ip address 172.16.30.1 255.255.255.0
C(config-if)#no shut


C(config)#interface Serial 0/3/0
C(config-if)#ip address 192.168.23.3 255.255.255.240
C(config-if)#no shut


C(config)#router ospf 100
C(config-router)#network 172.16.30.0 0.0.0.255 area 0
C(config-router)#network 192.168.23.0 0.0.0.15 area 0

 

 

 

 

먼저 Router A의 Ethernet interface는 subnet mask가 24이지만 Serial interface는 28인 것을 볼 수 있다. 이처럼 한 라우터에 있는 여러 interface에서 서로 다른 subnet mask를 사용하는 것을 VLSM(Variable Length Subnet Mask)라고 한다. OSPF에 network를 입력해줄 때 wildcard mask를 입력해준 것도 눈여겨 보아야 한다.

 

 

 

다음으로 show ip protocols 명령어를 이용하여 현재 사용되고 있는 라우팅 프로토콜을 확인해본다.

 

A#sh ip protocols

Routing Protocol is "ospf 100"
  Outgoing update filter list for all interfaces is not set 
  Incoming update filter list for all interfaces is not set 
  Router ID 192.168.12.1
  Number of areas in this router is 1. 1 normal 0 stub 0 nssa
  Maximum path: 4
  Routing for Networks:
    172.16.10.0 0.0.0.255 area 0
    192.168.12.0 0.0.0.15 area 0
  Routing Information Sources:  
    Gateway         Distance      Last Update 
    192.168.12.1         110      00:00:37
    192.168.23.2         110      00:00:33
    192.168.23.3         110      00:00:33
  Distance: (default is 110)

 

 

현재 OSPF 100이라는 라우팅 프로토콜이 사용되고 있음을 확인할 수 있다. OSPF 라우터에서 Router ID는 해당 라우터가 가지고 있는 인터페이스 IP 주소들 중에서 가장 큰 값으로 결정된다고 했었다. 라우터 A는 192.168.12.1과 172.16.10.1을 가지므로 그 중에서 큰 값인 192.168.12.1으로 Router ID가 지정된 것이다.

 

 

 

 

다음으로 show ip route 명령어를 이용하여 라우팅 테이블을 확인해보자.

 

A#show ip route
Codes: L - local, C - connected, S - static, R - RIP, M - mobile, B - BGP
       D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
       N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
       E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP
       i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
       * - candidate default, U - per-user static route, o - ODR
       P - periodic downloaded static route

Gateway of last resort is not set

     172.16.0.0/16 is variably subnetted, 3 subnets, 2 masks
C       172.16.10.0/24 is directly connected, GigabitEthernet0/0
L       172.16.10.1/32 is directly connected, GigabitEthernet0/0
O       172.16.30.0/24 [110/129] via 192.168.12.2, 00:00:54, Serial0/3/0
     192.168.12.0/24 is variably subnetted, 2 subnets, 2 masks
C       192.168.12.0/28 is directly connected, Serial0/3/0
L       192.168.12.1/32 is directly connected, Serial0/3/0
     192.168.23.0/28 is subnetted, 1 subnets
O       192.168.23.0/28 [110/128] via 192.168.12.2, 00:01:04, Serial0/3/0

 

앞에 O가 붙은 경로들이 OSPF가 라우팅으로 찾아낸 경로들이다. [110/128]에서 앞 숫자는 distance, 뒤 숫자는 메트릭이다. 앞에서 OSPF는 Topology 종류에 따라 작동 방식이 다르다고 했었다. 이 네트워크는 어떤 Topology인지 확인하기 위해 show ip ospf interface 명령어를 입력해보자.

 

 

 

 

 

A#show ip ospf interface

GigabitEthernet0/0 is up, line protocol is up
  Internet address is 172.16.10.1/24, Area 0
  Process ID 100, Router ID 192.168.12.1, Network Type BROADCAST, Cost: 1
  Transmit Delay is 1 sec, State DR, Priority 1
  Designated Router (ID) 192.168.12.1, Interface address 172.16.10.1
  No backup designated router on this network
  Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
    Hello due in 00:00:01
  Index 1/1, flood queue length 0
  Next 0x0(0)/0x0(0)
  Last flood scan length is 1, maximum is 1
  Last flood scan time is 0 msec, maximum is 0 msec
  Neighbor Count is 0, Adjacent neighbor count is 0
  Suppress hello for 0 neighbor(s)
  
  
Serial0/3/0 is up, line protocol is up
  Internet address is 192.168.12.1/28, Area 0
  Process ID 100, Router ID 192.168.12.1, Network Type POINT-TO-POINT, Cost: 64
  Transmit Delay is 1 sec, State POINT-TO-POINT,
  Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
    Hello due in 00:00:05
  Index 2/2, flood queue length 0
  Next 0x0(0)/0x0(0)
  Last flood scan length is 1, maximum is 1
  Last flood scan time is 0 msec, maximum is 0 msec
  Neighbor Count is 1 , Adjacent neighbor count is 1
    Adjacent with neighbor 192.168.23.2
  Suppress hello for 0 neighbor(s)

 

 

Serial interface의 network type이 Point-to-Point임을 확인할 수 있다. 위 네트워크 구성도에서도 확인할 수 있듯이 두 라우터가 1:1로 연결되어 있는 구조이다. 이때는 DR, BDR을 선출하지 않는다. 한 네트워크에 Serial 두 개만 연결되어 있는 상태이므로 반장, 부반장이 필요하지 않다. 이 개념을 이용해서, DR BDR을 선출하고 싶지 않은 경우에 의도적으로 point to point 연결을 수행할 수도 있다.

 

Cost는 OSPF에서 링크 속도에 따라 부여하는 값으로 100,000,000을 BW로 나눈 값이다. OSPF는 cost값을 고려하여 최적경로를 선택하기 때문에 링크 속도가 빠른 경로일수록 OSPF가 그 경로를 선택할 확률이 높아질 것이다.

 

Serial interface의 디폴트 BW는 1.544Mbps이므로 100,000,000/1,544,000 = 64 Cost를 얻은 것이다.

 

 

위쪽 ethernet 부분을 보면 network type이 Broadcast임을 알 수 있다. Topology가 Broadcast인 경우에는 DR과 BDR을 선출해야 한다. 하지만 이 네트워크에서는 Ethernet 쪽에 라우터가 A만 연결되어 있으므로 A가 DR이 되고 끝난다. ➜ 따라서 DR IP주소에 라우터 A의 주소가 들어가있다.

 

 

 

 

 

마지막으로 Router B 주변에 어떤 이웃 라우터가 있는지 살펴보도록 하자.

B#show ip ospf neighbor


Neighbor ID     Pri   State           Dead Time   Address         Interface
192.168.12.1      0   FULL/  -        00:00:30    192.168.12.1    Serial0/3/1
192.168.23.3      0   FULL/  -        00:00:34    192.168.23.3    Serial0/3/0

 

 

show ip ospf neighbor 명령어를 입력하면 해당 정보를 확인할 수 있다. Router B에 연결되어 있는 OSPF 라우터 A, C가 이웃으로 등록되어 있다. State가 FULL으로 되어있다는 것은 이웃과 서로의 존재를 인식했다는 것이고, 서로 라우팅 테이블 교환이 이루어져 통신을 제대로 수행하고 있다는 의미이다.