Skip to Content
05. Security16. CoPP (Control Plane Policing)

CoPP (Control Plane Policing)

라우터(또는 멀티레이어 스위치)에서는 access-list나 방화벽(CBAC 또는 zone-based)을 사용해 라우터를 통과하거나 라우터로 향하는 패킷을 허용/거부할 수 있습니다.

또한 폴리싱(policing)을 사용해 라우터를 통과하는 트래픽을 속도 제한할 수도 있습니다. 라우터를 목적지로 하는 트래픽을 폴리싱하고 싶다면 어떻게 할까요? 라우터가 처리해야 하는 패킷을 생성하는 프로토콜은 꽤 많습니다.

  • OSPF, EIGRP, BGP 같은 라우팅 프로토콜
  • HSRP, VRRP, GLBP 같은 게이트웨이 이중화 프로토콜
  • Telnet, SSH, SNMP, RADIUS 같은 네트워크 관리 프로토콜
  • CEF가 전달할 수 없는 패킷

라우트 프로세서는 이러한 프로토콜이 컨트롤 플레인에서 생성하는 패킷을 검사합니다. 라우트 프로세서가 너무 많은 패킷을 받으면 따라잡지 못해 패킷을 드롭할 수 있습니다.

이런 일이 발생하면, neighbor adjacency가 플랩하거나 Telnet/SSH로 라우터에 연결할 때 타임아웃이 발생하는 등의 현상이 나타납니다.

이를 방지하려면 다음과 같은 옵션이 있습니다.

  • rACL (Receive Access Control List): 라인 카드에서 라우트 프로세서로 보내지는 트래픽을 제어하는 표준 또는 확장 ACL입니다. 이 기능은 Cisco 12000 시리즈 같은 고급 라우터에서만 볼 수 있습니다.
  • Control Plane Policing (CoPP): MQC(Modular Quality of Service) 프레임워크를 사용해 라우트 프로세서로 가는 트래픽을 허용/거부 또는 속도 제한할 수 있습니다.
  • Control Plane Protection (CPPr): 이는 CoPP의 확장입니다. 이것이 하는 일 중 하나는 라우트 프로세서를 세 개의 서브 인터페이스로 분리하는 것입니다:
    • host
    • transit
    • CEF exception

이 강의에서는 CoPP(Control Plane Policing) 를 살펴보겠습니다.


1. 구성

CoPP를 시연하기 위해 다음 토폴로지를 사용합니다.

12_CoPP (Control Plane Policing)_img_p03_01

다음과 같이 구성되어 있습니다.

  • R1과 R2는 OSPF와 HSRP를 실행합니다.
  • R1은 Telnet을 통한 원격 접속용으로 구성되어 있습니다.
  • H1은 R1에서 CoPP를 테스트하기 위해 ICMP와 Telnet 트래픽을 생성하는 호스트입니다.

시작 구성

각 장치의 시작 구성은 다음과 같습니다.

H1

hostname H1 ! no ip routing ! no ip cef ! interface GigabitEthernet0/1 ip address 192.168.1.101 255.255.255.0 ! ip default-gateway 192.168.1.254 ! end

R1

hostname R1 ! ip cef ! interface GigabitEthernet0/1 ip address 192.168.1.1 255.255.255.0 standby version 2 standby 1 ip 192.168.1.254 standby 1 priority 200 standby 1 preempt ! router ospf 1 network 192.168.1.0 0.0.0.255 area 0 ! end

R2

hostname R2 ! ip cef ! interface GigabitEthernet0/1 ip address 192.168.1.2 255.255.255.0 standby version 2 standby 1 ip 192.168.1.254 standby 1 preempt ! router ospf 1 network 192.168.1.0 0.0.0.255 area 0 ! end

CoPP 구성 단계

Control plane policing은 MQC를 사용하므로 class-map과 policy-map을 사용해야 합니다. class-map에서는 다음을 기준으로 트래픽을 매칭하는 것이 가장 좋습니다.

  • 표준 또는 확장 access-list
  • DSCP 또는 IP precedence 값

NBAR 분류는 모든 플랫폼이나 IOS 버전에서 지원되지 않습니다. 이 규칙의 유일한 예외는 match protocol arp입니다.

class-map에서 사용할 컨트롤 플레인의 트래픽을 매칭하는 access-list를 만들어 봅시다.

R1(config)# ip access-list extended ICMP R1(config-ext-nacl)# permit icmp any any R1(config)# ip access-list extended TELNET R1(config-ext-nacl)# permit tcp any any eq 23 R1(config)# ip access-list extended OSPF R1(config-ext-nacl)# permit ospf any any R1(config)# ip access-list extended HSRP R1(config-ext-nacl)# permit udp any host 224.0.0.102 eq 1985

access-list에 매칭하는 class-map을 만들어 봅시다.

R1(config)# class-map ICMP R1(config-cmap)# match access-group name ICMP R1(config)# class-map TELNET R1(config-cmap)# match access-group name TELNET R1(config)# class-map OSPF R1(config-cmap)# match access-group name OSPF R1(config)# class-map HSRP R1(config-cmap)# match access-group name HSRP

