1つのポートに繰り返し接続した場合、すべてのトラフィックをブロックする方法は?

1つのポートに繰り返し接続した場合、すべてのトラフィックをブロックする方法は?

マンページには、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

これは次のように言います。

  1. 状態がNEWの場合
  2. sshthrottle IPリストにSET(追加)
  3. 次に、ポート 22 に接続されていることを確認します。
  4. 何もせずに次の規則に進みます。

もちろん、ポート22であることを確認してください。後ろにリストにIPが追加されました。

順序を次のように変更するだけです。

-m state --state NEW -p tcp --dport 22 -m recent --set --name sshthrottle

もちろん、これは次のように解釈されます。

  1. 状態がNEWの場合
  2. TCPポートは22です。
  3. 次に、sshthrottle IPリストにSET(追加)します。
  4. 何もせずに次の規則に進みます。

もちろん重要なのは、この--setパラメータがIPを見つけてリストに追加することです。したがって、このパラメータが期待どおりに機能するには、コマンドラインの最後のパラメータの1つである必要があります。

実際、--setパラメータはターゲットでなければなりません(例-j SETRECENT:)。通常、ターゲットのみがアクションを実行するため、exampleはパラメータで-j LOGはなくターゲットです--log

関連情報