Linux
如何使用 nftables 在一行中匹配給定埠的 UDP 和 TCP
我怎樣才能在一行中做到這一點?
tcp dport 53 counter accept comment "accept DNS" udp dport 53 counter accept comment "accept DNS"
有了最近的足夠
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
為了說明它是可能的(但可能不是那麼有用),是的,它是可能的,使用最近足夠的 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
見後文)位於兩個不同的“協議名稱空間”中。生成的命令是(額外的單引號,否則這裡需要轉義雙引號):
# 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
and80
(以及無論如何一些發行版/版本可能需要domain
而不是dns
)。