nftablesを使用して動的ブラックリストを作成する

nftablesを使用して動的ブラックリストを作成する

nftablesを使って動的ブラックリストを作成したいと思います。組み込みデバイスのバージョン0.8.3では、nftリストルールセットを使用して次のルールセットを作成しました。

table inet filter {
set blackhole {
    type ipv4_addr
    size 65536
    flags timeout
}

chain input {
    type filter hook input priority 0; policy drop;
    ct state invalid drop
    ct state established,related accept
    iif "lo" accept
    ip6 nexthdr 58 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, echo-request, echo-reply, mld-listener-query, mld-listener-report, mld-listener-done, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, ind-neighbor-solicit, ind-neighbor-advert, mld2-listener-report } accept
    ip protocol icmp icmp type { echo-reply, destination-unreachable, echo-request, router-advertisement, router-solicitation, time-exceeded, parameter-problem } accept
    ip saddr @blackhole counter packets 0 bytes 0 drop
    tcp flags syn tcp dport ssh meter flood { ip saddr timeout 1m limit rate over 10/second burst 5 packets}  set add ip saddr timeout 1m @blackhole drop
    tcp dport ssh accept
}

chain forward {
    type filter hook forward priority 0; policy drop;
}

chain output {
    type filter hook output priority 0; policy accept;
}
}

私にとってこれは単なる一時的な解決策です。公式の例を使いたいマンページ動的ブラックリストに使用されます。マンページの公式例では、私のnftablesファイルは次のようになります。

table inet filter {
set blackhole{
        type ipv4_addr
        flags timeout
        size 65536
}
chain input {
        type filter hook input priority 0; policy drop;

        # drop invalid connections
        ct state invalid drop

        # accept traffic originating from us
        ct state established,related accept

        # accept any localhost traffic
        iif lo accept

        # accept ICMP
        ip6 nexthdr 58 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem, echo-request, echo-reply, mld-listener-query, mld-listener-report, mld-listener-done, nd-router-solicit, nd-router-advert, nd-neighbor-solicit, nd-neighbor-advert, ind-neighbor-solicit, ind-neighbor-advert, mld2-listener-report } accept
        ip protocol icmp icmp type { destination-unreachable, router-solicitation, router-advertisement, time-exceeded, parameter-problem, echo-request, echo-reply } accept

        # accept SSH (port 22)
        ip saddr @blackhole counter drop
        tcp flags syn tcp dport ssh meter flood { ip saddr timeout 10s limit rate over 10/second} add @blackhole { ip saddr timeout 1m } drop
        tcp dport 22 accept

}


chain forward {
        type filter hook forward priority 0; policy drop;
}

chain output {
        type filter hook output priority 0; policy accept;
}

}

ただし、nft -f myfileを使用してバージョン0.8.3でこのnftablesファイルをロードすると、次のエラーが発生します。

Error: syntax error, unexpected add, expecting newline or semicolon
    tcp flags syn tcp dport ssh meter flood { ip saddr timeout 10s limit rate over 10/second} add @blackhole { ip saddr timeout 1m } drop

なぜこのようなことが起こるのかわからないが、ウィキペディアバージョン0.8.1とカーネル4.3以降で動作します。

私のバージョンは0.8.3で、カーネルは4.19.94です。

私はDebian Busterのバージョン0.9.0の公式マニュアルページでルールセットをテストしました。マニュアルページのルールセットは Debian でうまく動作しますが、IP は一度だけブロックされます。

この例では、私のデバイスに対する無差別代入攻撃が発生した場合にSSHポートのIPアドレスをブロックするファイアウォールルールを作成したいと思います。しかし、たとえば5分間IPをブロックしたいと思います。その後、攻撃者のIPからデバイスに再接続できる必要があります。彼が再び無差別攻撃を加えると、そのIPは5分間再びブロックされなければなりません。 nftablesが利用可能な場合は、組み込みデバイスにsshguardやfall2banなどの他のソフトウェアを使用したくありません。

誰でも私を助けることができることを願っています。ありがとうございます!

ベストアンサー1

これhydraこのツールはSSHサーバーに同時に複数回接続されます。 OPの場合(コメント:) hydra -l <username> -P </path/to/passwordlist.txt> -I -t 6 ssh://<ip-address>6つの同時スレッド接続を使用します。

サーバーの設定によっては、通常は5〜6個のパスワードを試すことができ、SSHサーバーが拒否するのに約10秒かかります。つながる1秒あたりの試行回数を超えることがあります(しかし実際にはそうです)。これは、トリガが1/2秒以内に5回以上の接続試行が完了したことを意味できます。私は正確さについてあまり確信していませんが、10/sここで起こったことを前提としています。

バージョンと構文の問題

バージョン 0.8.1 または 0.8.3 で動作しない構文は、次のバージョンに表示される最新の構文です。今回提出してください:

src:パケットパスのセットとマップを更新するために構文を再確認します。

コレクションの場合は、次のことを許可します。

  nft add rule x y ip protocol tcp update @y { ip saddr}

