私のすべてのサーバーは非標準ポート(987)でSSHを実行しており、ポート22に接続しようとするすべてのIPを永続的にブロックしたいと思います。
これでルールiptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -j DROP
しかし、このルールはIPtablesにIPをブロックとして追加しません。現在の接続のみがドロップされます。
Iptablesは、ポート22で最初の接続を試みた後、グローバルにブロックされた(他のポートでの接続を無効にする)としてIPを追加できますか?
完全なルールは次のとおりです。
iptables -N SSH
iptables -A SSH -p tcp -m tcp --dport 22 -m state --state NEW -j DROP
iptables -A SSH -p tcp -m tcp --dport 987 -m state --state NEW -m recent --rcheck --set --rsource
iptables -A SSH -p tcp -m tcp --dport 987 -m state --state NEW -m recent --rcheck --update --seconds 300 --hitcount 4 --rsource -j DROP
ありがとう!
(私はiptables v1.8.4(レガシー)を使用しています)
更新1:@ A.Bに感謝
86400秒のIPブロック(1日)でipsetによって管理されるポート22の接続。
300秒で接続4が試行(失敗または成功)した後、300秒ブロックしてiptablesによって管理されるポート987上の接続。
ipset create ssh22 hash:ip timeout 86400
iptables -N SSH22
iptables -A SSH22 -p tcp -m tcp --dport 22 -m state --state NEW -j SET --add-set ssh22 src
iptables -A SSH22 -m set --match-set ssh22 src -j DROP
iptables -N SSH
iptables -A SSH -p tcp -m tcp --dport 987 -m state --state NEW -m recent --name ssh --set --rsource
iptables -A SSH -m recent --name ssh --update --seconds 300 --reap --hitcount 4 --rsource -j DROP
PDATE 2:最終iptables
作業バージョン:
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -s XXX.XXX.XXX.XXX/32 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 987 -m state --state NEW -m recent --set --name ssh --rsource
-A INPUT -m recent --update --seconds 300 --reap --hitcount 4 --name ssh --rsource -j DROP
-A INPUT -p tcp -m tcp --dport 22 -j SET --add-set ssh22 src
-A INPUT -m set --match-set ssh22 src -j LOG --log-prefix "[SSH 22] " --log-level 4
-A INPUT -m set --match-set ssh22 src -j DROP
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 987 -j ACCEPT
-A INPUT -i lo -p all -j ACCEPT
COMMIT
recentは異常な一致です:フィルターするだけでなく、変更も行います(通常、一致ではなくターゲットで行われます):変更リストのエントリ。これは、他の場所で行ったように2回使用する必要があります。1回はリストを設定するため、もう1回はリストをチェックするためです。 2回目は何もチェックしないでください。そのため、ポート22だけでなく、IPから何かへのすべての接続が一致し、ドロップされます。
ユーザーチェーンSSHは[〜#〜] input [〜#〜](または[〜 #〜] forward [〜#〜])-m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
などの一般的なステートフルルールが使用される前。
だからあなたのチェーンの始まりを交換してください:
iptables -N SSH
iptables -A SSH -p tcp -m tcp --dport 22 -m state --state NEW -m recent --name banip --rsource --set -j DROP # -j DROP could be left: the next rule would do it.
iptables -A SSH -m recent --name banip --rsource --update -j DROP
次に、ポート987に追加のルールを追加できます。ルールにはリスト名が記載されていないため、DEFAULT
が使用され、banip
に干渉しません。
これらのIPアドレスを一定時間(たとえば12345秒)後に期限切れにしたい場合は、たとえば--seconds 12345 --reap
パラメータの後に--update
を documented として追加します。
デフォルトでは、recentのリストは100エントリを受け入れることができるため、recent禁止リストとして、xt_recentカーネルモジュールをロードする必要がありますiptablesルールをロードする前に、ip_list_tot=65535
などのオプションを使用します。これは、100エントリしか持てないリストは、禁止リストを実装するのに十分な大きさではないためです。このパラメーターは、すべてのリストサイズに対してグローバルです。
通常はより柔軟性があるため、以下で説明するように、代わりにipsetの使用も検討する必要があります。
ある程度の複雑さに達したら、コンパニオンipsetフレームワークを使用することをお勧めします。 ipsetは、さまざまなネットワーク関連タイプ(IPアドレス、(TCPおよび/またはUDP)ポート...)の任意の大きなハッシュリストを処理できます。
iptablesの set
一致と SET
ターゲット+ ipset
。 ipsetはメモリとして機能します。
付属ツールipset
を使用してセットを作成します。
ipset create banip hash:ip
これにより、デフォルトで65536エントリのハッシュセットが作成されます。これは、100または255よりもはるかに優れています。必要に応じてより大きなセットを作成する方法については、マニュアルを参照してください(一度決定されたセットのサイズは、パケットパスから増やすことはできません。さらにipset
コマンドを使用した場合のみ)。適切なipset
コマンドを使用して、このセットの内容を事前に入力、保存、復元、一覧表示などできます。
上記のルールは次のように置き換えることができます。
iptables -N SSH
iptables -A SSH -p tcp -m tcp --dport 22 -m state --state NEW -j SET --add-set banip src
iptables -A SSH -m set --match-set banip src -j DROP
エントリを期限切れにしたい場合は、タイムアウトパラメータを使用してセットを作成するのが最も簡単です。
fail2ban の方法の1つは、ipsetを使用することです(ただし、トリガーはパケットパスではなくログファイルからのものです)。
nftables (およびその組み込み sets )を使用するなど、他にも可能な方法があります。 iptables+ipsetの代わりに。テストしてみてください。
IPtablesは、そのような動的分析を単独で管理することはできません。あなたの説明から、あなたが必要とするものは実際にはあなたのためにこれらの種類のルールを管理するツールです。全体的にお勧めできますfail2ban
とdenyhosts
はその特定のケースですが、他にもある場合があります。
私は同じようなユースケースで両方をうまく試しました。異なるポートとプロトコル、ルールの有効期限、最大再試行回数、およびその他の多くのオプションに対して、異なるルールを設定できます。
公式リンク:
@JAの回答に同意します。
しかし、私は私のオープンソースXDPファイアウォールプロジェクトを共有したいと思いました here これはこれを達成できるはずです。このツールはXDPを利用しており、NICがXDPネイティブをサポートしている場合、IPTablesよりもはるかに速くトラフィックをブロックできるはずです。それ以外の場合は、する必要があります XDP-generic/SKBモードを使用している場合、IPTablesと同じ速度(ほとんどのNIC /最新のカーネルがこれをサポートするはずです)。
このプログラムを使用する唯一の短所は次のとおりです。
設定ファイルを使用してフィルタリングルールを指定します。現在、フィルタリングルールを追加/削除するコマンドはありません。
プログラムを再起動すると、IPブラックリストが消去されます。
再起動をサポートするIPを永続的にブロックする機能とともに、フィルタールールを追加してそれらを将来自動的に保存するコマンドを実装したいと思っています。
あなたのケースでは、次の設定で十分です:
_interface = "changeme";
updatetime = 15;
filters = (
{
enabled = true,
action = 0,
tcpopts = (
{
enabled = true,
dport = 22,
blocktime = 9999999999
}
)
}
);
_
これは、宛先ポート22をターゲットとするパケットをTCP for _9999999999
_秒の間ブロックします(blocktime
構成オプションが_uint64_t
_タイプ)。
これがあなたの場合に役立つことを願っています!