マンページには、iptables-extensions
ポート139に接続しようとするIPアドレスのすべてのトラフィックをブロックする方法を示す例があります。
iptables -A FORWARD -m recent --name badguy --rcheck --seconds 60 -j DROP
iptables -A FORWARD -p tcp -i eth0 --dport 139 -m recent --name badguy --set -j DROP
誰かがポート22に頻繁に接続しすぎると、一定期間完全に(すべてのトラフィック)ブロックされますが、一部の初期接続は許可されるようにこの設定を変更しようとします。しかし、既存のアクティブな接続をブロックしたくなく、新しい接続のみをブロックしたいと思います。
私はこれを試しました:
iptables -A INPUT -i eno3 -m state --state NEW -m recent --rcheck --seconds 300 --reap --hitcount 3 --name sshthrottle -j DROP
iptables -A INPUT -i eno3 -m state --state NEW -m recent --set --name sshthrottle -p tcp --dport 22
しかし、今起こっていることは着信接続ですどのポートはブロックをトリガーするため、たとえばポート80で3回接続すると、IPは300秒間ブロックされます。このブロックがどのポートに接続されている場合でもアクティブではなく、ポート22に接続されている場合にのみアクティブになることを願っています。
私は何が間違っていましたか?
(注:GoogleにはSSHトラフィックを制限する例がいくつかあることがわかっていますが、すべてラインの--dport
ルールを複製します--rcheck
。つまり、SSHトラフィックのみをブロックしますが、Connectedですべてのポートをブロックしたいのですが、私の問題は使用に関するものではありません。ブロッキング - トラフィックが正常にブロックされましたが、トリガーを使用すると、すべてのポートではなくポート22のみがブロックをトリガーしたいと思います。
答え1
さて、それが何であるかを見てください。コマンドラインのパラメータの順序iptables
によって違いがあることに気づいていませんでした。
私はこれを持っています:
-m state --state NEW -m recent --set --name sshthrottle -p tcp --dport 22
これは次のように言います。
- 状態がNEWの場合
- sshthrottle IPリストにSET(追加)
- 次に、ポート 22 に接続されていることを確認します。
- 何もせずに次の規則に進みます。
もちろん、ポート22であることを確認してください。後ろにリストにIPが追加されました。
順序を次のように変更するだけです。
-m state --state NEW -p tcp --dport 22 -m recent --set --name sshthrottle
もちろん、これは次のように解釈されます。
- 状態がNEWの場合
- TCPポートは22です。
- 次に、sshthrottle IPリストにSET(追加)します。
- 何もせずに次の規則に進みます。
もちろん重要なのは、この--set
パラメータがIPを見つけてリストに追加することです。したがって、このパラメータが期待どおりに機能するには、コマンドラインの最後のパラメータの1つである必要があります。
実際、--set
パラメータはターゲットでなければなりません(例-j SETRECENT
:)。通常、ターゲットのみがアクションを実行するため、exampleはパラメータで-j LOG
はなくターゲットです--log
。