Cisco IOS FirewallのDOS対策設定

スポンサーリンク

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

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

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
!
!
ip auth-proxy max-nodata-conns 3
ip admission max-nodata-conns 3
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
! 
!
!
!
!
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
no ip http secure-server
!
ip forward-protocol nd
!
!
!
!
!
control-plane
!
!
!
!
!
!
!
!
!
!
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
!
!
ip auth-proxy max-nodata-conns 3
ip admission max-nodata-conns 3
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
! 
!
!
!
!
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
no ip http secure-server
!
ip forward-protocol nd
!
!
!
!
!
control-plane
!
!
!
!
!
!
!
!
!
!
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
!
!
ip auth-proxy max-nodata-conns 3
ip admission max-nodata-conns 3
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
!
! 
!
!
!
!
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
no ip http secure-server
ip http path flash:
!
ip forward-protocol nd
!
!
!
!
!
control-plane
!
!
!
!
!
!
!
!
!
!
line con 0
line aux 0
line vty 0 4
 login
!
!
end

仕様説明

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試験ではこのような問題が出題される可能性があるそうです。

タイトルとURLをコピーしました