web-dev-qa-db-ja.com

ポート転送&NAT nftables

私のOpenWRTゲートウェイ(自作の19.07、カーネル4.14.156)は、プライベートネットワークの前にあるパブリックIPアドレスにあります。私はnftables(not iptables)を使用しています。

パブリックアドレスで非標準ポートを公開し、ゲートウェイの背後にあるマシンの標準ポートに転送したいと考えています。以前はポートフォワーディングと呼ばれていたと思います。ゲートウェイマシンがhttpサービスなどを提供していたように見えますが、実際にはプライベートアドレスのゲートウェイの背後にあるマシンでした。

これが私のnftables設定です。これらの目的のために、私の「標準サービス」はポート1234にあり、公衆がゲートウェイ:4321でアクセスできるようにしたいと考えています。

#!/usr/sbin/nft -ef
# 
# nftables configuration for my gateway
#

flush ruleset

table raw {
        chain prerouting {
                type filter hook prerouting priority -300;
                tcp dport 4321 tcp dport set 1234 log prefix "raw " notrack;
        }
}

table ip filter {
        chain output {
                type filter hook output priority 100; policy accept;
                tcp dport { 1234, 4321 } log prefix "output ";
        }

        chain input {
                type filter hook input priority 0; policy accept;
                tcp dport { 1234, 4321 } log prefix "input " accept;
        }

        chain forward {
                type filter hook forward priority 0; policy accept;
                tcp dport { 1234, 4321 } log prefix "forward " accept;
        }
}

table ip nat {
        chain prerouting {
                type nat hook prerouting priority 0; policy accept;
                tcp dport { 1234, 4321 } log prefix "nat-pre " dnat 172.23.32.200;
        }

        chain postrouting {
                type nat hook postrouting priority 100; policy accept;
                tcp dport { 1234, 4321 } log prefix "nat-post ";
                oifname "eth0" masquerade;
        }
}

この設定を使用すると、外部マシンはgateway:1234でプライベートマシンにアクセスできます。ロギングは、外部からゲートウェイIPへのnat-pre SYNパケット、外部から内部IPへのforward、外部から内部IPへのnat-postを示し、「既存の接続」が残りの処理を行いますパケットの。

gateway:4321に接続する外部マシンはrawとしてログに記録され、4321は1234に変更されます。次に、SYNパケットが内部サーバーに転送され、応答SYNパケットが戻ってきて、何もありません。

問題は、リモートマシンが期待しているinternal:1234gateway:4321に戻すnftables構成を実行していないことだと思います。 masqueradeinternal:1234gateway:1234に変更しても、リモートマシンはそれを予期しておらず、おそらくダンプします。

この構成のアイデアはありますか?

2
Dave M.

ポート番号を変換していません。外部接続がポート1234である場合、これは問題ではありません。ただし、それが4321の場合、dnatはポート1234ではなく、内部サーバーのポート4321を通過します。

tcp dport { 1234, 4321 } log prefix "nat-pre " dnat 172.23.32.200:1234;

内部サーバーから戻ってくる返信パケットを変換する必要はありません。これは、最初のsynパケットで作成される接続追跡テーブルのエントリを使用して自動的に行われます。

3
Steve Brandli