CoPP

CoPP(control plane policing)

CoPP功能在於保護CPU,使其不受到DoS或不必要的封包進到CPU內進行運算。
CoPP使用Policy map來分類和處理封包。

(內容是依照原文翻譯而來,手頭沒有4500可以測試,可能會跟實際狀況有出入)


由CPU管理的流量可以分成三個不同的功能 :

  • Control plane
  • Data plane
  • Management plane


Control Plane只能由系統預先定義的Policy來控制,其它兩個可以用自定義的ACL和class map。
只有 system-cpp-policy 這個policy-map可以控制control-plane,這個原則裡面必須包含預先定義的class-map。
CoPP使用MQC定義流量的分級,再依不同分級定義不同的動作。
MQC使用Class map 定義封包如何分級,定義完後可以用Policy Map去執行不同分級要使用的行為 (confirm或drop)。
全域的control-plane設定指令可以允許CoPP服務原則直接存取control plane。
建立system-cpp-policy最好的方法就是使用全域巨集 system-cpp。
所有預先定義的control plane class-map都有相同的前墜字,system-cpp-,預設這些class-map都沒有任何執行的原則,可以定義自己的control plane class-map,並加入到system-cpp-policy。
CoPP 預設的配置是關閉的。
CoPP通常用來保護CPU免受DoS攻擊,底下是Cisco預先定義的第二層、第三層ACL,也可自行定義自己的ACL。
(預先定義的ACL不能被修改)

Pre-defined Named ACL
Description
system-cpp-dot1x
MacDA = 0180.C200.0003
system-cpp-bpdu-range
MacDA = 0180.C200.0000 - 0180.C200.000F
system-cpp-cdp
MacDA = 0100.0CCC.CCCC (UDLD/DTP/VTP/Pagp)
system-cpp-garp-range
MacDA = 0180.C200.0020 - 0180.C200.002F
system-cpp-sstp
MacDA = 0100.0CCC.CCCD
system-cpp-cgmp
Mac DA = 01-00-0C-DD-DD-DD
system-cpp-ospf
IP Protocol = OSPF, IPDA matches 224.0.0.0/24
system-cpp-igmp
IP Protocol = IGMP, IPDA matches 224.0.0.0/3
system-cpp-pim
IP Protocol = PIM, IPDA matches 224.0.0.0/24
system-cpp-all-systems-on-subnet
IPDA = 224.0.0.1
system-cpp-all-routers-on-subnet
IPDA = 224.0.0.2
system-cpp-ripv2
IPDA = 224.0.0.9
system-cpp-ip-mcast-linklocal
IP DA = 224.0.0.0/24
system-cpp-dhcp-cs
IP Protocol = UDP, L4SrcPort = 68, L4DstPort = 67
system-cpp-dhcp-sc
IP Protocol = UDP, L4SrcPort = 67, L4DstPort = 68
system-cpp-dhcp-ss
IP Protocol = UDP, L4SrcPort = 67, L4DstPort = 67



CoPP的注意事項和限制

  • CoPP 預設是關閉的。
  • CoPP只支援輸入,因此只有input指令
  • 官方建議使用預先定義好的class map去處理control plane
  • Control plane traffic 只能用CoPP來控制。儘管在interface和vlan上 設定了包含Control plane traffic 的polcy-map,也不能控制。
  • 系統預先定義的class map (system-cpp-)不能用在正常環境的QoS內。
  • CoPP有一個專屬policy-map名稱,system-cpp-policy,一旦使用就不能被刪除。
  • 使用者定義的class map 必須加到 system-cpp-policy 這個policy內。
  • System-cpp-policy 的介面內沒有no policy指令,只有policy指令。
  • 裝載在CoPP的ACL不要使用log關鍵字。
  • 如果一個封包同時符合自定義的IPACL/MACACL和預先定義的ACL,會優先使用預先定義的ACL的Action(不管有沒有設定Action)。 預先定義的policy裡面,policed-dscp-transmit這個Policy,不支援exceeding action。
  • 只有全域的執行 qos指令和police的action已經指定的狀況下,CoPP功能才會啟動。


設定CoPP


設定Control Plane 的CoPP

