nftables ターゲット nat はポートへのローカルアクセスをブロックします。

nftables ターゲット nat はポートへのローカルアクセスをブロックします。

私のサーバーにnftablesが設定されていて、いくつかの保護されたポート(たとえば80)に入ってくるすべてのトラフィックをルート権限なしで使用できるより高いポート(たとえば13080)にリダイレクトしたいと思います。リモートで80個しかアクセスできませんが、ローカルでは両方のポートにアクセスできるようにしたいです。私が思いついた設定は次のとおりです。

#!/usr/bin/nft -f

flush ruleset

table inet firewall {

    chain inbound {
        type filter hook input priority filter; policy drop;

        ct status dnat counter accept # accept everything that came through destination nat (port 80)

        iifname lo counter accept
        oifname lo counter accept

        ct state { established, related } counter accept
        ct state invalid counter drop

        tcp dport 22 ct state new counter accept

        counter reject with icmpx type port-unreachable # reject everything else
    }

    chain destination-nat {
        type nat hook prerouting priority dstnat; policy accept
        tcp dport 80 counter redirect to 13080 # redirect 80 to 13080
    }

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

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

ただし、何らかの理由でポート80へのローカルアクセスがブロックされます(13080はまだアクセス可能ですが)。誰かが私が間違っていることを教えてもらえますか?

答え1

ここに例があります。一般ネットワークのNetfilterとパケットフロー有効期間はnftables:

一般ネットワークのNetfilterとパケットフロー

重要な詳細は内部に記録されています。*「新しい」接続についてのみ「nat」表を参照してください。

ローカルで開始された接続の場合、新しい接続の最初のパケットは出力中に新しいconntrackステータスを生成します(出力のconntrackボックス)。この接続がループバックされたとき(ほとんどすべての場合に以下を介して)ルオインターフェース)同じパケットが事前ルーティング(別のconntrackボックス)を介して戻ると、conntrackステータスが一致します。つまり、ローカルループバック接続には2つのconntrack状態がありません。

他の場合は、新しい接続の最初のパケットが事前ルーティング(事前ルーティングされたconntrackボックス)を介して到着し、新しいconntrackステータスが作成されます。

したがって、接続の最初のループバックパケットが送信されると、新しいconntrackエントリが生成されます。出力中このパケットが事前ルーティングを介して戻ると、既存の conntrack エントリと一致します。もう新しいアイテムではありません。 NATフック(nat / preroutingチェーンを意味destination-nat)は通過しないため、この接続には影響しません。出力段階で機会が欠落しています。

代わりにDNAこの状況を解決するために、新しいconntrackステータスの説明がnat / outputに表示されます。デフォルトでは、ローカルで開始されたすべての接続(インターネットなど)に影響を与えるため、ローカル接続にのみ使用するように注意する必要があります。ルオ相互作用。このチェーンとルールがこれを行います。

nft add chain inet firewall loopback-nat '{ type nat hook output priority -100; policy accept; }'
nft add rule inet firewall loopback-nat oif lo tcp dport 80 counter redirect to :13080

他の場所で実行すると、その動作を追跡できます。conntrackイベントモードのコマンド:

conntrack -E -p tcp --dport 80

そして、外部から開始された接続とローカルで開始されたループバック接続(この追加のチェーンの有無)の違いを確認してください。覚えておいてください、ナットフックはステータスとともに表示された項目だけを見ることができます[NEW](それに応じてコマンドによって表示される項目が変更されました)。

関連情報