iptables アクセス回数を制限する
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
上記のコマンドの意味を下記に示します。
オプション | 説明 |
---|---|
-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
関連項目
- iptables
- iptables のインストール
- iptables のテーブル
- iptables のサービスのコントロール
- iptables のコマンドラインオプション
- iptables のルールを確認する
- iptables の設定ファイル
- iptables の設定の変更
- iptables のターゲット
- iptables ログを出力する
- iptables アクセス回数を制限する
- iptables 接続状態
- iptables ステートフルパケットインスペクション
- iptables が動かない場合
- iptables ICMPのタイプ
- iptables icmp echo requestを許可する
- iptables DNSを許可する
- iptables HTTPとHTTPSを許可する
- iptables sshを許可する
- iptables の設定例
- ufw (Uncomplicated FireWall)、iptablesのフロントエンド
- ファイアーウォール
- DoS攻撃
ツイート