Cisco IOS TCP intercept watch modeの設定

スポンサーリンク

TCP interceptはTCPを覗き見し、syn floodを回避する手段のひとつです。watch modeとintercept modeが存在しますが、ここではCPU使用率の低いwatch modeについて紹介します。

概要

TCP InterceptはHalf Connectionを検知しDOS攻撃を防止する機能です。DOS攻撃の防止は、Cisco IOS FirewallやZone Based Firewallでも実装可能ですが、TCP Interceptは実装が最も簡単かつCPU使用率が少ない方法になります。

なお、TCP Interceptには以下のwatch modeとintercept modeが存在します。

mode 説明
watch mode パケットを覗き見しhalf-conectionが一定数を超えた場合は、
サーバ側にRSTを送信しhalf-connectionを防止します。
intercept mode
(default)
ルータ, クライアント間でconnectionを確立した後に、
ルータ, サーバ間でconnetcionを確立します。
サーバにhalf-connectionが発生しないメリットが存在するものの、
watch modeに比べCPU使用率が高いというデメリットもあります。

コマンド一覧

このシナリオで重要なコマンド一覧は以下の通りです。

Router(config)# ip tcp intercept list <ext_acl>
Router(config)# ip tcp intercept mode [ intercept | watch ]

Router(config)# ip tcp intercept max-incomplete low <num>
Router(config)# ip tcp intercept max-incomplete high <num>
Router(config)# ip tcp intercept one-minute low <num>
Router(config)# ip tcp intercept one-minute high <num>
Router(config)# ip tcp intercept drop-mode [ oldest | random ]

 [watch mode 限定]
Router(config)# ip tcp intercept watch-timeout <sec>

 [intercept mode 限定]
Router(config)# ip tcp intercept finrst-timeout <sec>
Router(config)# ip tcp intercept connection-timeout <sec>

構成図

以下の構成で動作確認を行います。

         e0/0    e0/1      e0/0    e0/1
 +--------+.1    .2+--------+.2  dhcp+--------+
 |   R1   +--------+   R2   +--------+   R3  | 
 +--------+        +--------+        +--------+
        192.168.12.0/24   192.168.23.0/24
   Inside           Firewall           Outside

 R1 Loopback0     R2 Loopback0     R3 Loopback0
 10.1.1.1/32      10.2.2.2/32      10.3.3.3/32
 [R1]
router rip
 version 2
 network 10.0.0.0
 network 192.168.12.0
 no auto-summary

 [R2]
router rip
 version 2
 network 10.0.0.0
 network 192.168.12.0
 network 192.168.23.0
 no auto-summary

 [R3]
router rip
 version 2
 network 10.0.0.0
 network 192.168.23.0
 no auto-summary

