nftablesアクティビティを正しく記録して表示する方法は?

nftablesアクティビティを正しく記録して表示する方法は?

Debian 10 Buster では、Docker コンテナが Docker ホストまたは Docker ブリッジインターフェイスに対して ping を実行できないが、インターネットにアクセスできる問題に直面しました。
アクセスを許可しても(ここに関連する質問に表示されます)、私の状況は解決されません。 iptables/nftablesに関連しているようです。最初にエラーを記録する方法がわかったら、何をすべきかを知ることができます。

DOCKER-USER両方にログルールを入力しましたが、両方とも書き込まれINPUTnft insert rule ip filter DOCKER-USER counter logパケットはゼロとして表示されます。

/var/log/kern.logファイアウォール関連情報を表示しませんjournalctl -k

このシステムを使用してファイアウォールのアクティビティを表示する新しい方法はどうですかnftables

nft list ip table filter

table ip filter {
    chain INPUT {
        type filter hook input priority 0; policy drop;
        ct state invalid counter packets 80 bytes 3200 drop
        iifname "vif*" meta l4proto udp udp dport 68 counter packets 0 bytes 0 drop
        ct state related,established counter packets 9479197 bytes 17035404271 accept
        iifname "vif*" meta l4proto icmp counter packets 0 bytes 0 accept
        iifname "lo" counter packets 9167 bytes 477120 accept
        iifname "vif*" counter packets 0 bytes 0 reject with icmp type host-prohibited
        counter packets 28575 bytes 1717278 drop
        counter packets 0 bytes 0 log
        counter packets 0 bytes 0 log
        iifname "docker0" counter packets 0 bytes 0 accept
    }

    chain FORWARD {
        type filter hook forward priority 0; policy drop;
        counter packets 880249 bytes 851779418 jump DOCKER-ISOLATION-STAGE-1
        oifname "br-cc7b89b40bee" ct state related,established counter packets 7586 bytes 14719677 accept
        oifname "br-cc7b89b40bee" counter packets 0 bytes 0 jump DOCKER
        iifname "br-cc7b89b40bee" oifname != "br-cc7b89b40bee" counter packets 5312 bytes 2458488 accept
        iifname "br-cc7b89b40bee" oifname "br-cc7b89b40bee" counter packets 0 bytes 0 accept
        oifname "br-d41d1510d330" ct state related,established counter packets 8330 bytes 7303256 accept
        oifname "br-d41d1510d330" counter packets 0 bytes 0 jump DOCKER
        iifname "br-d41d1510d330" oifname != "br-d41d1510d330" counter packets 7750 bytes 7569465 accept
        iifname "br-d41d1510d330" oifname "br-d41d1510d330" counter packets 0 bytes 0 accept
        oifname "br-79fccb9a0478" ct state related,established counter packets 11828 bytes 474832 accept
        oifname "br-79fccb9a0478" counter packets 11796 bytes 707760 jump DOCKER
        iifname "br-79fccb9a0478" oifname != "br-79fccb9a0478" counter packets 7 bytes 526 accept
        iifname "br-79fccb9a0478" oifname "br-79fccb9a0478" counter packets 11796 bytes 707760 accept
        counter packets 1756295 bytes 1727495359 jump DOCKER-USER
        oifname "docker0" ct state related,established counter packets 1010328 bytes 1597833795 accept
        oifname "docker0" counter packets 0 bytes 0 jump DOCKER
        iifname "docker0" oifname != "docker0" counter packets 284235 bytes 16037499 accept
        iifname "docker0" oifname "docker0" counter packets 0 bytes 0 accept
        ct state invalid counter packets 0 bytes 0 drop
        ct state related,established counter packets 0 bytes 0 accept
        counter packets 0 bytes 0 jump QBS-FORWARD
        iifname "vif*" oifname "vif*" counter packets 0 bytes 0 drop
        iifname "vif*" counter packets 0 bytes 0 accept
        counter packets 0 bytes 0 drop
    }

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

    chain QBS-FORWARD {
    }

    chain DOCKER {
    }

    chain DOCKER-ISOLATION-STAGE-1 {
        iifname "br-cc7b89b40bee" oifname != "br-cc7b89b40bee" counter packets 5312 bytes 2458488 jump DOCKER-ISOLATION-STAGE-2
        iifname "br-d41d1510d330" oifname != "br-d41d1510d330" counter packets 7750 bytes 7569465 jump DOCKER-ISOLATION-STAGE-2
        iifname "br-79fccb9a0478" oifname != "br-79fccb9a0478" counter packets 7 bytes 526 jump DOCKER-ISOLATION-STAGE-2
        iifname "docker0" oifname != "docker0" counter packets 590138 bytes 34612496 jump DOCKER-ISOLATION-STAGE-2
        counter packets 1808904 bytes 1760729363 return
    }

    chain DOCKER-ISOLATION-STAGE-2 {
        oifname "br-cc7b89b40bee" counter packets 0 bytes 0 drop
        oifname "br-d41d1510d330" counter packets 0 bytes 0 drop
        oifname "br-79fccb9a0478" counter packets 0 bytes 0 drop
        oifname "docker0" counter packets 0 bytes 0 drop
        counter packets 644929 bytes 74784737 return
    }

    chain DOCKER-USER {
        counter packets 0 bytes 0 log
        iifname "docker0" counter packets 305903 bytes 18574997 accept
        counter packets 1450392 bytes 1708920362 return
    }
}

