CoPP
CoPP(control plane policing)
CoPP功能在於保護CPU,使其不受到DoS或不必要的封包進到CPU內進行運算。
CoPP使用Policy map來分類和處理封包。
(內容是依照原文翻譯而來,手頭沒有4500可以測試,可能會跟實際狀況有出入)
由CPU管理的流量可以分成三個不同的功能 :
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不能被修改)
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
其中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
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
|
|
system-cpp-dot1x
|
|
system-cpp-bpdu-range
|
|
system-cpp-cdp
|
|
system-cpp-garp-range
|
|
system-cpp-sstp
|
|
system-cpp-cgmp
|
|
system-cpp-ospf
|
|
system-cpp-igmp
|
|
system-cpp-pim
|
|
system-cpp-all-systems-on-subnet
|
|
system-cpp-all-routers-on-subnet
|
|
system-cpp-ripv2
|
|
system-cpp-ip-mcast-linklocal
|
|
system-cpp-dhcp-cs
|
|
system-cpp-dhcp-sc
|
|
system-cpp-dhcp-ss
|
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
正在準備 CCNP,這篇非常有幫助,謝謝
回覆刪除