Я пытаюсь настроить брандмауэр с помощью nftables, но мне не удалось понять и реализовать простое ограничение скорости на основе найденной документации.
Я построил тестовый брандмауэр с помощью приведенной ниже последовательности команд:
nft 'add table inet testnetwork'
nft 'add chain inet testnetwork INPUT { type filter hook input priority 0; policy drop; }'
nft 'add set inet testnetwork SSH { type ipv4_addr; flags dynamic, timeout; size 65536; }'
nft 'add rule inet testnetwork INPUT ct state related,established counter accept'
nft 'add rule inet testnetwork INPUT ip saddr @SSH ct state new tcp dport 22 counter drop'
nft 'add rule inet testnetwork INPUT ct state new tcp dport 22 limit rate over 10/minute add @SSH {ip saddr timeout 60s} counter'
nft 'add rule inet testnetwork INPUT ct state new tcp dport 22 tcp sport 1024-65535 counter accept'
Когда я перечисляю исходный набор правил, я получаю:
table inet testnetwork {
set SSH {
type ipv4_addr
size 65536
flags dynamic,timeout
}
chain INPUT {
type filter hook input priority filter; policy drop;
ct state established,related counter packets 0 bytes 0 accept
ip saddr @SSH ct state new tcp dport 22 counter packets 0 bytes 0 drop
ct state new tcp dport 22 limit rate over 10/minute add @SSH { ip saddr timeout 1m } counter packets 0 bytes 0
ct state new tcp dport 22 tcp sport 1024-65535 counter packets 0 bytes 0 accept
}
}
С такой конфигурацией я ожидаю, что IP-адрес будет добавлен в набор SSH на его 11-м (новом)пробное подключение в течение 1 минуты и блокировка (на 1 минуту), начиная с 12-й попытки.
Однако, когда я открываю второе окно терминала и последовательно инициирую, а затем закрываю менее 10 ssh-подключений к 127.0.0.1, я получаю IP-адрес, добавленный в набор SSH, а затем заблокированный.
Статус набора правил ниже с 7-й попытки.:
table inet testnetwork {
set SSH {
type ipv4_addr
size 65536
flags dynamic,timeout
elements = { 127.0.0.1 timeout 1m expires 54s564ms }
}
chain INPUT {
type filter hook input priority filter; policy drop;
ct state established,related counter packets 156 bytes 28692 accept
ip saddr @SSH ct state new tcp dport 22 counter packets 3 bytes 180 drop
ct state new tcp dport 22 limit rate over 10/minute add @SSH { ip saddr timeout 1m } counter packets 1 bytes 60
ct state new tcp dport 22 tcp sport 1024-65535 counter packets 6 bytes 360 accept
}
}
На данный момент я либо неправильно понимаю механизм ограничения скорости, либо где-то ошибся.
Не мог бы кто-нибудь помочь мне, указав, были ли мои ожидания ошибочными или откуда могла возникнуть ошибка?
С уважением и благодарностью за ваше время
На моем VPS
sshPort=2222
nft add table ip sshGuard
nft add chain ip sshGuard input { type filter hook input priority 0 \; }
nft add set ip sshGuard denylist { type ipv4_addr \; flags dynamic, timeout \; timeout 5m \; }
nft add rule ip sshGuard input tcp dport $sshPort ct state new ip saddr @denylist reject
nft add rule ip sshGuard input tcp dport $sshPort ct state new limit rate over 2/minute burst 3 packets add @denylist { ip saddr } reject
nft list table ip sshGuard
я тестирую несколько раз (каждое поnft flush set ip sshGuard denylist
), 4-е соединение будет отклонено. Если я изменю limit rate over 2/minute burst 3 packets
на limit rate over 2/minute
, отказ будет получен после 7-9 соединений. Следовательно, я не знаю точного механизма limit rate over 2/minute
, но burst 3 packets
, кажется, делает вещи более определенными.
По умолчанию burst
устанавливается с помощью#define NFT_LIMIT_PKT_BURST_DEFAULT 5