nftables は、DNAT の「port」を「ip:port」にマップします。

nftables は、DNAT の「port」を「ip:port」にマップします。

portipv4_addr:portマッピングされportipv4_addr:port異なるTCPポート番号を持つnftablesマップを持つことはできますか?たとえば、ポート80からのすべての着信パケットを、ポート8080でWebサーバーを実行しているコンテナに転送しようとします(純粋にnftablesを使用)。これは、次のように2つのマップと2つのマップ検索を使用して達成できます。

table ip dnatTable {
  chain dnatChain {
    type nat hook prerouting priority dstnat; policy accept;
    dnat to tcp dport map { 80 : 172.17.0.3 }:tcp dport map { 80 : 8080 }
  }
}

ところで、地図照会を一度だけできるかどうか疑問に思います。

ありがとう

答え1

いつものようにnftables動く標的だ。この機能は次のように表示されます。nftables0.9.42020-04-01に掲載:

  • 関連付けられたNATマッピングを使用します。これにより、たとえば、NAT の変更に使用するアドレスとポートをマップで指定できます。

    nft add rule ip nat pre dnat ip addr . port to ip saddr map { 1.1.1.1 : 2.2.2.2 . 30 }
    

    名前付きセットでこの新機能を使用することもできます。

    nft add map ip nat destinations { type ipv4_addr . inet_service : ipv4_addr . inet_service \; }
    nft add rule ip nat pre dnat ip addr . port to ip saddr . tcp dport map @destinations
    

したがって、OPの場合は次のようになります。

nft add ip dnatTable dnatChain 'dnat ip addr . port to tcp dport map { 80 : 172.17.0.3 . 8080 }'

参考のみに、nftables1.0.0 2021年8月19日リリース単純化された構文があります。

  • NATマッピングのための単純化された構文。 IP範囲を指定できます。

[...]

または特定のIPとポート。

... dnat to ip saddr map { 10.141.11.4 : 192.168.2.3 . 80 }

したがって、OPの状況は次のように短縮できます(前の規則は次のように表示されます)。

nft add ip dnatTable dnatChain 'dnat to tcp dport map { 80 : 172.17.0.3 . 8080 }'

名前付きマップを使用すると、データからルールを分離するのに役立ちます。これも機能します(0.9.4構文を使用)。

nft add map ip dnatTable portToIpPort '{ type inet_service : ipv4_addr . inet_service ; }'
nft add rule ip dnatTable dnatChain dnat ip addr . port to tcp dport map @portToIpPort

その後、便利な時間に以下を実行します。

nft add element ip dnatTable portToIpPort '{ 80 : 172.17.0.3 . 8080 }'

関連情報