이제 policy-map을 만들 수 있습니다.

R1(config)# policy-map COPP R1(config-pmap)# class ICMP R1(config-pmap-c)# police 8000 conform-action transmit exceed-action transmit R1(config-pmap-c)# exit R1(config-pmap)# class TELNET R1(config-pmap-c)# police 8000 conform-action transmit exceed-action transmit R1(config-pmap-c)# exit R1(config-pmap)# class OSPF R1(config-pmap-c)# police 8000 conform-action transmit exceed-action transmit R1(config-pmap-c)# exit R1(config-pmap)# class HSRP R1(config-pmap-c)# police 8000 conform-action transmit exceed-action transmit R1(config-pmap-c)# exit

policy-map에 8000 bps 폴리서를 추가하고 conform-action과 exceed-action을 모두 transmit으로 설정합니다. 이 폴리서들은 절대 아무것도 드롭하지 않지만, 이렇게 구성하는 데는 좋은 이유가 있습니다.

CoPP를 처음 구성할 때, 각 프로토콜에 대해 얼마나 많은 패킷을 받는지 모릅니다. 정상 트래픽을 거부할 위험이 있습니다. 모든 것을 허용하는 것이 가장 좋습니다. 얼마나 많은 패킷이 초과되는지 알게 되면 값을 변경하고 exceed action을 drop으로 설정합니다.

12_CoPP (Control Plane Policing)_img_p07_01

이 policy-map을 컨트롤 플레인에 연결해야 합니다. 일반 인터페이스가 아니라 전용의 control-plane 범주에 입력 방향으로 적용합니다.

R1(config)# control-plane R1(config-cp)# service-policy input COPP

이렇게 하면 라우터로 들어와서 CPU로 punt되는 트래픽이 policy-map을 통과하게 됩니다. 일반 인터페이스 ACL과 달리 CoPP는 패킷이 CPU에 도달하기 전에 필터링되므로, 대량의 스캔/플러드 트래픽이 라인카드에서 곧바로 차단되어 CPU 자체에 부담을 주지 않습니다.

검증

먼저 서비스 정책이 컨트롤 플레인에 붙었는지 확인합니다.

R1# show policy-map control-plane input Control Plane Service-policy input: COPP Class-map: ICMP (match-all) 0 packets, 0 bytes 5 minute offered rate 0000 bps, drop rate 0000 bps Match: access-group name ICMP police: cir 8000 bps, bc 1500 bytes conformed 0 packets, 0 bytes; actions: transmit exceeded 0 packets, 0 bytes; actions: transmit Class-map: TELNET ... Class-map: OSPF ... Class-map: HSRP ... Class-map: class-default (match-any) ...

H1에서 라우터로 ICMP/Telnet 트래픽을 발생시키면 해당 class의 conformed/exceeded 카운터가 증가하는 것을 관찰할 수 있습니다. 일정 시간 동안 카운터를 모니터링해 평소 트래픽량을 파악한 뒤에, police 값을 실제 기대치에 맞춰 낮추고 exceed-actiondrop으로 바꾸면 비로소 “제한”하는 CoPP가 됩니다.

: CoPP에서 class-default의 exceed-action drop은 신중히 사용해야 합니다. 눈에 보이지 않는 컨트롤 플레인 트래픽(CDP, LLDP, ARP, STP 등)이 여기서 드롭되면 인접 장비와의 관계가 끊길 수 있습니다. 실무에서는 먼저 모든 class를 transmit/transmit으로 두고 “어떤 트래픽이 얼마나 들어오는지” 베이스라인을 잡은 뒤, 단계적으로 제한을 강화하는 접근이 안전합니다.


2. 결론

  • CoPP는 라우터 자신으로 향하는 트래픽(컨트롤 플레인) 을 MQC(class-map + policy-map)로 분류하고, control-plane 컨텍스트에 service-policy를 걸어 속도 제한 혹은 silent drop 하는 메커니즘입니다.
  • 일반 ACL이 인터페이스에 걸릴 때는 드롭 여부와 무관하게 패킷이 일단 CPU까지 올라가지만, CoPP는 CPU에 도달하기 전에 차단되므로 DoS성 패킷 플러드로부터 라우터의 제어 평면을 지키는 데 훨씬 효과적입니다.
  • 구성 순서는 ① 프로토콜별 ACL 작성 → ② class-map으로 각 ACL 매칭 → ③ policy-map에서 class마다 police 설정 → ④ control-planeservice-policy input 적용입니다.
  • 처음에는 모든 class를 conform-action transmit / exceed-action transmit으로 두고 카운터를 관찰하며 기준치를 잡아야 합니다. 베이스라인 없이 바로 drop을 걸면 정상 트래픽(OSPF hello, HSRP, SSH 등)까지 잘라 장애를 유발할 수 있습니다.
  • 더 세밀한 구분(host/transit/CEF-exception)이 필요하다면 CoPP의 확장판인 CPPr(Control Plane Protection) 로 넘어가는 것이 자연스러운 다음 단계입니다.

출처: networklessons.com - CoPP (Control Plane Policing)

태그: Security