web-dev-qa-db-ja.com

UFWによるレート制限:制限の設定

UFWのmanページには、iptablesのレート制限を設定できると記載されています。

ufwは接続レート制限をサポートします。これはブルートフォースログイン攻撃からの保護に役立ちます。 ufwは、IPアドレスが過去30秒間に6つ以上の接続を開始しようとした場合、接続を拒否します。詳細は http://www.debian-administration.org/articles/187 を参照してください。一般的な使用法は次のとおりです。

     ufw limit ssh/tcp

残念ながら、これは私が見つけたすべてのドキュメントです。私はUFWに固執し、より複雑なiptablesコマンドを使用しないようにします(物事を「複雑にしない」ために)。

Ufwを使用して、ポート80のすべての着信(発信ではない)トラフィックを30秒あたり20接続に制限するにはどうすればよいですか?ポート30000〜30005のレート制限を無効にするにはどうすればよいですか?レート制限はすべてのポートでデフォルトで有効になっていますか?

22
Tom

UFWは「複雑でない」ように設計されています。つまり、この場合、接続が制限されるレートの詳細を制御することができません。 Python UFWのソースを掘り下げたい場合は、それを微調整する方法を見つけることができます。適切な情報は、(私のUbuntu 10.04システムで)/usr/share/pyshared/ufw/backend_iptables.pyにあります。

したがって、タイミングの問題は別として、最後に速攻の質問に対するいくつかの回答を示します。

  1. 10.10.10.0/24がローカルネットワークであるとすると、デフォルトの制限ルールがポート80/tcp着信に適用されます。

    ufw limit from any to 10.10.10.0/24 port http comment 'limit web'
    
  2. 3.レート制限はデフォルトではオンになっていません。必要な範囲を除くすべての(宛先)ポートに追加するには、このルールを使用します。ルール(範囲を含む)はアトミック単位であり、分割できないことに注意してください。たとえば、ポートにルールを追加してから、特定の範囲にdelete a(存在しない)ルールを追加してポートを削除することはできません。 limitufw defaultへの受け入れ可能な引数ではありません。

    ufw limit from any to any port 0:29999,30006:65535
    
21
bonsaiviking

前の投稿で述べたように、user.rulesをカスタマイズできます。 6秒で最大12接続のSMTP接続レート制限が必要です。まず、以下のようなルールを追加しました。注:これにより、デフォルトで30秒に6を許可する制限ルールが追加されます

ufw limit smtp

以下に示すように、/ lib/ufw/user.rulesを編集しました(このファイルのカスタムコピーを他の多くの微調整とともに保存しています)。

### Tuple ### limit tcp 25 0.0.0.0/0 any 0.0.0.0/0 in
-A ufw-user-input -p tcp --dport 25 -m state --state NEW -m recent --set
-A ufw-user-input -p tcp --dport 25 -m state --state NEW -m recent --update --seconds 6 --hitcount 12 -j ufw-user-limit
-A ufw-user-input -p tcp --dport 25 -j ufw-user-limit-accept
6
Arul Selvan

レート制限は、/lib/ufw/user.rulesにあるUFWルールファイルで変更できます。

デフォルトでは、すべてのポートに対して有効な制限はありません。手動で、またはuser.rulesファイルを編集して、すべてのポートを追加する必要があります。

5
cikuraku

UfwのLIMIT機能を使用した場合の意図しない結果を指摘することは価値があります。

最初のufwルールとして、ポート22/tcpに包括的な制限を設定したとします。

_     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     LIMIT IN    Anywhere                  
...
_

制限の下で動作している接続は、ufwルールと最終的には「deny(incoming)」のデフォルトポリシーに従うことで、引き続きフィルタリングできるとの想定で。

少なくともufw 0.35では、その仮定は間違っているでしょう。実際、LIMIT INロジックは、制限基準で拒否されなかった入力をすぐに受け入れます。

擬似コードでは、LIMITロジックは

_if CONDITION then DENY else ACCEPT_

一方、他のufwルールには論理があるようです:

if CONDITION then (DENY|ACCEPT) else continue to next rule

私は個人的にufw LIMITの予期しない動作であることを発見しました。これは、他のufwルールによってフィルタリングされたために発生するはずのない、システムログファイルでポート22のログイン試行を予期せず見つけたことによってのみ発見されました。

動作確認の詳細

Ufwによって挿入されたiptablesコードの関連する行は次のとおりです。

_-A ufw-user-input -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 30 --hitcount 6 --name DEFAULT --mask 255.255.255.255 --rsource -j ufw-user-limit
-A ufw-user-input -p tcp -m tcp --dport 22 -j ufw-user-limit-accept
-A ufw-user-limit -m limit --limit 3/min -j LOG --log-prefix "[UFW LIMIT BLOCK] "
-A ufw-user-limit -j REJECT --reject-with icmp-port-unreachable
-A ufw-user-limit-accept -j ACCEPT
_

上記のリストは、

_iptables -S | grep ufw-user-limit
_

最初の2行は_ufw-user-input_で連続しています。これは、

_iptables -S | grep ufw-user-input
_
1
Craig Hicks