我想限制 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