nftablesを使用してRaspberry PiでMinecraftサーバーへのポート転送を設定する方法は?

nftablesを使用してRaspberry PiでMinecraftサーバーへのポート転送を設定する方法は?

私は透明なプロキシサービスを使用しているので、Raspberry Piをホームルーターとして使用します。オペレーティングシステムはRaspbianです。現在、Minecraftサーバーを設定し192.168.2.28、NATを使用してWANに公開しています。これは私のものです/etc/nftables.conf

#!/sbin/nft -f

flush ruleset

table ip filter {
    chain output {
        type filter hook output priority 0; policy accept;
        tcp sport 25565 drop
    }
}

table ip nat {
    chain prerouting {
        type nat hook prerouting priority 0; policy accept;
        tcp dport 25565 dnat 192.168.2.28
    }

    chain postrouting {
        type nat hook postrouting priority 0; policy accept;
        tcp sport 25565 ip saddr 192.168.2.28 masquerade
    }
}

しかし、次のような問題があります。オン192.168.2.28、私は nc -l -p 25565 オン192.168.2.27、私は走る echo "Hello, world!" | nc wan_ip 25565

欲しい動作は「Hello、world!」メッセージを受け取ることです192.168.2.28

ただし、最初のSYNパケットがルータを通過するとき、Saddrは同じままで、baddrのみNATします192.168.2.27

192.168.2.28パケットが受信されると応答します192.168.2.27。同じ L2 ネットワークにあるため、パケットはルータを通過せず、NAT を通過しません。

その後192.168.2.27からパケットを受信しますが、192.168.2.28応答かどうかは不明ですwan_ip

この問題を解決し、LANホストを含​​むどこでもポートフォワーディングが機能するようにするにはどうすればよいですか?

答え1

注意してください。nftables(良いiptables)は、NATされるフローの最初のパケットのみを表示します。 NAT が適用されると、同じフロー内の他のすべてのパケットが直接送信されます。Webフィルタ/つながる見なかったnftablesもう必要ありません。したがって、追加のサポートなしで自動的にNAT以外のトラフィックを返します。

唯一重要なのは、最初のパケット(TCPの場合はSYNパケット)で発生することです。応答パケットを含むこのフローの追加トラフィックは自動的に処理され、NATフックをバイパスします。

これは、192.168.2.28で発生したトラフィックを処理するための特別なルーティング後のルールがないことを意味します。一般的な変装規則は1つだけでなければなりません。みんな192.168.2.0/24 インターネットで通信するとき。とにかく、このルール自体は問題ではありません。発信トラフィックが応答トラフィックである場合、思ったほど頻繁に使用されません。既存のトラフィックの一部であるため、上記のようにこれらのパケットは通過しません。nftablesこれ以上ではありません。

権利を持つことが重要ですNATヘアピンサポート済み:クライアントとサーバーが同じLAN上にある状況で、注意しないと非対称トラフィックが発生する可能性があります。

ここで:

  • ルータがTCP宛先ポート25565に向かうすべてのエントリ(どこでも)を検出すると、宛先アドレスを192.168.2.28にリダイレクトします。

    リダイレクトは外部と内部を区別しないため、LAN全体の適切な共通マスカレーディングルールに関連付けられている場合は、ルール自体で十分です。しかし、OPはそのようなルールを使用しませんでした。

  • ルーティング後の一般的な迷彩の代わりに、

    OPの使用は、前のルールtcp sport 25565 ip saddr 192.168.2.28のフィルタリング部分とは何の関係もありません。最初パッケージtcp dport 25565(また、新しいパッケージを受け取りました。目的地192.168.2.28):NATヘアピンは実装されていません。

完了する必要があります代わりに、次のいずれかを実行してください。

  1. LAN全体に一般的なマスカレーディングを使用します(NATヘアピンのユースケースに適応し、追加情報が不足しています)。

        chain postrouting {
            type nat hook postrouting priority 0; policy accept;
            ip saddr 192.168.2.0/24 ip daddr != 192.168.2.0/24 masquerade
        }
    
  2. サーバーが宛先の場合にのみ、宛先ポートが25565のパケットにマスカレーディングを使用します。

        chain postrouting {
            type nat hook postrouting priority 0; policy accept;
            tcp dport 25565 ip daddr 192.168.2.28 masquerade
        }
    

    つまり、サーバーへのトラフィック(適切なNATヘアピン用のLANからLANへのトラフィックを含む)のみが偽装されます(LANシステムはインターネットにアクセスできません)。

  3. 2代わりに、DNATを最初に取得するトラフィックにのみマスカレーディングを適用するように選択します。

        chain postrouting {
            type nat hook postrouting priority 0; policy accept;
            ct status dnat masquerade
        }
    

    2.と同じ効果ですが、より多様です。

  4. 必要に応じて変装のために1と3のみを組み合わせてください。

    箇条書き2.または3.はインターネットソースアドレスを隠す副作用があるため、LANにのみ適用するのが最善です。

        chain postrouting {
            type nat hook postrouting priority 0; policy accept;
            ip saddr 192.168.2.0/24 ip daddr != 192.168.2.0/24 ct status dnat masquerade
        }
    

したがって、1.または4.(インターネットへのLANアクセスを制限する)を使用してください。他に可能なオプションがあります。

注: 1. 極端な場合があります。クライアントがルーターの内部IPアドレスを宛先として使用している場合、この場合の追加の規則なしでは機能しませんが、クライアントがそうするかどうかは疑わしく不十分です。 OPのルール情報:ルーターの内部IPアドレス。

関連情報