У вас две проблемы:
использование слишком старой версии nftables.
Я смог воспроизвести ошибку Error: syntax error, unexpected saddr, expecting comma or '}'
, используя nftables версии 0.7 (, обнаруженную в Debian 9 ). Meters (nftables wiki)предлагает nftables >= 0.8.1 и ядро >= 4.3.
Обновление nftables . Например, в Debian 9, используяstretch -backports(stretch -backports , а не buster -backports)версию 0.9.0-1~bpo9+1
. искать как это сделать на других дистрибутивах.
использование неправильной таблицы, как сообщает команда (при использовании nftables 0.9.2):
# nft add rule ip filter input tcp dport @rate_limit meter syn4-meter \{ ip saddr. tcp dport timeout 5m limit rate 20/minute \} counter accept
Error: No such file or directory; did you mean set ‘rate_limit’ in table inet ‘filter’?
Действительно, многие объекты являются локальными по отношению к таблице, в которой они объявлены. Таким образом, вы не можете объявить его в «пространстве имен» inet filter и использовать его в «пространстве имен» ip filter . В этом отличие, например, от iptables
+ ipset
, где один и тот же ipset набор может использоваться в любой таблице.
Это сработает (как только вы получите достаточно свежие nftables):
nft add rule inet filter input tcp dport @rate_limit meter syn4-meter \{ ip saddr. tcp dport timeout 5m limit rate 20/minute \} counter accept
В качестве альтернативы можно вернуть определение счетчика в таблицу IP-фильтра .