Control Plane Policing (CoPP)とControl Plane Protection (CPPr)は、ネットワーク機器のCPUを守る機能です。何も対策を立てない状況ですと、フラグメントされたパケットを大量に送付する等の方法を用いて、ネットワーク機器のCPU使用率を上昇させるDOS攻撃を行なう事ができます。このような攻撃に対する防御策として、CPU処理するパケットに対してポリシング(流量制限)をかける事によってCPUを守る事ができます。
このページでは、Control Plane Policing (CoPP)の使い方と設定例について紹介します。
Control Plane Policing (CoPP)とは
Control Plane Policing (CoPP)とは、ネットワーク機器のCPUを守る機能です。多くのネットワーク機器は、データ転送を行なう「データプレーン」とルーティングなどのソフトウェア処理を行なう「コントロールプレーン」の2層に分かれます。この構造を図で表すと以下の通りです ( 画像は「Cisco LANスイッチ教科書」より引用 ) 。
ルータ宛パケットや非IPはコントロールプレーンで処理されます(図中では「制御フレーム」と表記されています)。そのため、コントロールプレーン宛のパケットを大量に送付すれば、ルータのCPU使用率を上昇させDOS攻撃が可能になってしまいます。この攻撃に対する防御策がControl Plane Policing (CoPP)です。コントロールプレーン宛のパケットをポリシング(流量制限)する事で、ルータのCPUを守る事ができます。
Control Plane Policing (CoPP)の設定
アクセスリスト(ACL)の作成
Control Plane Policingを実装するには、policy-mapを作成する必要があります。policy-mapを作るにはclass-mapの定義が必要です。class-mapを定義するにはアクセスリスト(ACL)の定義が必要です。
まずは、以下のようなコマンドでアクセスリストを定義しましょう。構文および設定例は以下の通りです。
[構文:syntax] Router(config)# ip access-list extended <acl_name> Router(config-ext-nacl)# [<seq>] permit tcp any any eq <port> [設定例:example] Router(config)# ip access-list extended ACL_TELNET Router(config-ext-nacl)# 10 permit tcp any any eq telnet
作成したアクセスリスト(ACL)を確認するには、”show ip access-lists”コマンドなどを使用します。
Router# show ip access-lists Extended IP access list ACL_TELNET 10 permit tcp any any eq telnet Router#
上記は名前つき拡張アクセスリストの構文ですが、名前なしでも標準アクセスリストでも差し支えございません。
class-map (クラスマップ) の作成
アクセスリスト(ACL)を元に、class-map(クラスマップ)を作成します。構文および設定例は以下の通りです。
[構文:syntax] Router(config)# class-map <cmap_name> Router(config-cmap)# match access-group name <acl_name> [設定例:example] Router(config)# class-map CMAP_TELNET Router(config-cmap)# match access-group name ACL_TELNET
作成したclass-map (クラスマップ)を確認するには、”show class-map”コマンドなどを使用します。
Router#show class-map Class Map match-any class-default (id 0) Match any Class Map match-all CMAP_TELNET (id 1) Match access-group name ACL_TELNET Router#
なお、以下のようなCBAC指定のclass-map(クラスマップ)を用いた設定はできません。
Router(config)# class-map CMAP_ICMP Router(config-cmap)# match protocol icmp
CBAC指定でControl Plane Policing (CoPP)を設定しようとすると、”Unsupported protocol in”とのエラーメッセージが出力されます。
Router(config)# class-map CMAP_ICMP Router(config-cmap)# match protocol icmp Router(config-cmap)# exit Router(config)# Router(config)# Router(config)# policy-map PMAP_COPP Router(config-pmap)# class CMAP_ICMP Router(config-pmap-c)# police 12000 Router(config-pmap-c-police)# exit Router(config-pmap-c)# exit Router(config-pmap)# exit Router(config)# Router(config)# Router(config)# control-plane Router(config-cp)# service-policy input PMAP_COPP Unsupported protocol in 'match protocol' Unsupported protocol in 'match protocol' error: failed to install policy map PMAP_COPP Router(config-cp)#
policy-map (ポリシーマップ) の作成
class-map(クラスマップ)を元に、policy-map(ポリシーマップ)を作成します。構文および設定例は以下の通りです。
[構文:syntax] Router(config)# policy-map <pmap_name> Router(config-pmap)# class <cmap_name> Router(config-pmap-c)# police <rate> [設定例:example] Router(config)# policy-map PMAP_COPP Router(config-pmap)# class CMAP_TELNET Router(config-pmap-c)# police 8000
作成したpolicy-map(ポリシーマップ)を確認するには”show policy-map”コマンドを使用します。
Router# show policy-map Policy Map PMAP_COPP Class CMAP_TELNET police cir 8000 bc 1500 conform-action transmit exceed-action drop Router#
policy-map (ポリシーマップ) の適用
最後にpolicy-map (ポリシーマップ)をcontrol-planeに対して適用します。Interfaceに対するCBWFQと同じようにservice-policyコマンドを用いて適用します。 構文および設定例は以下の通りです。
[構文:syntax] Router(config)# control-plane Router(config-cp)# service-policy input <pmap_name> [設定例:example] Router(config)# control-plane Router(config-cp)# service-policy input PMAP_COPP
適用したポリシーマップを確認するには”show policy-map control-plane”コマンドを使用します。
Router# show policy-map control-plane Control Plane Service-policy input: PMAP_COPP Class-map: CMAP_TELNET (match-all) 0 packets, 0 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: access-group name ACL_TELNET police: cir 8000 bps, bc 1500 bytes conformed 0 packets, 0 bytes; actions: transmit exceeded 0 packets, 0 bytes; actions: drop conformed 0 bps, exceed 0 bps Class-map: class-default (match-any) 12 packets, 1296 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: any Router#
Control Plane Policing (CoPP)の動作確認
ネットワーク構成図
以下の環境で動作確認を行います。
初期設定
初期設定はIPアドレスのみです。特別な設定はございません。
TELNETに対するポリシング設定
TELNETのトラフィックについて、コントロールプレーンに対するポリシングを実装します。R2に対して、以下のような設定を投入して下さい。
[R2] ip access-list extended ACL_TELNET 10 permit tcp any any eq telnet ! class-map CMAP_TELNET match access-group name ACL_TELNET ! policy-map PMAP_COPP class CMAP_TELNET police 8000 ! control-plane service-policy input PMAP_COPP
動作確認のため、R1からR2へのTELNETトラフィックを発生させます。
[R1] R1#telnet 192.168.12.2 Trying 192.168.12.2 ... Open Password required, but none set [Connection to 192.168.12.2 closed by foreign host] R1#
R2で”show policy-map control-plane”コマンドを実行します。”conformed 9 packets”と表示されている事から、想定通りの分類(classsify)がなされ、Control Plane Policingの設定が効いている事を推測する事ができます。
[R2] R2#show policy-map control-plane Control Plane Service-policy input: PMAP_COPP Class-map: CMAP_TELNET (match-all) 9 packets, 546 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: access-group name ACL_TELNET police: cir 8000 bps, bc 1500 bytes conformed 9 packets, 546 bytes; actions: transmit exceeded 0 packets, 0 bytes; actions: drop conformed 0 bps, exceed 0 bps Class-map: class-default (match-any) 22 packets, 2184 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: any R2#
PING(ICMP)に対するポリシング設定
前述のTELNETを用いた動作確認では、超過トラフィックが本当に破棄されているかどうかが動作確認できませんでした。そこで、大量のトラフィックを容易に発生させる事ができるPING (ICMP)を用いた動作確認を行ってみましょう。
PING (ICMP)のトラフィックについて、コントロールプレーンに対するポリシングを実装します。R2に対して、以下のような設定を投入して下さい。
[R2] ip access-list extended ACL_TELNET 10 permit tcp any any eq telnet ip access-list extended ACL_ICMP 10 permit icmp any any ! class-map CMAP_TELNET match access-group name ACL_TELNET class-map CMAP_ICMP match access-group name ACL_ICMP ! policy-map PMAP_COPP class CMAP_TELNET police 8000 class CMAP_ICMP police 8000 ! control-plane service-policy input PMAP_COPP
R1からR2へのpingを送信します。pingを送信する際は、トラフィック超過を発生しやすくするようpingのsizeを適宜指定します。pingが数発に1度の割合でtimeoutが発生していることから、パケットの破棄が行なわれている事が推測できます。
[R1] R1#ping 192.168.12.2 size 500 repeat 20 timeout 1 Type escape sequence to abort. Sending 20, 500-byte ICMP Echos to 192.168.12.2, timeout is 1 seconds: ..!!.!!!!.!!!!..!!!! Success rate is 70 percent (14/20), round-trip min/avg/max = 172/268/348 ms R1#
R2で”show policy-map control-plane”の出力を確認します。Class-map: CMAP_ICMPについて”exceeded 4 packets”と書かれている事からも、トラフィック超過分が破棄されている事が読み取れます。
[R2] R2# show policy-map control-plane Control Plane Service-policy input: PMAP_COPP Class-map: CMAP_TELNET (match-all) 10 packets, 606 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: access-group name ACL_TELNET police: cir 8000 bps, bc 1500 bytes conformed 10 packets, 606 bytes; actions: transmit exceeded 0 packets, 0 bytes; actions: drop conformed 0 bps, exceed 0 bps Class-map: CMAP_ICMP (match-all) 26 packets, 16364 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: access-group name ACL_ICMP police: cir 8000 bps, bc 1500 bytes conformed 22 packets, 13308 bytes; actions: transmit exceeded 4 packets, 3056 bytes; actions: drop conformed 0 bps, exceed 0 bps Class-map: class-default (match-any) 84 packets, 8495 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: any R2#
class-default(クラスデフォルト)に対するポリシング設定
全てのトラフィックについてコントロールプレーンに対するポリシングを実装するには、class-default(クラスデフォルト)を使用します。class-defaultに含まれるのはIPだけでなく非IPも含まれます。非IPの代表的な例は以下の通りです。
- Layer 2 トラフィック ( 例 : ARP, LACP, PAgP )
- 非IPのLayer 3 トラフィック ( 例 : IPX, Apple Talk )
非IPも含め、ポリシングが実装可能な事を確認します。R2に対して、以下のような設定を投入して下さい。
[R2] ip access-list extended ACL_TELNET 10 permit tcp any any eq telnet ip access-list extended ACL_ICMP 10 permit icmp any any ! class-map CMAP_TELNET match access-group name ACL_TELNET class-map CMAP_ICMP match access-group name ACL_ICMP ! policy-map PMAP_COPP class CMAP_TELNET police 8000 class CMAP_ICMP police 8000 class class-default police 8000 ! control-plane service-policy input PMAP_COPP
非IPに関する動作を確認するため、R1,R2間でIPXによるルーティングを設定します。R1, R2の両方に以下のような設定を投入します。
[R1,R2] ipx routing ! interface FastEthernet 0/0 ipx network 12
R2のIPXアドレスを調べるために、”show ipx interface”コマンドを出力させます。すると、R2のIPXアドレスは”12.ca02.0bc8.0008″である事が分かります。
[R2] R2# show ipx interface FastEthernet 0/0 FastEthernet0/0 is up, line protocol is up IPX address is 12.ca02.0bc8.0008, NOVELL-ETHER [up] Delay of this IPX network, in ticks is 1 IPXWAN processing not enabled on this interface. IPX SAP update interval is 60 seconds IPX type 20 propagation packet forwarding is disabled <omitted>
R1からR2へのIPX pingを送信します。size, timeoutなどを適宜指定したIPX pingを使用するには、拡張ping(対話形式のping)を使用して下さい。IPX pingが数発に1度の割合でtimeoutが発生していることから、パケットの破棄が行なわれている事が推測できます。
[R1] R1#ping Protocol [ip]: ipx Target IPX address: 12.ca02.0bc8.0008 Repeat count [5]: 20 Datagram size [100]: 500 Timeout in seconds [2]: 1 Verbose [n]: Type escape sequence to abort. Sending 20, 500-byte IPX Novell Echoes to 12.ca02.0bc8.0008, timeout is 1 seconds: !!!.!!.!!!.!!.!!!.!! Success rate is 75 percent (15/20), round-trip min/avg/max = 32/105/172 ms R1#
R2で”show policy-map control-plane”の出力を確認します。Class-map: class-defaultについて”exceeded 5 packets”と書かれている事からも、トラフィック超過分が破棄されている事が読み取れます。
[R2] R2#show policy-map control-plane Control Plane Service-policy input: PMAP_COPP Class-map: CMAP_TELNET (match-all) 10 packets, 606 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: access-group name ACL_TELNET police: cir 8000 bps, bc 1500 bytes conformed 10 packets, 606 bytes; actions: transmit exceeded 0 packets, 0 bytes; actions: drop conformed 0 bps, exceed 0 bps Class-map: CMAP_ICMP (match-all) 26 packets, 16364 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: access-group name ACL_ICMP police: cir 8000 bps, bc 1500 bytes conformed 22 packets, 13308 bytes; actions: transmit exceeded 4 packets, 3056 bytes; actions: drop conformed 0 bps, exceed 0 bps Class-map: class-default (match-any) 203 packets, 28922 bytes 5 minute offered rate 0 bps, drop rate 0 bps Match: any police: cir 8000 bps, bc 1500 bytes conformed 85 packets, 14965 bytes; actions: transmit exceeded 5 packets, 2570 bytes; actions: drop conformed 0 bps, exceed 0 bps R2#
以上、ここまでの設定は以下の通りになります。
非IPのみに対するポリシング設定
CCIE Lab試験では、「思いつくか、思いつかないか」発想力勝負の問題が出題される事があります。例えば、
- R2に接続されたサーバではネットワークプログラミングのテストを行っています。
- テストの何らかの手違いにより、サーバ機器が大量のARP repuestを発生させ、R2のCPUリソースを枯渇させています。
- R2に対するARP requestについて、秒間10,000パケットを超過したものを破棄して下さい。
- ただし、この設定はIPパケット(TELNET, BGPなど)に影響を与えてはいけません。
のような問題が出題されます。回答例は以下URLを参照ください。
思いついてしまえば難しい設定ではありませんので、解説と動作確認は割愛します。
動作確認環境
動作確認を行った環境は以下の通りです。
- 動作確認日 : 2015/01/17
- GNS version 1.2.3
- Cisco IOS version 15.0