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
設定全文は下記ファイルです。詳細設定は下記を参照ください。
仕様説明
基本設定
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 | コネクションを閉じてからの管理時間 |