在firewalld中测试速率限制规则

在firewalld中测试速率限制规则

我想限制 ssh 连接数每个 IP到运行firewalld 的服务器。

假设我的 sshd 监听端口 2222,我想将每个 IP 的 ssh 连接数限制为每分钟 3 个。我试过:

sudo firewall-cmd --add-rich-rule \
  'rule port port="2222" protocol="tcp" accept limit value="3/m"'

然后在另一台机器上运行:

ssh myserver echo hello; \
ssh myserver echo hello; \
ssh myserver echo hello; \
ssh myserver echo hello; \  # should fail, but actually logs in
ssh myserver echo hello     # should fail, but actually logs in
...

每次都会登录。没有速率限制。

我的错误在哪里?

答案1

看起来这是不是但仍可以使用firewalld的“丰富规则”。

因此,我通过firewalld的功能使用常规iptables规则direct。(我使用firewalld的iptables后端,因为docker还不能与nftables一起使用。)

sudo firewall-cmd --add-port=2222/tcp   # remember to allow custom ssh port

sudo firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 0 \
  -p tcp --dport 2222 \
  -m state --state NEW \
  -m recent --name ssh --set

sudo firewall-cmd --direct --add-rule ipv4 filter INPUT_direct 1 \
  -p tcp --dport 2222 \
  -m state --state NEW \
  -m recent --name ssh --update --seconds 61 --hitcount 4 --rttl \
  -j REJECT --reject-with tcp-reset

# ...and the same for ipv6

去测试:

for i in {1..4}; do
  nc -z myserver 2222
  [ "$?" = 0 ] && echo "$i = success" || echo "$i = fail"
done

# 1 = success
# 2 = success
# 3 = success
# 4 = fail

相关内容