Control Plane Policing (CoPP)

スポンサーリンク

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スイッチ教科書」より引用 ) 。

control_plane_data_plane_001

ルータ宛パケットや非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)の動作確認

ネットワーク構成図

以下の環境で動作確認を行います。

 

20150117_control_plane_policing

初期設定

初期設定は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
タイトルとURLをコピーしました