web-dev-qa-db-ja.com

nftables ip6 route to localhost / ipv6 nat to loopback

着信httpインターネットトラフィックを[:: 1]:8080にルーティングしようとしています。これは、httpサーバーがバインドする場所です。 IPv6専用デバイスでnftablesを使用しています。次のルールを追加した場合:

  Sudo nft flush ruleset
  Sudo nft add table ip6 nat
  Sudo nft add chain ip6 nat prerouting { type nat hook prerouting priority 0 \; }
  Sudo nft add chain ip6 nat postrouting { type nat hook postrouting priority 100 \; }

  Sudo nft add rule ip6 nat prerouting ip6 daddr [global-ip6] tcp dport 80 dnat to ::1 :8080

  Sudo nft list ruleset

結果のルールセット:

table ip6 nat {
  chain prerouting {
    type nat hook prerouting priority 0; policy accept;
    ip6 daddr [global-ip6] tcp dport http dnat to [::1]:http-alt
  }

  chain postrouting {
    type nat hook postrouting priority 100; policy accept;
  }
}

次に、[global-ip6]:80への要求は飲み込まれますが(接続拒否エラーはありません)、接続は確立されません。

ルールの1つを使用する場合

Sudo nft add rule ip6 nat prerouting tcp dport 80 redirect to 8080

または

Sudo nft add rule ip6 nat prerouting ip6 daddr [global-ip6] tcp dport 80 dnat to [global-ip6] :8080

プログラムを[global-ip6]:8080にバインドすると、通信は期待どおりに機能します。

私が何が欠けているのか分かりますか? postroutingチェーンとinputチェーンでいくつかのルールを試しましたが、機能しませんでした。 IPv4とiptablesに戻ると、Sudo sysctl -w net.ipv4.conf.all.route_localnet=1を実行する必要がありましたが、同様のIPv6フラグがあるのでしょうか。

2
adabru

残念ながら、nftablesでは目的を達成できません。

Dnatターゲットの後、宛先アドレスはループバックアドレス(::1)次に、着信パケットはルーティングコードによって処理されます。ただし、ループバック宛先アドレスを持つ着信パケットが外部から受信された場合は、 RFC 4291 2.5. によってドロップする必要があります。 この動作を変更するためのsysctl変数はありません。

外部アドレスで接続を受け入れ、ループバックアドレスをリッスンするアプリケーションに接続するプロキシアプリを実行できます。

1
Anton Danilov