Как временно заблокировать IP-адрес, который делает слишком много обращений к серверу с помощью iptables?

это мой первый вопрос.

Я сделал следующий сценарий, чтобы защитить свой сервер от Slowloris и некоторого DDOS.

#!/bin/sh
# It does not allow more than 10 connections per IP on ports 80 and 443. And log it.
# Except when the IP comes from 123.456.789.000
/sbin/iptables -A INPUT -p tcp --syn --dport 80 ! -s 123.456.789.000 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLOCK ATTACK: " --log-level 6
/sbin/iptables -A INPUT -p tcp --syn --dport 80 ! -s 123.456.789.000 -m connlimit --connlimit-above 10 -j REJECT --reject-with tcp-reset

/sbin/iptables -A INPUT -p tcp --syn --dport 443 ! -s 123.456.789.000 -m connlimit --connlimit-above 10 -j LOG --log-prefix "BLOCK ATTACK HTTPS: " --log-level 6
/sbin/iptables -A INPUT -p tcp --syn --dport 443 ! -s 123.456.789.000 -m connlimit --connlimit-above 10 -j REJECT --reject-with tcp-reset

Первый вопрос: это правильно? будет работать как хотелось бы?

Второй вопрос: как мне адаптировать этот код iptables для временной блокировки IP, если - connlimit-above 10 произойдет 3 раза?

Примечание: я знаю fail2ban, но хочу использовать iptables . And I want to use connlimit, Not just count hits on the server.

I tried several ways to do this, googled too much and I fail :(

-2
задан 30 March 2016 в 03:50
1 ответ

Отвечая на свой вопрос, после долгой работы и исследований я создал этот сценарий для iptables:

#!/bin/sh
/sbin/iptables -N BLOCK_IP
/sbin/iptables -N SYN_CHECK
/sbin/iptables -N DOS_CHECK
/sbin/iptables -N SYN_ATTACK
/sbin/iptables -N DOS_ATTACK
#
# first checks if the IP is already blocked
/sbin/iptables -A INPUT -j BLOCK_IP
# drop if is blocked
/sbin/iptables -A BLOCK_IP -p tcp -m multiport --dport 80,443 -m recent --name BlockedIP --rcheck --seconds 60 -j DROP
/sbin/iptables -A BLOCK_IP -p udp -m multiport --dport 80,443 -m recent --name BlockedIP --rcheck --seconds 60 -j DROP
# if already pass the time unblock the IP
/sbin/iptables -A BLOCK_IP -p tcp -m multiport --dport 80,443 -m recent --name BlockedIP --remove -j RETURN
/sbin/iptables -A BLOCK_IP -p udp -m multiport --dport 80,443 -m recent --name BlockedIP --remove -j RETURN
#
# check: if there is more than 20 simultaneous connections with SYN status - ignores IP Varnish Cache
/sbin/iptables -A INPUT -p tcp -m multiport --dport 80,443 --syn ! -s 123.456.789.000 -m connlimit --connlimit-above 20 -j SYN_CHECK
# check: hit and then connect frequency - ignores IP Varnish Cache
/sbin/iptables -A INPUT -p tcp -m multiport --dport 80,443 ! -s 123.456.789.000 -m state --state NEW -j DOS_CHECK
/sbin/iptables -A INPUT -p udp -m multiport --dport 80,443 ! -s 123.456.789.000 -m state --state NEW -j DOS_CHECK
#
# checks if the attack is frequently
/sbin/iptables -A SYN_CHECK -m recent --update --seconds 10 --hitcount 20 --name RATE -j SYN_ATTACK
/sbin/iptables -A DOS_CHECK -m recent --update --seconds 3 --hitcount 20 --name RATE -j DOS_ATTACK
# if the attack is frequent blocks for 1 minute and generates log
/sbin/iptables -A SYN_ATTACK -j LOG --log-prefix "BLOCK SYN ATTACK: " --log-level 6
/sbin/iptables -A SYN_ATTACK -m recent --set --name BlockedIP -j DROP
/sbin/iptables -A DOS_ATTACK -j LOG --log-prefix "BLOCK DOS ATTACK: " --log-level 6
/sbin/iptables -A DOS_ATTACK -m recent --set --name BlockedIP -j DROP
#
# if the attack is not frequent, accept
/sbin/iptables -A SYN_CHECK -m recent --set --name RATE -j ACCEPT
/sbin/iptables -A DOS_CHECK -m recent --set --name RATE -j ACCEPT
#

Но я не уверен, полностью ли уверен. На мой взгляд, после просмотра множества примеров в Интернете, это один из лучших сценариев защиты http для iptables.

Однако мне хотелось бы другого мнения, в моей логике все имеет смысл. Но я никогда раньше не программировал для iptables.

Мне хотелось бы узнать мнение эксперта по этому вопросу.

1
ответ дан 5 December 2019 в 21:24

Теги

Похожие вопросы