Linux

如何使用 nftables 在一行中匹配給定埠的 UDP 和 TCP

  • October 12, 2021

我怎樣才能在一行中做到這一點?

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(dual ip/ ip6) 表,您必須首先使用一組過濾正確的第 4 級協議(此處為 TCP=6 和 UDP=17),然後過濾埠 53。這很方便,TCPUDP具有相同的位置各自格式的目標埠。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)。

引用自:https://unix.stackexchange.com/questions/448209