我怎样才能在一行中做到这一点?
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 位,如前面的链接所示。虽然tcp
andudp
可以通过它们的符号名称使用,但似乎dns
必须声明为53
not dns
,我只能想象这是因为dns/tcp
and 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
必须用53
and替换80
(无论如何,某些发行版/版本可能需要domain
而不是dns
)。