如何使用 nftables 在一行中匹配给定端口的 UDP 和 TCP

如何使用 nftables 在一行中匹配给定端口的 UDP 和 TCP

我怎样才能在一行中做到这一点?

tcp dport 53 counter accept comment "accept DNS"
udp dport 53 counter accept comment "accept DNS"

答案1

如果足够新nftables,你可以写:

meta l4proto {tcp, udp} th dport 53 counter accept comment "accept DNS"

事实上,你可以做得更好:

set okports {
  type inet_proto . inet_service
  counter
  elements = {
    tcp . 22,  # SSH
    tcp . 53,  # DNS (TCP)
    udp . 53   # DNS (UDP)
}

进而:

meta l4proto . th dport @okports accept

如果您更喜欢使用端口/服务名称(来自) ,您也可以编写domain代替。53/etc/services

答案2

为了告诉大家这是可能的(但可能没那么有用),是的,这是可能的,使用最近足够的nftables和原始有效负载表达式。

因此,对于inet(dual ip/ ip6) 表,您必须首先使用一组过滤正确的 4 级协议(此处 TCP=6 和 UDP=17),然后过滤端口 53。这很方便,传输控制协议UDP协议其各自的格式具有相同的目标端口位置。dport表示为数据包的 TCP/UDP 部分中目标端口的偏移量:16 位,大小为 16 位,如前面的链接所示。虽然tcpandudp可以通过它们的符号名称使用,但似乎dns必须声明为53not dns,我只能想象这是因为dns/tcpand dns/udp(或domain稍后参见)位于两个不同的“协议命名空间”中。

生成的命令是(此处需要附加单引号或转义双引号):

# nft 'add rule inet filter input meta l4proto {tcp, udp} @th,16,16 53 counter accept comment "accept DNS"'

如果您只需要 IPv4,请初始化相应的ip表和链并替换inetip.

另请注意,几乎相同的内容作为示例给出0.8.3 发行说明现在已包含在nft的手册页,唉,这个例子不起作用:dns并且http必须用53and替换80(无论如何,某些发行版/版本可能需要domain而不是dns)。

相关内容