Switch# config terminal
Switch(config)# qos
Switch(config)# marco global apply system-cpp
Switch(config)# policy-map system-cpp-policy
Switch(config-pmap)# class 各種預先定義的條件
Switch(config-pmap-c)# policy 平均流量 暴衝流量 定義執行動作
Switch# show plicy-map system-cpp-policy


指令
解釋
qos
全域啟動QOS功能 (option)
marco global apply system-cpp
使用巨集 system-cpp (option)
policy-map system-cpp-policy
進入系統預先定義的Policy,system-cpp-policy
class 各種預先定義的class名稱
進入police內的class分類介面。
policy 平均流量 緩衝流量 定義執行動作
在police內的class分類介面,定義這個流量、緩衝、符合時的動作。
show plicy-map system-cpp-policy
檢視system-cpp-policy的設定。


其中Switch(config-pmap-c)# policy的解釋如下
policy rate burst 執行動作
rate的單位是bit per second (bps)
burst的單位是 byte。 (rate和burst的解釋請看最後面)
執行動作分成兩部分
第一部份,正常流量 conform-action transmit |deny,流量尚未超標前的動作,允許或丟棄
第二部分,超過設定的流量 exceed-action transmit |deny,流量超標後的動作,允許或丟棄

例子 ,限制流量為10K,burst的大小為1500 byte,正常允許,超過時丟棄:
policy 10240 1500 conform-action transmit exceed-action drop



完整設定Control Plan CoPP的例子:
啟動QOS和使用system-cpp巨集,並設定cdp的流量為32000bps,超過丟棄
Switch(config)# qos
Switch(config)# macro global apply system-cpp
Switch(config)# policy-map system-cpp-policy
Switch(config-pmap)# class system-cpp-cdp
Switch(config-pmap-c)# police 32000 1000 conform-action transmit exceed-action drop
Switch(config-pmap-c)# end
Switch# show policy-map system-cpp-policy
Policy Map system-cpp-policy
    Class system-cpp-dot1x
    Class system-cpp-bpdu-range
    Class system-cpp-cdp
      police 32000 bps 1000 byte conform-action transmit exceed-action drop
    Class system-cpp-garp-range
    Class system-cpp-sstp
    Class system-cpp-cgmp
    Class system-cpp-ospf
    Class system-cpp-igmp
    Class system-cpp-pim
    Class system-cpp-all-systems-on-subnet
    Class system-cpp-all-routers-on-subnet
    Class system-cpp-ripv2
    Class system-cpp-ip-mcast-linklocal
    Class system-cpp-dhcp-cs
    Class system-cpp-dhcp-sc
    Class system-cpp-dhcp-ss
Switch#




設定 Data Plane CoPP和Management Plan的流量


Switch# config terminal
Switch(config)# qos
Switch(config)# marco global apply system-cpp

Switch(config)# ip access-list extended ACL的名字
!!設定IP ACL
or/and
Switch(config)# mac access-list extended ACL的名字
!!設定MAC ACL
Or/and
Switch(config)# access-list ACL的名字 permit|deny {type-code wild-mask | address mask}

Switch(config)# class-map CALSS-MAP的名字
Switch(config-cmap)# match access-group {ACL編號| name ACL名字}
Switch(config-cmap)# exit
switch(config)# policy-map system-cpp-policy
switch(config-pmap)# class 剛剛設定的CLASS-MAP的名字
Switch(config-pmap-c)# policy 平均流量 緩衝流量 定義執行動作
Switch# show plicy-map system-cpp-policy



完整設定data Plane和 CoPP的例子
設定除了10.1.1.1和10.1.1.2不受任何影響,可以自由傳送NTP訊息,其它來源的NTP訊息會被限制在100K內

Switch# config terminal
Switch(config)# qos
Switch(config)# macro global apply system-cpp

!允許10.1.1.1的NTP流量不受Policy控制
Switch(config)# access-list 150 deny udp host 10.1.1.1 any eq 123

!允許10.1.1.2的NTP流量不受Policy控制
Switch(config)# access-list 150 deny udp host 10.1.1.2 any eq 123

!其它的NTP流量受Policy控制
Switch(config)# access-list 150 permit udp any any eq 123