設定全文は下記ファイルです。詳細設定は下記を参照ください。

    R1
    !
    version 12.4
    service timestamps debug datetime msec
    service timestamps log datetime msec
    no service password-encryption
    !
    hostname R1
    !
    boot-start-marker
    boot-end-marker
    !
    !
    no aaa new-model
    memory-size iomem 5
    !
    !
    ip cef
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    interface Loopback0
     ip address 10.1.1.1 255.255.255.255
    !
    interface Ethernet0/0
     ip address 192.168.12.1 255.255.255.0
     half-duplex
    !
    interface Ethernet0/1
     no ip address
     shutdown
     half-duplex
    !
    interface Ethernet0/2
     no ip address
     shutdown
     half-duplex
    !
    interface Ethernet0/3
     no ip address
     shutdown
     half-duplex
    !
    !
    router rip
     version 2
     network 10.0.0.0
     network 192.168.12.0
     no auto-summary
    !
    ip http server
    ip forward-protocol nd
    !
    !
    !
    !
    !
    !
    control-plane
    !
    !
    !
    !
    mgcp behavior g729-variants static-pt
    !
    !
    !
    !
    !
    line con 0
    line aux 0
    line vty 0 4
     login
    !
    !
    end
    
    R2
    !
    version 12.4
    service timestamps debug datetime msec
    service timestamps log datetime msec
    no service password-encryption
    !
    hostname R2
    !
    boot-start-marker
    boot-end-marker
    !
    !
    no aaa new-model
    memory-size iomem 5
    !
    !
    ip cef
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    interface Loopback0
     ip address 10.2.2.2 255.255.255.255
    !
    interface Ethernet0/0
     ip address 192.168.23.2 255.255.255.0
     half-duplex
    !
    interface Ethernet0/1
     ip address 192.168.12.2 255.255.255.0
     half-duplex
    !
    interface Ethernet0/2
     no ip address
     shutdown
     half-duplex
    !
    interface Ethernet0/3
     no ip address
     shutdown
     half-duplex
    !
    !
    router rip
     version 2
     network 10.0.0.0
     network 192.168.12.0
     network 192.168.23.0
     no auto-summary
    !
    ip http server
    ip forward-protocol nd
    !
    !
    !
    !
    !
    !
    control-plane
    !
    !
    !
    !
    mgcp behavior g729-variants static-pt
    !
    !
    !
    !
    !
    line con 0
    line aux 0
    line vty 0 4
     login
    !
    !
    end
    
    R3
    !
    version 12.4
    service timestamps debug datetime msec
    service timestamps log datetime msec
    no service password-encryption
    !
    hostname R3
    !
    boot-start-marker
    boot-end-marker
    !
    enable password cisco
    !
    no aaa new-model
    memory-size iomem 5
    !
    !
    ip cef
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    !
    interface Loopback0
     ip address 10.3.3.3 255.255.255.255
    !
    interface Ethernet0/0
     no ip address
     shutdown
     half-duplex
    !
    interface Ethernet0/1
     ip address 192.168.23.3 255.255.255.0
     half-duplex
    !
    interface Ethernet0/2
     no ip address
     shutdown
     half-duplex
    !
    interface Ethernet0/3
     no ip address
     shutdown
     half-duplex
    !
    !
    router rip
     version 2
     network 10.0.0.0
     network 192.168.23.0
     no auto-summary
    !
    ip http server
    ip http path flash:
    ip forward-protocol nd
    !
    !
    !
    !
    !
    !
    control-plane
    !
    !
    !
    !
    mgcp behavior g729-variants static-pt
    !
    !
    !
    !
    !
    line con 0
    line aux 0
    line vty 0 4
     login
    !
    !
    end
    

    仕様説明

    基本設定

    TCP interceptの基本的な設定は以下の通りです。TCP interceptの対象となるパケットをextended ACLで指定します。

    デフォルト設定はCPU使用率が高いintercept modeで、watch modeに変更するためには明示的なコマンドが必要です。

    Router(config)# ip tcp intercept list <ext_acl>
    Router(config)# ip tcp intercept mode watch
    

    watch-timeout

    tcp intercept watch modeは、一定時間以内にコネクションを確立しなかった場合、RSTの送信によってhalf-connectionを防ぎます。以下、watch-timeoutを定義する事によって、コネクションを確立するまでの時間を定義する事ができます。(このパラメータはwatch mode専用です。intercept modeではこのパラメータは意味をなしません。)

    Router(config)# ip tcp intercept watch-timeout <sec>
    

    half-connection

    tcp interceptはhalf-connection数を管理する機能もあります。以下のコマンドは、許容するhalf-conncetion数の定義です。

    Router(config)# ip tcp intercept max-incomplete low <num>
    Router(config)# ip tcp intercept max-incomplete high <num>
    

    以下のコマンドは、許容する1分あたりのhalf-conncetion数の定義です。

    Router(config)# ip tcp intercept one-minute low <num>
    Router(config)# ip tcp intercept one-minute high <num>
    

    drop-mode

    上記で定義したhalf-connection数の上限に達した場合はconnectionが破棄されますが、以下のコマンドで破棄方法を定義する事ができます。

    drop-mode 説明
    oldest (default) 最も古いコネクションから順に削除します。
    random コネクションをランダムに削除します。
    Router(config)# ip tcp intercept drop-mode [ oldest | random ]
    

    max-incomplete

    設定投入

    R2にsynflood対策の設定を投入します。half-connection数が10を超えたらコネクションを破棄するようにし、half-connection数が1を下回ったらコネクション破棄を止めます。

     [R2]
    ip access-list extended ACL_TCP_INTERCEPT
     10 permit tcp any host 10.3.3.3 eq www
    !
    ip tcp intercept list ACL_TCP_INTERCEPT
    ip tcp intercept mode watch
    ip tcp intercept max-incomplete low 1
    ip tcp intercept max-incomplete high 10
    

    動作確認準備

    R1からR3へのsyn flood攻撃ができるよう、R1にsynを拒否するACLを適用します。

     [R1]
    ip access-list extended ACL_DENY_SYN
     deny   tcp any any syn
     permit ip any any
    !
    interface Ethernet0/0
     ip access-group ACL_DENY_SYN in
    

    攻撃の頻度をあげるため、R1のtcpパラメータを変更します。R2も攻撃を検知しやすいよう、half-openのコネクションを管理する時間を長めに設定します。

     [R1]
    ip tcp synwait-time 5
    
     [R2]
    ip tcp intercept watch-timeout 90
    

    動作確認

    以下のコマンドを連続で入力し、R1からR3へのsyn flood攻撃を行います。

     [R1]
    R1#telnet 10.3.3.3 80 /source-interface loopback 0
    Trying 10.3.3.3, 80 ...
    % Connection timed out; remote host not responding
    
    R1#telnet 10.3.3.3 80
    Trying 10.3.3.3, 80 ...
    % Connection timed out; remote host not responding
    
    R1#
    
     <omitted>
    
    

    R2には以下のようなメッセージが表示される事から、コネクションを破棄している様子が読み取れます。

     [R2]
    R2#show tcp intercept connections
    Incomplete:
    Client                Server                State    Create   Timeout  Mode
    10.1.1.1:58937        10.3.3.3:80           SYNRCVD  00:00:19 00:01:10 W
    10.1.1.1:47679        10.3.3.3:80           SYNRCVD  00:00:13 00:01:16 W
    10.1.1.1:38645        10.3.3.3:80           SYNRCVD  00:00:49 00:00:40 W
    10.1.1.1:36498        10.3.3.3:80           SYNRCVD  00:00:38 00:00:51 W
    10.1.1.1:65414        10.3.3.3:80           SYNRCVD  00:00:32 00:00:57 W
    10.1.1.1:13233        10.3.3.3:80           SYNRCVD  00:00:55 00:00:34 W
    10.1.1.1:22463        10.3.3.3:80           SYNRCVD  00:00:08 00:01:21 W
    10.1.1.1:41056        10.3.3.3:80           SYNRCVD  00:00:44 00:00:45 W
    10.1.1.1:14507        10.3.3.3:80           SYNRCVD  00:00:26 00:01:03 W
    10.1.1.1:63881        10.3.3.3:80           SYNRCVD  00:00:02 00:01:27 W
    
    Established:
    Client                Server                State    Create   Timeout  Mode
    R2#
    *Mar  1 00:08:10.343: %TCP-6-INTERCEPT: getting aggressive, count (10/10) 1 min 7
    *Mar  1 00:09:34.283: %TCP-6-INTERCEPT: calming down, count (0/1) 1 min 5
    R2#
    

    パケットの観察

    この時のR2, R3間のパケットを観察すると以下の通りです。half-openのコネクションが上限に達すると、R2からR3へRSTを送信する事でコネクションの破棄を試みます。

    No.     Time        Source                Destination           Protocol Length Info
         29 19.230000   10.1.1.1              10.3.3.3              TCP      60     16792 > http [SYN] Seq=0 Win=4128 Len=0 MSS=536
         30 19.260000   10.3.3.3              10.1.1.1              TCP      60     http > 16792 [SYN, ACK] Seq=4184147196 Ack=1 Win=4128 Len=0 MSS=536
         31 19.290000   192.168.12.1          10.3.3.3              ICMP     70     Destination unreachable (Communication administratively filtered)
         32 22.880000   10.1.1.1              10.3.3.3              TCP      60     exonet > http [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
    

    one-minute

    設定投入

    R2にsynflood対策の設定を投入します。1分あたりのhalf-connection数が5を超えたらコネクションを破棄するようにします。

     [R2]
    ip tcp intercept one-minute low 1
    ip tcp intercept one-minute high 5
    

    動作確認

    以下のコマンドを連続で入力し、R1からR3へのsyn flood攻撃を行います。

     [R1]
    R1#telnet 10.3.3.3 80 /source-interface loopback 0
    Trying 10.3.3.3, 80 ...
    % Connection timed out; remote host not responding
    
    R1#telnet 10.3.3.3 80
    Trying 10.3.3.3, 80 ...
    % Connection timed out; remote host not responding
    
    R1#
    
     <omitted>
    
    

    R2には以下のようなメッセージが表示される事から、コネクションを破棄している様子が読み取れます。

     [R2]
    R2#show tcp intercept connections
    Incomplete:
    Client                Server                State    Create   Timeout  Mode
    10.1.1.1:59920        10.3.3.3:80           SYNRCVD  00:00:17 00:01:12 W
    10.1.1.1:58046        10.3.3.3:80           SYNRCVD  00:00:44 00:00:45 W
    10.1.1.1:31631        10.3.3.3:80           SYNRCVD  00:00:35 00:00:54 W
    10.1.1.1:33891        10.3.3.3:80           SYNRCVD  00:00:52 00:00:37 W
    10.1.1.1:37065        10.3.3.3:80           SYNRCVD  00:00:23 00:01:06 W
    10.1.1.1:38070        10.3.3.3:80           SYNRCVD  00:00:29 00:01:00 W
    
    Established:
    Client                Server                State    Create   Timeout  Mode
    R2#
    R2#
    R2#show tcp intercept statistics
    Watching new connections using access-list ACL_TCP_INTERCEPT
    6 incomplete, 0 established connections (total 6)
    6 connection requests per minute
    R2#
    R2#
    *Mar  1 00:21:02.927: %TCP-6-INTERCEPT: getting aggressive, count (6/10) 1 min 6
    *Mar  1 00:22:52.387: %TCP-6-INTERCEPT: calming down, count (0/1) 1 min 0
    R2#
    

    synwait-time

    設定投入

    synwait-timeの挙動を観察するため、R2のwatch-timeot値を変更します。動作確認のため”debug ip tcp intercept”を有効にします。

     [R2]
    ip tcp intercept watch-timeout 15
    
    R2#debug ip tcp intercept
    TCP intercept debugging is on
    R2#
    

    動作確認

    以下のコマンドを入力し、R1からR3へのsyn flood攻撃を行います。

     [R1]
    R1#telnet 10.3.3.3 80 /source-interface loopback 0
    Trying 10.3.3.3, 80 ...
    % Connection timed out; remote host not responding
    
    R1#
    

    R2のデバッグログからwatch-timeoutで指定した15秒間half-connectionを管理していた事が読み取れます。

     [R2]
    R2#
    *Mar  1 00:26:29.623: INTERCEPT: new connection (10.1.1.1:52780 SYN -> 10.3.3.3:80)
    *Mar  1 00:26:29.707: INTERCEPT: (10.1.1.1:52780 <- ACK+SYN 10.3.3.3:80)
    *Mar  1 00:26:31.691: INTERCEPT: server packet passed in SYNRCVD (10.1.1.1:52780 <- 10.3.3.3:80)
    *Mar  1 00:26:44.623: INTERCEPT: SYNRCVD timing out (10.1.1.1:52780 <-> 10.3.3.3:80)
    *Mar  1 00:26:44.627: INTERCEPT(*): (10.1.1.1:52780 RST -> 10.3.3.3:80)
    R2#
    

    Tips

    出題パターン

    CCIE R&S試験では、DoS攻撃対策としてTCP Intercept watch modeを投入する出題パターンがよく見られます。以下のように、TCP Interceptを行う対象を定義しwatch modeへの変更とwatch-timeoutの定義を行うパターンがよく出題されます。

    Router(config)# ip tcp intercept list <ext_acl>
    Router(config)# ip tcp intercept mode watch
    Router(config)# ip tcp intercept watch-timeout <sec>
    

    なお、問題文に”IOS Firewallを使用しろ”などの明らかにTCP intercept watch mode以外を暗示する指示がない限りは、TCP Intercept watch modeを使用するのが無難なようです。

    DOS攻撃対策に関するパラメータ

    DOS攻撃対策に関するパラメータをまとめると以下のようになります。

    feature command description
    tcp intercept
    watch mode
    ip tcp intercept watch-timeout コネクションを確立するまで時間
    tcp intercept
    intercept mode
    ip tcp intercept connection-timeout idleコネクションを管理する時間
    tcp intercept
    intercept mode
    ip tcp intercept finrst-timeout コネクションを閉じてからの管理時間
    IOS firewall ip tcp synwait-time コネクションを確立するまで時間
    IOS firewall ip tcp idle-time idleコネクションを管理する時間
    IOS firewall ip tcp finwait-time コネクションを閉じてからの管理時間
タイトルとURLをコピーしました