「iptables アクセス回数を制限する」の版間の差分
(ページの作成:「<!-- vim: filetype=mediawiki --> iptables は、単位時間あたりのアクセス回数を制限できます。 __TOC__ == 概要 == iptables でアクセ...」) |
|||
行58: | 行58: | ||
limit モジュールの制限では、正常なリクエストも[[不正アクセス]] にまぎれてしまいました。 | limit モジュールの制限では、正常なリクエストも[[不正アクセス]] にまぎれてしまいました。 | ||
クライアントごとにリクエスト回数を制限するには、 hashlimit モジュールを使用します。 | クライアントごとにリクエスト回数を制限するには、 hashlimit モジュールを使用します。 | ||
+ | |||
+ | === --hashlimit-name === | ||
+ | |||
+ | --hashlimit-name は、 hashlimit モジュールが使用するハッシュテーブル名を指定します。 | ||
+ | |||
+ | === --hashlimit === | ||
+ | |||
+ | 同一ホストからの最大接続回数は、1分間あたり1回まで許可します。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | --hashlimit 1/minute --hashlimit-burst 1 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | === --hashlimit-htable-expire === | ||
+ | |||
+ | クライアントのアクセスをカウントするときに、そのレコードを保持する期間を設定できます。 | ||
+ | レコードを保持する期間を --hashlimit-htable-expire を使用し、ミリ秒単位で指定できます。 | ||
+ | === -hashlimit-mode === | ||
+ | |||
+ | --hashlimit-mode では、何をキーにして接続数をカウントするかを指定します。 | ||
+ | |||
+ | クライアントの[[IPアドレス]] ごとにカウントする場合は、 srcip を指定します。 | ||
+ | 宛先の[[IPアドレス]] の場合は、 dstip です。 | ||
+ | 送信元ポート番号は、 srcport 、宛先ポート番号では、 dstport を指定します。 | ||
+ | srcip,srcport という組み合わせで指定できます。 | ||
+ | |||
+ | === sshd に対するアクセス制限の例 === | ||
+ | |||
+ | sshd に対する接続を1分間あたり、最大1回までに限定する例です。 | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | iptables -A INPUT -p tcp \ | ||
+ | -m state \ | ||
+ | --state NEW \ | ||
+ | --syn \ | ||
+ | --dport ssh \ | ||
+ | -m hashlimit \ | ||
+ | --hashlimit 1/m \ | ||
+ | --hashlimit-name t_sshd \ | ||
+ | --hashlimit-burst 1 \ | ||
+ | --hashlimit-mode srcip \ | ||
+ | --hashlimit-htable-expire 60000 \ | ||
+ | -j ACCEPT | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | 上記のコマンドの意味を下記に示します。 | ||
+ | |||
+ | {|class="wikitable" | ||
+ | |+ hashlimit による sshd のアクセス制限 | ||
+ | ! オプション | ||
+ | ! 説明 | ||
+ | |- | ||
+ | | -m hashlimit | ||
+ | | hashlimit モジュールを使用する。 | ||
+ | |- | ||
+ | | --hashlimit-name t_sshd | ||
+ | | ハッシュテーブル名を t_sshd とする。 | ||
+ | |- | ||
+ | | --hashlimit 1/m | ||
+ | | 1分間 | ||
+ | |- | ||
+ | | --hashlimit-burst 1 | ||
+ | | 最大1回 | ||
+ | |- | ||
+ | | --hashlimit-mode srcip | ||
+ | | 送信元 IPアドレスごとにリクエスト数を管理する。 | ||
+ | |- | ||
+ | | --hashlimit-htable-expire | ||
+ | | ハッシュテーブルのエントリの有効期間は、60000 ms (10分) とする。 | ||
+ | |} | ||
+ | |||
+ | === ハッシュテーブルの確認方法 === | ||
+ | |||
+ | ハッシュテーブルごとに /proc/net/ipt_hashlimit に--hashlimit-name で指定した名前でファイルが作成されます。 | ||
+ | 中身には、クライアントごとの現在のカウントに関する情報が記録されます。 | ||
+ | |||
+ | <syntaxhighlight lang="bash"> | ||
+ | sudo cat /proc/net/ipt_hashlimit/t_sshd | ||
+ | 59 192.168.0.128:0->0.0.0.0:0 584320 1920000 1920000 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | INPUT のデフォルトルール が ACCEPT の場合は、 DROP の設定が必要です。 | ||
+ | ページの関係で、改行が入っています。 | ||
+ | <syntaxhighlight lang="bash"> | ||
+ | -A INPUT -p tcp -m state --state NEW --syn --dport ssh -m hashlimit | ||
+ | --hashlimit 1/m \ --hashlimit-name t_sshd --hashlimit-burst 1 | ||
+ | --hashlimit-mode srcip --hashlimit-htable-expire 60000 -j ACCEPT | ||
+ | -A INPUT -p tcp --syn -m state --state NEW --dport ssh -j DROP | ||
+ | </syntaxhighlight> | ||
== 関連項目 == | == 関連項目 == | ||
* [[iptables]] | * [[iptables]] |
2013年8月18日 (日) 00:03時点における版
iptables は、単位時間あたりのアクセス回数を制限できます。
目次
概要
iptables でアクセス制限を行うための方法として、 limit モジュール や hashlimit モジュールがあります。
limit モジュールにおける制限
limit モジュールを使用して、アクセス制限を sshd に対して行うと、総当たり攻撃 を受けている時に、自分自身もログインができなくなるので、やるべきではないでしょう。
NAT / プロキシ されてる環境に複数のユーザーが存在する場合、異なるユーザのアクセスが同一IPアドレスからやってきます。 ISPなどの接続事業者や大きな企業からたくさんのアクセスが想定される場合、iptables でのアクセス制限は、うまく機能しないかもしれません。
PINGに対して回数制限を行う
1秒間に4回までアクセスを許可する例です。
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT
- -A INPUT
- 受信パケットを対象とします。
- -p icmp
- ICMP プロトコルを対象とします。
- --icmp-type echo-request
- ICMP のタイプは、ping エコーを指定します。
- -m limit
- limit モジュールを有効にします。
- --limit 1/s
- 1秒間あたり
- --limit-burst 4
- 最大4回
- -j ACCEPT
- 条件にマッチしたパケットを許可します。
INPUT チェインのデフォルトルールが ACCEPT にしている場合は、追加で DROP の設定が必要です。
-A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT -A INPUT -p icmp --icmp-type echo-request -j DROP
sshd へのアクセス制限
sshd に対するアクセス制限は、自信がログインできなくなる可能性があるため、推奨はできません。
22番ポート (sshd) に対して1分間に最大1分間の ssh の新規の接続を許可します。 INPUT のデフォルトルールが DENY の場合です。
-A INPUT -p tcp --syn -m state --state NEW --dport ssh -m limit --limit 1/m --limit-burst 1 -j ACCEPT
INPUT のデフォルトルールが ACCEPT の場合です。
-A INPUT -p tcp --syn -m state --state NEW --dport ssh -m limit --limit 1/m --limit-burst 1 -j ACCEPT -A INPUT -p tcp --syn -m state --state NEW --dport ssh -j DROP
hashlimit モジュールにおける制限
limit モジュールの制限では、正常なリクエストも不正アクセス にまぎれてしまいました。 クライアントごとにリクエスト回数を制限するには、 hashlimit モジュールを使用します。
--hashlimit-name
--hashlimit-name は、 hashlimit モジュールが使用するハッシュテーブル名を指定します。
--hashlimit
同一ホストからの最大接続回数は、1分間あたり1回まで許可します。
--hashlimit 1/minute --hashlimit-burst 1
--hashlimit-htable-expire
クライアントのアクセスをカウントするときに、そのレコードを保持する期間を設定できます。 レコードを保持する期間を --hashlimit-htable-expire を使用し、ミリ秒単位で指定できます。
-hashlimit-mode
--hashlimit-mode では、何をキーにして接続数をカウントするかを指定します。
クライアントのIPアドレス ごとにカウントする場合は、 srcip を指定します。 宛先のIPアドレス の場合は、 dstip です。 送信元ポート番号は、 srcport 、宛先ポート番号では、 dstport を指定します。 srcip,srcport という組み合わせで指定できます。
sshd に対するアクセス制限の例
sshd に対する接続を1分間あたり、最大1回までに限定する例です。
iptables -A INPUT -p tcp \ -m state \ --state NEW \ --syn \ --dport ssh \ -m hashlimit \ --hashlimit 1/m \ --hashlimit-name t_sshd \ --hashlimit-burst 1 \ --hashlimit-mode srcip \ --hashlimit-htable-expire 60000 \ -j ACCEPT
上記のコマンドの意味を下記に示します。
オプション | 説明 |
---|---|
-m hashlimit | hashlimit モジュールを使用する。 |
--hashlimit-name t_sshd | ハッシュテーブル名を t_sshd とする。 |
--hashlimit 1/m | 1分間 |
--hashlimit-burst 1 | 最大1回 |
--hashlimit-mode srcip | 送信元 IPアドレスごとにリクエスト数を管理する。 |
--hashlimit-htable-expire | ハッシュテーブルのエントリの有効期間は、60000 ms (10分) とする。 |
ハッシュテーブルの確認方法
ハッシュテーブルごとに /proc/net/ipt_hashlimit に--hashlimit-name で指定した名前でファイルが作成されます。 中身には、クライアントごとの現在のカウントに関する情報が記録されます。
sudo cat /proc/net/ipt_hashlimit/t_sshd 59 192.168.0.128:0->0.0.0.0:0 584320 1920000 1920000
INPUT のデフォルトルール が ACCEPT の場合は、 DROP の設定が必要です。 ページの関係で、改行が入っています。
-A INPUT -p tcp -m state --state NEW --syn --dport ssh -m hashlimit --hashlimit 1/m \ --hashlimit-name t_sshd --hashlimit-burst 1 --hashlimit-mode srcip --hashlimit-htable-expire 60000 -j ACCEPT -A INPUT -p tcp --syn -m state --state NEW --dport ssh -j DROP