連載
» 2010年07月14日 00時00分 UPDATE

iptablesテンプレート集 改訂版(7):iptablesでできるDoS/DDoS対策 (1/3)

この連載では、初心者にとってハードルの高いiptablesの設定を、テンプレートを用いながら紹介していきます。「習うより慣れよ!」の精神でまず試してみてはいかがでしょう。(編集部)

[鶴長鎮一,@IT]

はじめに

 今回はDoS/DDoS対策を紹介します。今回はiptablesを使った方法とともに、Linuxのカーネルパラメータを使った方法も紹介します。

関連リンク:

Linuxで作るファイアウォール[パケットフィルタリング設定編]
http://www.atmarkit.co.jp/flinux/rensai/security05/security05a.html

連載記事 「習うより慣れろ! iptablesテンプレート集」
http://www.atmarkit.co.jp/flinux/index/indexfiles/iptablesindex.html

連載記事 「習うより慣れろ! iptablesテンプレート集 改訂版」
http://www.atmarkit.co.jp/flinux/index/indexfiles/newiptablesindex.html


DoS/DDoS対策の難しさ

 DoS攻撃(Denial of Service attacks)はネットワークの帯域を消費するほか、大量のリクエストでサーバのコネクションを食いつぶし、サーバを利用不能に陥れます。またパスワードを解読しようと総当たりで接続を試みるブルートフォース(Brute Force)攻撃も横行しています。

 攻撃元が1台のホストならIPアドレスに基づいて規制できますが、攻撃元を特定できないDDoS(Distributed Denial of Service attacks)攻撃にはほかの手段が必要です。そこで、リクエスト応答回数に制限を設けるといった対策を実施します。

2通りの対策方法

 パケットをカウントし回数で制限するのに、iptablesには2種類のモジュールが用意されています。

 1つは、第1回でログの出力を抑制するために使用した「limit」モジュールです。パケットをカウントし、回数に応じて制限を実施します。ただし送信元のIPアドレスで回数制限を加えるには、対象のIPアドレスを都度指定しiptablesを実行する必要があります。そのため送信元を特定できないDDoS攻撃には役立ちません。

 もう1つの「hashlimit」モジュールなら、クライアントのIPアドレスごとにパケット数をカウントし、iptables実行時にクライアントごとに制限を実施することができます。その際、個々のIPアドレスを指定する必要もありません。

 今回は、次の3つのDoS/DDoS対策方法を解説します。

テンプレート12
応答回数を制限する(limit編)

r10fig_tmp12.jpg

サーバとして
受信パケットは破棄。ただしステートフル性を確認しサーバから送信されたパケットに関連するものは許可
送信パケットは基本的にすべて許可
ループバックアドレスに関してはすべて許可
サーバからのDNS問い合わせ(UDP 53)を許可
pingリクエストを許可
ssh接続を許可

DoS/DDoS対策のため
pingリクエストに対し1分間に10回までしか応答しない
ssh接続リクエストに対し1分間に1接続に限定

テンプレート12の表示(別ウィンドウで開く)

テンプレート12の解説

 いままでのテンプレートでは、Linuxサーバに対してpingに対する応答やssh接続許可を、特定のホストに限定していました。しかし運用の都合上ホストを限定できない場合もあります。そこで、クライアントのIPアドレスで規制を掛ける代わりに応答回数に制限を設けることで、リスクを低減します。

 テンプレート12ではICMP Pingエコーの応答回数を、最大10回(10回リクエストに応答した後は1分に1回)に制限しています。「--limit-burst 10」で最大応答回数を10回としています。10回までは無条件に応答し、11回目の応答は破棄されます。

 ただし「--limit 1/m」と指定することで、1分経過するごとに1回の応答が可能になり、もし10分間pingエコーが行われなければ、再び10回までリクエストに応じられるようになります。「--limit 2/m」と指定すれば、1/2分、すなわち30秒に1回の接続が可能になります。

 20回までは無制限、それ以降は1分に5回ずつ応答するには「--limit 5/m --limit-burst 20」と設定します。「/m」のほかには「/s(1秒当たり)」「/h(1時間当たり)」といった単位が用意されています。

28 /sbin/iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/m --limit-burst 10 -j ACCEPT

-A INPUT            :受信パケットを指定
-p icmp             :ICMPプロトコルを指定
--icmp-type echo-request:pingエコーを指定
-m limit            :limitモジュールを有効化
--limit 1/m         :1分に1回
--limit-burst 10    :最大10回
-j ACCEPT           :条件にマッチしたパケットを許可
pingエコーの応答を制限する(10回リクエストに応答した後は1分に1回)

 テンプレート12では、受信パケット(INPUT)に関するデフォルトルールをDROPとし、破棄しています。ただしステートフル性を確認し、サーバのリクエストに対する受信パケットは許可しています。そのため、28行目のiptablesのマッチしないパケットは破棄されます。しかしデフォルトルールをACCEPTに設定している場合は、次のようにiptablesを実行し、制限に漏れたものを破棄する必要があります。

/sbin/iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

-j DENY :条件にマッチしたパケットを破棄
INPUTチェインのデフォルトルールをACCEPTにしている場合の追加設定

 pingエコー以外のものにも応答回数を制限することができます。例えばSSHサービスに対するリクエストに制限を実施するには、「--dport 22」とSSHのサービスポート番号「22番」を指定します。ssh接続中のパケットは規制しないよう、ssh接続開始時のリクエストパケットだけを制限するため「-m state --syn --state NEW」と指定します。そのほか、WWWサービスのリクエストを制限するには、サービスポート番号を変えて「--dport 80」のように指定します。そのほかのサービスにもポート番号を変えることで対応できます。

 パケットの規制は「-m limit --limit 1/m --limit-burst 1」としています。1分間に1回までssh接続が可能です。パスワードのタイプミスなどでログインに失敗すると、その後1分間はリクエストを受け付けません。パスワードを総当たりで解析するブルートフォース(Brute force)攻撃には有効です。

34 /sbin/iptables -A INPUT -p tcp --syn -m state --state NEW --dport 22 -m limit --limit 1/m --limit-burst 1 -j ACCEPT
ssh接続リクエストに対し1分間に1接続に限定

 pingエコーのときと同様に、受信(INPUT)パケットのデフォルトルールをACCEPTに設定している場合は、次のようなiptablesの実行が必要です。

/sbin/iptables -A INPUT -p tcp --syn -m state --state NEW --dport 22 -j DROP
INPUTチェインのデフォルトルールをACCEPTにしている場合の追加設定

 limitモジュールの制限では、正常なリクエストも不正アクセスに紛れてしまいます。クライアントごとにリクエスト回数を制限するには、次に紹介するテンプレート13のhashlimitモジュールを使用します。

       1|2|3 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。