[...]

約束された後ろにバージョン0.8.3はnftables> = 0.8.4でのみ動作します。

現在のwikiのリビジョンは次のとおりです。パケットパスの更新セット、同じページで前の構文のコマンドが表示され続けます。

 % nft add rule filter input set add ip saddr @myset

[...]

そして新しい構文を使用して結果を表示します。

[...]

                add @myset { ip saddr }

[...]

一部のWikiページまたは最新のマンページは、古いnftablesバージョンでは動作しない場合があります。

とにかくカーネル4.19で実行している場合は、nftables追加機能のためには>= 0.9.0を好む必要があります。たとえば、次のようになります。Debian 10またはDebian 9 バックポート

ステータスがルールを受け入れる前に、ブラックリストの作成を完了する必要があります。

IPがブラックリストに追加されると、確立された接続が中断されずに持続し、SSHサーバー自体から接続が切断されるまで考慮されません。その理由は、以前に一般的に存在していた段落規則があるためです。

        # accept traffic originating from us
        ct state established,related accept

この意見は誤解を招く。そうではありません。私たちのトラフィックを受け入れるしかし、すでに進行中のトラフィック。これが段落の法則です。これは、新しい接続に対してのみすべてのルールを解析してステートフル接続を処理することです。このルール以降のすべてのルールは新しい接続に適用されます。接続が承認されると、接続が終了するまで個々のパケットは承認されたままになります。

特定のブラックリスト処理の状況では、特定のブラックリストルールまたはその一部を段落ルールの前に配置してすぐに適用できるようにする必要があります。 OPの場合、次のようになります。

        ip saddr @blackhole counter drop

ct state established,related acceptルールの前に移動する必要があります。

攻撃者がブラックリストに追加されると、進行中の他の接続はパスワードを推測するための残りの無料試行を取得できず、すぐに中断されます。

ブラックリストがある場合は、ホワイトリストを検討してください

参考までに、安価なiif lo acceptルール自体は、ホワイトリストに登録される前に最適化に移行することができます。ローカルに確立されたすべての接続(永続的な場合でも)は、乱用の場合はブラックリストに登録されます(例:127.0.0.1)。ルールの前にさまざまなホワイトリストルールを追加することを検討してください@blackhole

アプリにすばやく通知するオプション

サーバーの継続的な応答がブラックリスト内のIPに到達するのを防ぐために(特にUDPトラフィックの場合はSSHを含むTCPをあまり使用しない)、チェーンで使用する同等のルールを追加し、拒否を使用して試行された応答より早くローカルに通知することもできますdaddrinet filter outputプロセス。中断する必要があるというシグナル:

    ip daddr @blackhole counter reject

セットの違いaddupdateセットに適用される違い

これらの設定を使用すると、進行中の接続がただちに中断されても、攻撃者は引き続き試して、100万年後に新しい短いウィンドウを取得できるようになりますが、これは最適ではありません。

項目は次のようにする必要があります修正する@blackhole ... dropルールにdと入力します。update項目がすでに存在する場合、タイマーは更新され、add何も実行されません。これは、攻撃者がウィンドウを開かずに放棄するまで、SSHサーバーへの追加(失敗)接続試行をブロックし続けます。 (上記で追加した出力ルールは変更しないでください。これは攻撃者の行動ではありません。)

変える:

ip saddr @blackhole counter drop

AND(まだ古い構文を保持):

ip saddr @blackhole counter set update ip saddr timeout 1m @blackhole drop

ct state invalidルールの前に移動する必要があります。そうしないと、攻撃者が間違ったパケット(忘れた接続の遅いRSTなどの既知の接続の一部ではないTCPパケット)を試みると、セットは更新されません。更新されました。

設定される接続の最大数を制限します。

カーネル> = 4.18とnftables> = 0.9.0が必要なため、現在のOP構成では実行できません。

攻撃者は一度にあまり接続できないことがわかりますが、接続速度が速すぎない限り、制限なく新しい接続を追加できます。

同時接続数の制限(iptablesと同じように利用可能connlimit)他の測定規則を追加することもできます。

tcp flags syn tcp dport 22 meter toomanyestablished { ip saddr ct count over 3 } reject with tcp reset

特定のIPアドレスには3つのSSH接続のみが許可されます。

または@blackholeセットもトリガーするには(今回は更新された構文を使用して):

tcp flags syn tcp dport 22 meter toomanyestablished { ip saddr ct count over 3 } add @blackhole { ip saddr timeout 1m } drop

OPの場合、これは前の測定規則の前にトリガーする必要があります。正当なユーザーに影響を与えないように注意して使用してください(ただし、opensshControlMasterオプション)。

IPv4およびIPv6

ユニバーサルIPv4 + IPv6セットアドレスタイプがないため、IPv4を処理するすべてのルール(2文字の単語がある場合)は、IPv6セットを含み、機能するミラーリングルールにipコピーする必要があります。ip6

おすすめ記事