DynagenでCCIEを目指す
tcp intercept
最終更新:
it_certification
-
view
1. 目的
- tcp interceptを使用したsyn flood対策について考察します。
2. 構成
2.1. 設定概要
- 初期設定はIPアドレスのみです。
- Host OS側でApacheを起動させます。
-
Guest OS側には、sendipがインストールされているものとします。(hpingに乗り換えました) - Guest OS側には、hpingがインストールされているものとします。hpingはyumで簡単にインストールする事ができます。
- Guest OS側に、syn flood攻撃を行うスクリプトを配置します。
2.2. 構成図

2.3. netファイル
model = 3620 [localhost] [[3620]] image = C:\Program Files\Dynamips\images\c3620-j1s3-mz.123-18.bin ram = 128 [[ROUTER R1]] f0/0 = NIO_gen_eth:\Device\NPF_{8B89D910-5ED3-4A43-9DE9-6A272A3D7592} f1/0 = NIO_gen_eth:\Device\NPF_{5933302A-7AAA-475C-A8FE-A6B82B0C0F98}
2.4. 初期設定
- R1
! version 12.3 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 ip subnet-zero ! ! no ip domain lookup ! ip cef ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! interface FastEthernet0/0 ip address 192.168.200.1 255.255.255.0 duplex auto speed auto ! interface FastEthernet1/0 ip address 192.168.201.1 255.255.255.0 duplex auto speed auto ! ip http server ip classless ! ! no cdp run ! ! ! ! ! ! line con 0 line aux 0 line vty 0 4 ! ! end
2.5. Apache 設定
ホストOSにApacheをインストールし、ポートベースのバーチャルホストを定義します。構築方法はトップページ/手順書 サーバ系/Apache HTTP Server バーチャルホストの設定を参考にして下さい。
この検証例で実際に使用したhttpd.confの要所となる部分を以下に記載します。
この検証例で実際に使用したhttpd.confの要所となる部分を以下に記載します。
Listen 10880 Listen 10881 Listen 10882 NameVirtualHost *:10880 NameVirtualHost *:10881 NameVirtualHost *:10882 <VirtualHost *:10880> DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs" </VirtualHost> <VirtualHost *:10881> DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs10881" </VirtualHost> <VirtualHost *:10882> DocumentRoot "C:/Program Files/Apache Software Foundation/Apache2.2/htdocs10882" </VirtualHost>
2.6. syn flood攻撃スクリプトの作成
以下のようなスクリプトを作成し、Guest OSからHost OSへSyn flood攻撃が行えるようにします。
なお、変数DELAYで定義されたsyn flood攻撃を行う間隔は適宜変更して下さい。マシンスペックによっては、攻撃間隔が短すぎるとパケットキャプチャに失敗してしまいます。
なお、変数DELAYで定義されたsyn flood攻撃を行う間隔は適宜変更して下さい。マシンスペックによっては、攻撃間隔が短すぎるとパケットキャプチャに失敗してしまいます。
#!/bin/sh DELAY=0.04 while true : do sport=$RANDOM dport=10880 #sendip -d '' -p ipv4 -p tcp -is 192.168.201.101 -ts $sport -td $dport 192.168.200.100 hping 192.168.200.100 -S -p $dport -s $sport -c 1 > /dev/null 2>&1 echo sport:${sport} sleep $DELAY done
2.7. iptablesの設定
syn flood攻撃を成功させるためには、SYN + ACKを無視しなければなりません。iptablesデフォルト設定では、SYN + ACKに対してRSTを返す設定になっている可能性があります。
私の場合は、送信元ポート10880であるものを無視するように設定しました。設定例は以下の通りです。
私の場合は、送信元ポート10880であるものを無視するように設定しました。設定例は以下の通りです。
[root@localhost ~]# cat /etc/sysconfig/iptables *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT -A RH-Firewall-1-INPUT -p 50 -j ACCEPT -A RH-Firewall-1-INPUT -p 51 -j ACCEPT -A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT -A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT -A RH-Firewall-1-INPUT -m tcp -p tcp --sport 10880 -j DROP <- syn flood攻撃を成功させるために、SYN + ACKを無視します。 -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited COMMIT
2.8. サーバ側 ルーティング設定
- Host OS
route add 192.168.201.0 mask 255.255.255.0 192.168.200.1
- Guest OS
route add -net 192.168.200.0/24 gw 192.168.201.1
3. [検証] 基本設定
3.1. 設定の投入
Guest OSからHost OSの方向へのtcp interceptを定義します。設定方法は以下の通りです。
R1(config)#ip access-list extended INTERCEPT R1(config-ext-nacl)#permit ip 192.168.201.0 0.0.0.255 192.168.200.0 0.0.0.255 R1(config-ext-nacl)#exit R1(config)# R1(config)#interface FastEthernet 1/0 R1(config-if)#ip access-group INTERCEPT in R1(config-if)#exit R1(config)# R1(config)# R1(config)#ip tcp intercept list INTERCEPT command accepted, interfaces with mls configured might cause inconsistent behavior R1(config)#
3.2. Syn flood攻撃の実行
syn flood攻撃スクリプトを実行します。
[root@localhost ~]# ./syn_flood.sh 27394 27376 28092
3.3. tcp interceptの確認
ルータR1のコンソール上に、tcp interceptが働いた旨のメッセージが表示された事を確認します。
また、show tcp intercept statisticsコマンドでリセットされたコネクション数を確認します。
また、show tcp intercept statisticsコマンドでリセットされたコネクション数を確認します。
R1# *Mar 1 00:29:32.419: %TCP-6-INTERCEPT: getting aggressive, count (1100/1100) 1 min 1 R1# R1# R1#show tcp intercept statistics Intercepting new connections using access-list INTERCEPT 1100 incomplete, 0 established connections (total 1100) <- 1100のハーフコネクションが存在するという意味です。 1307 connection requests per minute <- 1307のコネクションがリセットされたという意味です。 R1#
4. [検証] interceptモードとwatchモード
4.1. 概要
Interceptモードの場合、ルータが着信してくる全てのSYNパケットを横取りして、SYN/ACKを サーバの代わりに送信します。外部のクライアントからAckを受信すると、オリジナルSYNパケットをサーバに送信して、ルータはサーバと3way-handshakeします。
一方、watchモードの場合、SYNパケットをサーバへ転送しますが、established状態になるまで見ています。もしも30秒以内にestablishされない場合は、RSTパケットをサーバに送信しコネクションをリセットします。
一方、watchモードの場合、SYNパケットをサーバへ転送しますが、established状態になるまで見ています。もしも30秒以内にestablishされない場合は、RSTパケットをサーバに送信しコネクションをリセットします。
4.2. interceptモード
interceptモードの場合のパケットを観察します。デフォルトはinterceptモードなので特に設定は要りませんが、明示的に入力したい場合は以下のコマンドを実行します。
R1(config)#ip tcp intercept mode intercept
Fa0/0, Fa1/0でパケットキャプチャの準備をし、syn flood攻撃スクリプトを実行します。
ルータとGeust OS間のパケットは以下の通りです。
ルータとGeust OS間のパケットは以下の通りです。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (100%)
;
ルータとHost OS間のパケットは以下の通りです。syn flood攻撃がHost OSまで届いていない事が確認できます。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (100%)
;
4.3. watchモード
watchモードの場合のパケットを観察します。以下のコマンドを実行し、watchモードに変更します。
R1(config)#ip tcp intercept mode watch
Fa0/0, Fa1/0でパケットキャプチャの準備をし、syn flood攻撃スクリプトを実行します。
ルータとGeust OS間のパケットは以下の通りです。
ルータとGeust OS間のパケットは以下の通りです。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (100%)
;
ルータとHost OS間のパケットは以下の通りです。interceptモードと異なり、ある程度syn flood攻撃がHost OSに届いてしまっている事が読み取れます。また、30秒経ってもコネクションが確立されない通信に対し、ルータがHost OSに対してRSTを送信している様子が読み取れます。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (100%)
;
5. [検証] チューニング
5.1. interceptモード
interceptモードの場合、以下のような詳細の設定を投入する事もできます。
FIN, RSTを送信した後、コネクションを何秒メモリ内に保存するかを設定できます。
R1(config)#ip tcp intercept finrst-timeout 3
コネクションを何秒メモリ内に保存するかを設定できます。
R1(config)#ip tcp intercept connection-timeout 120
コネクション数の上限を指定できます。上限を超えた場合は、アグレッシブモードになりコネクションを破棄するようになります。
R1(config)#ip tcp intercept max-incomplete high 200
コネクション数の下限を指定します。下限を下回ると、アグレッシブモードからインターセプトモードに戻ります。
R1(config)#ip tcp intercept max-incomplete low 50
1秒あたりのコネクション数の上限を指定できます。上限を超えた場合は、アグレッシブモードになりコネクションを破棄するようになります。
R1(config)#ip tcp intercept one-minute high 200
1秒あたりのコネクション数の下限を指定します。下限を下回ると、アグレッシブモードからインターセプトモードに戻ります。
R1(config)#ip tcp intercept one-minute high 50
アグレッシブモードになった場合のパケット破棄方法を選択できます。選択肢は、oldestかrandomです。デフォルト設定はoldestです。
R1(config)#ip tcp intercept drop-mode random
5.2. watchモード
watchモードの場合、以下のような詳細の設定を投入する事もできます。
以下の設定でコネクションを「見る」時間を設定する事ができます。設定時間が過ぎてもコネクションが確立されない場合は、サーバ側にRSTを送信します。デフォルトは30秒です。
R1(config)#ip tcp intercept watch-timeout 20
6. [補足] 検証失敗例
6.1. iptablesの設定漏れ
syn flood攻撃を成功させるためには、SYN + ACKに対する応答を無視し、攻撃対象サーバのACK待ちを増やす必要があります。iptablesのデフォルト設定(もしくは無効)では、RSTパケットを送信してしまうため、syn flood攻撃になっていません。
iptablesの設定が漏れていた時のGeust OS, ルータ間のパケットキャプチャは以下の通りです。
iptablesの設定が漏れていた時のGeust OS, ルータ間のパケットキャプチャは以下の通りです。
#ref error :ご指定のファイルが見つかりません。ファイル名を確認して、再度指定してください。 (100%)
;