Достаточно недавний 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
).
Ради того, чтобы сказать, что это возможно (, но, вероятно, не очень полезно ), да, это возможно, используя достаточно свежие таблицы nftable и необработанное выражение полезной нагрузки.
Таким образом, дляinet
(двойной таблицы ip
/ip6
)вы должны сначала отфильтровать нужный протокол уровня 4 (здесь TCP=6 и UDP=17 ), используя набор, а затем отфильтровать порт 53. Это удобно, TCP и UDP имеют одинаковое расположение порта назначения в соответствующем формате. dport
выражается как смещение порта назначения в части TCP/UDP пакета :16 бит с размером 16 бит, как показано в предыдущих ссылках. Хотя tcp
и udp
могут использоваться по их символическому имени, кажется, что dns
должно быть указано как 53
, а не dns
, я могу только предположить, что это потому, что dns/tcp
и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
и 80
(, и в любом случае некоторые дистрибутивы/версии могут потребовать domain
вместоdns
).