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