port
にipv4_addr:port
マッピングされport
、ipv4_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 }'