!定義新的class-map,名稱為NTP-class
Switch(config)# class-map NTP-class
Switch(config-cmap)# match access-group 150
Switch(config-cmap)#exit
Switch(config)# policy-map system-cpp-policy
Switch(config-pmap)# class telnet-class
Switch(config-pmap-c)# police 102400 1000 conform-action transmit exceed-action drop
Switch(config-pmap-c)# end
Switch# show policy-map system-cpp-policy
Policy Map system-cpp-policy
    Class system-cpp-dot1x
    Class system-cpp-bpdu-range
    Class system-cpp-cdp
      police 32000 bps 1000 byte conform-action transmit exceed-action drop
    Class system-cpp-garp-range
    Class system-cpp-sstp
    Class system-cpp-cgmp
    Class system-cpp-ospf
    Class system-cpp-igmp
    Class system-cpp-pim
    Class system-cpp-all-systems-on-subnet
    Class system-cpp-all-routers-on-subnet
    Class system-cpp-ripv2
    Class system-cpp-ip-mcast-linklocal
    Class system-cpp-dhcp-cs
    Class system-cpp-dhcp-sc
    Class system-cpp-dhcp-ss
    Class NTP-class
      Policy 102400 bps 1000 byte conform-action transmit exceed-action drop



觀察CoPP狀態

使用Show policy-map control-plane指令可以觀察及時的資料,如rate、符合的封包數等

使用 clear control-plane * 可以清除全部的計數



Cisco的rate和burst的概念


可以用緩衝區域和回復速度解釋rate和burst的設定意義

Burst算是一個緩衝區域,cisco把這個稱為桶子和硬幣(token)
一開始會在桶子裡放入 burst 設定的數量,當封包進入後會檢查桶子內的硬幣數量夠不夠多,不夠就執行exceed的動作,如果硬幣夠多就會移除跟封包大小一樣數量的硬幣,並執行conform的動作。

Rate就是回填桶子內的硬幣速度
每次有封包進到介面時,才會計算桶子內的硬幣數量,計算的依據是依照設定的Rate。桶子內最大個裝載數量是設定的Burst。
添加的公式,兩個封包的時間差 * Rate。如兩個封包相差100ms,且Rate設定為48000:
0.1 *( 48000 / 8) = 600 bytes 。 要除8是因為bit單位換成byte

Cisco有個專門的公式去計算間隔時間 : Tc = Bc/CIR
這個是QoS所使用的公式,在這邊改成 Tc = burst / rate 。
Tc – 每隔多久會把桶子內的硬幣回填完畢。(回填間隔),10ms - 125mss
Burst – 桶子最大可以放多少硬幣。shaper單位是 bit,Policy的單位是byte。在此是用Policy
Rate – 管理員設定的傳輸速度。單位是 bit per second

回填間隔最短是 4ms (4毫秒),當Tc超過125時,Cisco會自動計算比較符合實際環境的回填時間
指令show traffic可以看到Tc的間隔

Tc的計算例子
當設定rate為64000 ( bit/sec),而burst為 800 (byte),則Tc為
Tc = (800 * 8) / 64000
Tc = 0.1 or 100ms

(800要乘8是因為byte換成bit)
也就是每100ms 才會填滿桶子內的硬幣一次


實際封包進入的例子
rate為64000 ( bit/sec),而burst為 8000 (byte)
第一個封包進入,大小是5000 bytes,桶子內有8000 bytes,因此此封包執行conform-action,並移除5000 bytes,剩下3000 bytes。
第二個封包在0.25秒後進入(250ms),大小是6000 bytes,經過0.25秒桶子增加2000 bytes,總共有5000 bytes
0.25 * (64000/8) = 2000 bytes  增加2000bytes
第二個封包有6000 bytes,比5000bytes還大,因此執行exceed-action
第三個封包在0.1秒後進入,大小是5500 bytes,經過0.1秒桶子增加800 bytes,總共有5800 bytes
0.1 * (64000/8) = 2000 bytes  增加800bytes
桶子內有5800 bytes比封包大,此封包執行conform-action,並移除5500 bytes,剩下300 bytes。


Cisco建議的bc值是 rate * 1.5秒
舉個例子,當rate設定102400 (100KB/s),則bc因該設定為 19200 bytes
(102400/8) * 1.5 = 19200 bytes
Cisco建議的be值是 bc * 2




參考資料
http://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst4500/12-2/31sg/configuration/guide/conf/cntl_pln.html


留言

發佈留言

此網誌的熱門文章

WPA_supplicant的設定方式

DOS指令 -- SET和變數

Nginx server 和 location 優先順序