nftables:如何使用 1 个通用映射(或集合)来实现不同但相关的规则? (DNA+转发)

nftables:如何使用 1 个通用映射(或集合)来实现不同但相关的规则? (DNA+转发)

nftables我正在使用(v0.9.6)设置防火墙 + NAT 。该工具提供集合和映射以避免大量规则重复。

我想使用一种通用的数据结构(集或映射)来配置 DNAT 和过滤规则(转发)。

当我尝试 ( nft --check -f example.conf) 时,总是会出现错误。你知道有什么方法可以做到这一点吗无需重复NAT 映射到 2 个数据结构(一个映射和一组)?

这是我使用的示例(请参阅大写注释)。

这些是地图和设置:

table inet filter {
  map mymap {
    type inet_service : ipv4_addr
    elements = {
      12345 : 192.168.0.66,
      4321  : 192.168.0.77
    }
  }

  set myset {
    type ipv4_addr . inet_service
    elements = {
      192.168.0.66 . 12345,
      192.168.0.77 . 4321
    }
  }

这些是规则:

  chain natprerouting {
    type nat hook prerouting priority dstnat; # =-100

    # ACCEPTED:
    dnat ip to tcp dport map @mymap

    # ERROR AT PARSING (unexpected string: @myset):
    dnat ip addr . port to @myset
  }

  chain forward {
    type filter hook forward priority filter; # =0

    # ERROR AT PARSING (unexpected dport):
    ip daddr tcp dport map @mymap accept

    # ACCEPTED:
    ip daddr . tcp dport @myset accept
  }
}

dnat to如果可以接受的话,它会起作用。我可以转换一个地图变成一个(或相反亦然)?有办法吗?

答案1

无需显式接受每个 DNATed 连接在前向链中,因为连接跟踪已经了解 DNAT。

ct status dnat accept只需像这样使用:

table inet filter {
  chain forward {
    type filter hook forward priority filter; # =0

    # THIS ONE AUTOMATICALLY ACCEPTS ALL OUR DNATed PACKETS
    ct status dnat accept
  }
}

一些功劳归于来自 netfilter 邮件列表的 Trent Buck

相关内容