iptablesでできるDoS/DDoS対策:iptablesテンプレート集 改訂版(7)(2/3 ページ)
この連載では、初心者にとってハードルの高いiptablesの設定を、テンプレートを用いながら紹介していきます。「習うより慣れよ!」の精神でまず試してみてはいかがでしょう。(編集部)
テンプレート13
応答回数を制限する(hashlimit編)
サーバとして
・受信パケットは破棄。ただしステートフル性を確認しサーバから送信されたパケットに関連するものは許可
・送信パケットは基本的にすべて許可
・ループバックアドレスに関してはすべて許可
・サーバからのDNS問い合わせ(UDP 53)を許可
・pingリクエストを許可
・ssh接続を許可
DoS/DDoS対策のため
・同一ホストからのpingリクエストに対し、1分間に10回までしか応答しない
・同一ホストからのssh接続リクエストに対し、1分間に1接続に限定
テンプレート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)
ハッシュテーブルの中身は次のように確認できます。ファイル名は「--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
なお受信(INPUT)パケットのデフォルトルールをACCEPTに設定している場合は、次のようなiptablesの実行が必要です。34行目の制限に漏れたものを破棄します。
/sbin/iptables -A INPUT -p tcp --syn -m state --state NEW --dport 22 -j DROP
Copyright © ITmedia, Inc. All Rights Reserved.