着信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フラグがあるのでしょうか。
残念ながら、nftablesでは目的を達成できません。
Dnatターゲットの後、宛先アドレスはループバックアドレス(::1
)次に、着信パケットはルーティングコードによって処理されます。ただし、ループバック宛先アドレスを持つ着信パケットが外部から受信された場合は、 RFC 4291 2.5. によってドロップする必要があります。 この動作を変更するためのsysctl
変数はありません。
外部アドレスで接続を受け入れ、ループバックアドレスをリッスンするアプリケーションに接続するプロキシアプリを実行できます。