iptables アクセス回数を制限する

提供: セキュリティ
2015年9月23日 (水) 18:51時点におけるDaemon (トーク | 投稿記録)による版

(差分) ←前の版 | 最新版 (差分) | 次の版→ (差分)
移動: 案内検索
スポンサーリンク

iptables は、単位時間あたりのアクセス回数を制限できます。

概要

iptables でアクセス制限を行うための方法として、 limit モジュール や hashlimit モジュールがあります。 iptables で単純な DoS攻撃 の対策を実施できます。

limit モジュールにおける制限

limit モジュールを使用して、アクセス制限を sshd に対して行うと、総当たり攻撃 を受けている時に、自分自身もログインができなくなるので、やるべきではないでしょう。

NAT / プロキシ されてる環境に複数のユーザーが存在する場合、異なるユーザのアクセスが同一IPアドレスからやってきます。 ISPなどの接続事業者や大きな企業からたくさんのアクセスが想定される場合、iptables でのアクセス制限は、うまく機能しないかもしれません。

--limit rate

--limit で、単位時間あたりの平均マッチ回数の最大値を指定します。

期間は、 /second, /minute, /hour, /day で指定できます。 デフォルトは、 3/hour です。

--limit-burst number

--limit-burst は、パケットがマッチする回数の最大初期値です。 --limit のオプションで指定した制限に達しなければ、この数値になるまで1個ずつ増やされます。 デフォルトは、 5 です。

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

上記のコマンドの意味を下記に示します。

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 で指定した名前でファイルが作成されます。 中身には、クライアントごとの現在のカウントに関する情報が記録されます。

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

関連項目




スポンサーリンク