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를 시연하기 위해 다음 토폴로지를 사용합니다.
다음과 같이 구성되어 있습니다.
- 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
!
endR1
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
!
endR2
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
!
endCoPP 구성 단계
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 1985access-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)# exitpolicy-map에 8000 bps 폴리서를 추가하고 conform-action과 exceed-action을 모두 transmit으로 설정합니다. 이 폴리서들은 절대 아무것도 드롭하지 않지만, 이렇게 구성하는 데는 좋은 이유가 있습니다.
CoPP를 처음 구성할 때, 각 프로토콜에 대해 얼마나 많은 패킷을 받는지 모릅니다. 정상 트래픽을 거부할 위험이 있습니다. 모든 것을 허용하는 것이 가장 좋습니다. 얼마나 많은 패킷이 초과되는지 알게 되면 값을 변경하고 exceed action을 drop으로 설정합니다.
이 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-action을 drop으로 바꾸면 비로소 “제한”하는 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-plane에service-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