ベストアンサー1

あなたはそれを使用することができますnftraceパケットフローを追跡します。非常に冗長ですが、カーネルログには入らず、マルチキャストネットリンクソケットを介して配布されます(つまり、何も受信しない場合、トレースは "/ dev / null"にのみ入ります)。

本当にすべてを追跡したい場合は、追跡してください。事前ルーティングそして出力優先順位が低いです。nft list ip table filter実際に表示される内容は別の表を使用することをお勧めします。nftablesのiptables操作しないでくださいxtマッチングレイヤAPIとの互換性(ただし、トレースで使用するのは安全です)また、iptablesには次のような他のテーブルがあるかもしれないことに注意する必要があります。ナットテーブル。

traceall.nftしたがって、ロードされたファイルのルールセットを使用すると、次のようになりますnft -f traceall.nft

table ip traceall
delete table ip traceall

table ip traceall {
    chain prerouting {
        type filter hook prerouting priority -350; policy accept;
        meta nftrace set 1
    }

    chain output {
        type filter hook output priority -350; policy accept;
        meta nftrace set 1
    }
}

これで、次のコマンドを使用して非常に詳細なIPv4トレースを追跡できます。

nft monitor trace

コンテナ内で実行していても同じことを行います(通常はログターゲットではありません)。

これらのトレースを他の場所で有効または有効にする前に、優先順位の低いルールに条件を入れることで、すべてのフック/チェーン追跡を防ぐことができます。この図は、イベントの順序を理解するのに役立ちます。一般ネットワークのNetfilterとパケットフロー

同等のものを使用することを選択した場合-j TRACE目標はiptables、その方にもご相談くださいxtables-monitor、なぜならnftablesのiptables行動を変える(比較iptables - 旧バージョン)。


OPの質問に答えながら、質問とログの問題に関するいくつかのおおよその推測は次のとおりです。

  • Docker自体がコンテナで実行されている場合、ログを使用できない可能性があります。ホストに提供することができ、そしてすべてのコンテナsysctl -w net.netfilter.nf_log_all_netns=1カーネルメッセージには名前空間インスタンスがないため、カーネルメッセージのクエリが許可されます。

  • カウンターは丸太ルールIPフィルタ入力は0ですが、前のルールのカウンタは減らす文はそうではありません。これは、ロギングルールが遅すぎて作成されたことを意味します。減らす。これ丸太ルール(またはむしろiptables-j LOGを挿入する必要があります今後決勝減らす絶対にアクセスできない場所に追加されない文です。

  • Dockerに関連する唯一の入力規則はiifname "docker0" counter packets 0 bytes 0 accept。コンテナがプライマリDockerネットワークにない場合、ホストに到達することを許可するルールはありません。

    これをテストするには、ルールを追加してみてください。結果が以前に挿入されたことを確認します。減らすルール。使用iptables、ルール追加の防止nftables互換性がない可能性があります。nftablesのiptables:

    iptables -I INPUT 8 -i "br-*" -j ACCEPT
    

おすすめ記事