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

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

[鶴長鎮一,@IT]

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

r10fig_tmp13.jpg

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

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

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

テンプレート13の解説

 limitモジュールを使った制限では、正常なリクエストも不正アクセスに紛れてしまいます。ブルートフォース攻撃を受けている間は、管理者でさえもSSHログインできません。

 そこでhashlimitモジュールを使用します。hashlimitモジュールならクライアントのIPアドレスごとに接続回数をカウントし、クライアントごとに制限を実施できます。あるクライアントを不正アクセスで規制している間も、ほかのクライアントからは接続できます。

 クライアント(送信元)のIPアドレスのほか、あて先(ディスティネーション)アドレス/送信元ポート番号/あて先ポート番号、またはこれらの組み合わせで接続回数をカウントできます。

 hashlimitモジュールは「--hashlimit」や「--hashlimit-burst」など「--hashlimit-○○」オプションで設定します。

 「--hashlimit-name」は、hashlimitモジュールが利用するハッシュテーブル名を指定します。ハッシュテーブルは送信元IPアドレスやあて先アドレスごとに、リクエスト数や接続時間を管理するために利用します。ハッシュテーブルは「/proc/net/ipt_hashlimit/」の下にファイルとして保存されます。

 「--hashlimit 1/minute --hashlimit-burst 1」で同一ホストからの最大接続回数を1回、その後は1分間に1回まで接続を許可します。こうした接続回数は、管理ファイルによりクライアントごとにカウントされます。

 また、各クライアントのレコードに対し有効期間を設定できます。1年に1度しか接続がないクライアントのレコードを永久に保管する必要はありません。そこで、レコードを破棄すべき期間を「--hashlimit-htable-expire」でミリ秒単位で指定します。この値は「--hashlimit」で指定したものより大きなものにします。

 「--hashlimit-mode」では、何に基づいて接続数をカウントするかを設定します。クライアント(送信元)のアドレスごとにカウントするには「srcip」を指定します。そのほか、あて先アドレスでは「dstip」、送信元ポート番号では「srcport」、あて先ポート番号では「dstport」といったように指定します。組み合わせて使用する場合は「srcip,srcport」とします。この場合、送信元アドレスが一緒でも送信元のポート番号が変われば、異なる接続対象としてリクエスト数が管理されます。

34 /sbin/iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m hashlimit --hashlimit-name t_sshd --hashlimit 1/m --hashlimit-burst 1 --hashlimit-mode srcip --hashlimit-htable-expire 120000 -j ACCEPT

【オプション内容】
-m hashlimit            :hashlimitモジュールの利用
--hashlimit-name t_sshd :ハッシュテーブル名の指定
--hashlimit 1/m         :1分間に1回
--hashlimit-burst 1     :最大1回
--hashlimit-mode srcip  :送信元アドレスでリクエスト数を管理する
--hashlimit-htable-expire 120000 :管理テーブル中のレコードの有効期間(単位:ms)
送信元アドレスごとにSSHリクエストを1分間1回に制限する

 ハッシュテーブルの中身は次のように確認できます。ファイル名は「--hashlimit-name」で指定したものになります。1レコードにつき1行で、各クライアントの現在のカウント数が記録されています。

・管理ファイルの一覧

$ ls /proc/net/ipt_hashlimit/
t_icmp t_sshd
(※テンプレート13ではSSHサービスとともに、pingエコーに対しても接続制限を実施しています)

・管理ファイルの内容

$ more /proc/net/ipt_hashlimit/t_sshd
72 192.168.195.1:0->0.0.0.0:0 1920000 1920000 1920000
111 192.168.195.128:0->0.0.0.0:0 622880 1920000 1920000
hashlimitが使用する管理ファイル

 なお受信(INPUT)パケットのデフォルトルールをACCEPTに設定している場合は、次のようなiptablesの実行が必要です。34行目の制限に漏れたものを破棄します。

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

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

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

RSSについて

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

メールマガジン登録

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