nftables 将“port”映射到“ip:port”以进行 DNAT

nftables 将“port”映射到“ip:port”以进行 DNAT

是否有可能有一个 nftables 映射,映射portipv4_addr:port、 whereportipv4_addr:port具有不同的 TCP 端口号?例如,我想将端口 80 上的所有传入数据包 dnat 到在端口 8080 上运行 Web 服务器的容器(纯粹使用 nftables)。这可以使用两个地图和两个地图查找来实现,如下所示:

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.4发布于 2020-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-08-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 }'

相关内容