Cisco IOS Firewallは”ip inspect”コマンドを用いて設定する片方向の通信を許可する機能です。ここでは、やや複雑な設定であるsyn flood対策について動作確認します。
コマンド一覧
このシナリオで重要なコマンド一覧は以下の通りです。
Router(config)# ip inspect max-incomplete low <num> Router(config)# ip inspect max-incomplete high <num> Router(config)# ip inspect one-minute low <num> Router(config)# ip inspect one-minute high <num> Router(config)# ip inspect tcp max-incomplete host <num> block-time <min> Router(config)# ip tcp synwait-time <sec> Router(config)# ip tcp finwait-time <sec> Router(config)# ip tcp idle-time <sec>
構成図
以下の構成で動作確認を行います。また、R3をHTTP serverとして設定します。
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 ! enable password cisco ip http server ip http path flash: ip http authentication enable ! show running-config | redirect flash:running-config
設定全文は下記ファイルです。詳細設定は下記を参照ください。
仕様説明
half-connection
cisco IOS Firewallはhalf connectionの数をカウントし、コネクションが一定数を超えた時点でコネクションを破棄する機能も備わっています。
以下のコマンドは、許容するhalf-connection数の定義です。
Router(config)# ip inspect max-incomplete low <num> Router(config)# ip inspect max-incomplete high <num>
以下のコマンドは、許容する1分あたりのhalf-connection数の定義です。
Router(config)# ip inspect one-minute low <num> Router(config)# ip inspect one-minute high <num>
以下のコマンドで、1ホストあたりの許容するhalf-connectoin数の定義です。connection上限に達した場合は、”block-time
Router(config)# ip inspect tcp max-incomplete host <num> block-time <min>
synwait-time
Cisco Firewallはfalf-openのコネクションを管理する時間を定める事ができます。具体的には、synを覗き見してから3way hand shakeが一定時間内に終了しない場合は、そのコネクション情報をセッションテーブルから破棄します。
以下のコマンドでhalf-openのコネクションを管理する時間を定義する事ができます。
Router(config)# ip tcp synwait-time <sec>
finwait-time
finを観測してからコネクション情報をセッションテーブルから削除するまでの時間を定義する事ができます。
Router(config)# ip tcp finwait-time <sec>
idle-time
コネクションが開かれたものの、何らかの理由で通信が止まってしまう可能性はあります。そのような通信をいつまでも管理していても意味がないので、一定時間活動がない通信はセッションテーブルから削除されます。
この活動がない通信に対するtimeout時間は以下のコマンドで指定する事ができます。
Router(config)# ip tcp idle-time <sec>
max-incomplete
設定投入
R2にsynflood対策の設定を投入します。half-connection数が10を超えたらコネクションを破棄するようにし、half-connection数が1を下回ったらコネクション破棄を止めます。
[R2] ip access-list extended ACL_DENY_ANY 10 permit udp any any eq rip 99 deny ip any any ! ip inspect max-incomplete low 1 ip inspect max-incomplete high 10 ip inspect name INSPECT http ip inspect name INSPECT icmp ! interface Ethernet0/0 ip access-group ACL_DENY_ANY in ip inspect INSPECT out
動作確認準備
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 inspect tcp synwait-time 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 ip inspect sessions Half-open Sessions Session 646D7B8C (10.1.1.1:50066)=>(10.3.3.3:80) http SIS_OPENING Session 646D858C (10.1.1.1:45123)=>(10.3.3.3:80) http SIS_OPENING Session 646D7E0C (10.1.1.1:64987)=>(10.3.3.3:80) http SIS_OPENING Session 646D880C (10.1.1.1:37444)=>(10.3.3.3:80) http SIS_OPENING Session 646D8A8C (10.1.1.1:45152)=>(10.3.3.3:80) http SIS_OPENING Session 646D8F8C (10.1.1.1:28805)=>(10.3.3.3:80) http SIS_OPENING Session 646D808C (10.1.1.1:57189)=>(10.3.3.3:80) http SIS_OPENING Session 646D768C (10.1.1.1:23933)=>(10.3.3.3:80) http SIS_OPENING Session 646D830C (10.1.1.1:30270)=>(10.3.3.3:80) http SIS_OPENING R2# *Mar 1 01:04:21.723: %FW-4-ALERT_ON: getting aggressive, count (11/10) current 1-min rate: 14 *Mar 1 01:05:57.907: %FW-4-ALERT_OFF: calming down, count (0/1) current 1-min rate: 0 R2#
パケットの観察
この時のR2, R3間のパケットを観察すると以下の通りです。half-openのコネクションが上限に達すると、R2からR3へRSTを送信する事でコネクションの破棄を試みます。
No. Time Source Destination Protocol Length Info 52 33.556000 10.1.1.1 10.3.3.3 TCP 60 35241 > http [SYN] Seq=0 Win=4128 Len=0 MSS=536 53 33.556000 10.1.1.1 10.3.3.3 TCP 60 30270 > http [RST, CWR] Seq=1 Win=4128 Len=0 54 33.602000 10.3.3.3 10.1.1.1 TCP 60 http > 35241 [SYN, ACK] Seq=0 Ack=1 Win=4128 Len=0 MSS=536
one-minute
設定投入
R2にsynflood対策の設定を投入します。1分あたりのhalf-connection数が5を超えたらコネクションを破棄するようにします。
[R2] ip inspect one-minute low 1 ip inspect 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# *Mar 1 01:25:09.215: %FW-4-ALERT_ON: getting aggressive, count (4/10) current 1-min rate: 6 R2# R2#show ip inspect sessions Half-open Sessions Session 646D8F8C (10.1.1.1:31400)=>(10.3.3.3:80) http SIS_OPENING Session 646D8D0C (10.1.1.1:62148)=>(10.3.3.3:80) http SIS_OPENING R2# *Mar 1 01:26:39.091: %FW-4-ALERT_OFF: calming down, count (0/1) current 1-min rate: 0 R2#
max-incomplete host
設定投入
R2にsynflood対策の設定を投入します。特定のホストからのhalf-openコネクション数が2を超えたら、そのホストからの通信を1分間遮断します。
[R2] ip inspect tcp max-incomplete host 2 block-time 1
動作確認
以下のコマンドを連続で入力し、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# *Mar 1 01:30:56.251: %FW-4-HOST_TCP_ALERT_ON: Max tcp half-open connections (2) exceeded for host 10.3.3.3. *Mar 1 01:30:56.255: %FW-2-BLOCK_HOST: Blocking new TCP connections to host 10.3.3.3 for 1 minute (half-open count 2 exceeded). *Mar 1 01:31:56.259: %FW-4-UNBLOCK_HOST: New TCP connections to host 10.3.3.3 no longer blocked R2#
synwait-time
設定投入
synwait-timeの挙動を観察するため、R2のsynwait-time値を変更します。動作確認しやすいようhttpのaudit-trailを有効にします。
[R2] ip inspect name INSPECT http audit-trail on ip inspect tcp synwait-time 15
動作確認
以下のコマンドを入力し、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のaudit-trail logからsynwait-timeで指定した15秒間half-connectionを管理していた事が読み取れます。
[R2] R2# *Mar 1 00:05:41.675: %FW-6-SESS_AUDIT_TRAIL_START: Start http session: initiator (10.1.1.1:65310) -- responder (10.3.3.3:80) *Mar 1 00:05:56.675: %FW-6-SESS_AUDIT_TRAIL: Stop http session: initiator (10.1.1.1:65310) sent 0 bytes -- responder (10.3.3.3:80) sent 0 bytes R2#
finwait-time
設定投入
finwait-timeの挙動を観察するため、R2のfinwait-time値を変更します。
[R2] ip inspect tcp finwait-time 10
動作確認準備
R1に投入したDos攻撃用のACLを削除します。
[R1] interface Ethernet0/0 no ip access-group ACL_DENY_SYN in
動作確認
以下のコマンドで、R1, R3間のHTTP通信を発生させます。
[R1] R1#copy http://cisco:cisco@10.3.3.3/running-config null: Loading http://***********@10.3.3.3/running-config ! 1003 bytes copied in 0.584 secs (1717 bytes/sec) R1#
R2のaudit-trail logからfinwait-timeで指定した10秒間half-connectionを管理していた事が読み取れます。
[R2] R2# *Mar 1 00:22:13.219: %FW-6-SESS_AUDIT_TRAIL_START: Start http session: initiator (192.168.12.1:22910) -- responder (10.3.3.3:80) *Mar 1 00:22:23.759: %FW-6-SESS_AUDIT_TRAIL: Stop http session: initiator (192.168.12.1:22910) sent 166 bytes -- responder (10.3.3.3:80) sent 1278 bytes R2#
idle-time
設定投入
idle-timeの挙動を観察するため、R2のidle-time値を変更します。
[R2] ip inspect tcp idle-time 30
動作確認準備
R3からRaへのfin ackを遮断しidle状態の通信を発生させます。idle-timeを観測しやすいようR1がhttp通信の再送を行わないよう”retry 1″を投入します。
[R2] ip access-list extended ACL_DENY_FIN 10 deny tcp any any fin 20 permit ip any any ! interface Ethernet0/0 ip access-group ACL_DENY_FIN in ! ip http client connection retry 1
動作確認
以下のコマンドで、R1, R3間のHTTP通信を発生させます。
[R1] R1#copy http://cisco:cisco@10.3.3.3/running-config null: %Error opening http://cisco:cisco@10.3.3.3/running-config (I/O error) R1#
R2のaudit-trail logからidlewait-timeで指定した30秒間connectionを管理していた事が読み取れます。
[R2] R2# *Mar 1 00:07:21.175: %FW-6-SESS_AUDIT_TRAIL_START: Start http session: initiator (192.168.12.1:53413) -- responder (10.3.3.3:80) *Mar 1 00:07:47.551: %FW-6-SESS_AUDIT_TRAIL: Stop http session: initiator (192.168.12.1:53413) sent 166 bytes -- responder (10.3.3.3:80) sent 1278 bytes R2#
Tips
以下 or 未満
CCIE R&Sの出題例のひとつで以下のような出題について考察します。
Router should start dropping incomplete connections when their number excees 50, and stop clamping when the number reaches 40.
この設問の解答は以下のようになります。
ip inspect max-incomplete low 41 ip inspect max-incomplete high 50
“ip inspect”コマンドは指定した値を超えるとコネクションを破棄し、指定した値を下回るとコネクション破棄を止めます。この設問は、コネクション数が40になる時にコネクション破棄を止めなければならないので、”low 41″と指定しなければなりません。
実践では全く気を使う必要のない問題ですが、Lab試験ではこのような問題が出題される可能性があるそうです。