Microsoft Linux TM Asked: 2018-06-07 05:49:54 +0800 CST2018-06-07 05:49:54 +0800 CST 2018-06-07 05:49:54 +0800 CST 如何使用 nftables 在一行中匹配给定端口的 UDP 和 TCP 772 我怎样才能在一行中做到这一点? tcp dport 53 counter accept comment "accept DNS" udp dport 53 counter accept comment "accept DNS" linux configuration 2 个回答 Voted Best Answer Totor 2021-10-04T05:07:19+08:002021-10-04T05:07:19+08:00 有了最近的足够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 A.B 2018-08-01T04:44:01+08:002018-08-01T04:44:01+08:00 为了说明它是可能的(但可能不是那么有用),是的,它是可能的,使用最近足够的 nftables和原始有效负载表达式。 因此,对于inet(dual ip/ ip6) 表,您必须首先使用一组过滤正确的第 4 级协议(此处为 TCP=6 和 UDP=17),然后过滤端口 53。这很方便,TCP和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表和链并替换inet为ip. 另请注意,几乎与0.8.3 发行说明中的示例相同,现在包含在nft的手册页中,唉,该示例不起作用:dns并且http必须替换为53and 80(以及无论如何一些发行版/版本可能需要domain而不是dns)。
有了最近的足够
nftables
,你可以写:实际上,您可以做得更好:
接着:
如果您更喜欢使用端口/服务名称(来自) ,您也可以编写
domain
而不是。53
/etc/services
为了说明它是可能的(但可能不是那么有用),是的,它是可能的,使用最近足够的 nftables和原始有效负载表达式。
因此,对于
inet
(dualip
/ip6
) 表,您必须首先使用一组过滤正确的第 4 级协议(此处为 TCP=6 和 UDP=17),然后过滤端口 53。这很方便,TCP和UDP具有相同的位置各自格式的目标端口。dport
表示为数据包的 TCP/UDP 部分中目的端口的偏移量:16 位,大小为 16 位,如前面的链接所示。虽然tcp
andudp
可以通过它们的符号名称使用,但似乎dns
必须将其声明为53
notdns
,我只能想象这是因为dns/tcp
anddns/udp
(或domain
见后文)位于两个不同的“协议名称空间”中。生成的命令是(额外的单引号,否则这里需要转义双引号):
如果您只希望它用于 IPv4,请初始化相应的
ip
表和链并替换inet
为ip
.另请注意,几乎与0.8.3 发行说明中的示例相同,现在包含在
nft
的手册页中,唉,该示例不起作用:dns
并且http
必须替换为53
and80
(以及无论如何一些发行版/版本可能需要domain
而不是dns
)。