Забанить IP, когда сервер получил от него объем данных
Что мне нужно:
Есть много результатов для добавления правил отбрасывания по количеству запросов за промежутки времени, но мне нужно отбросить количество полученных байтов с определенного адреса за определенный период времени.
Что я исследовал:
Я посмотрел на iptables: для первого случая я увидел специальный матч. Я также видел совпадение квот, но подсчет данных отслеживается глобально.
Я понятия не имею, как смешать два правила для отслеживания полученных данных по IP.
Другие вещи:
Я знаю, что отслеживание количества байтов на IP может использовать много памяти, поэтому я также хочу, чтобы период был коротким.
Я могу принять другие методы, если есть подробный пример для этого.
1 ответ
Вы можете использовать IPSET с параметрами тайм-аута и счетчика. Это будет выглядеть так:
#create ipset for accounting with default lifetime 300 secs
ipset create IP_QUOTA_SET hash:ip timeout 300 counters
#create separated rule chain
iptables --new-chain PER_IP_QOUTING
#send packets to chain
iptables -t filter -A INPUT \
-i <in-iface> --dst <ip> \
-p tcp --dport <dstport> \
-j PER_IP_QUOTING
#if ip doesn't exist in the set, add it
iptables -t filter -A PER_IP_QUOTING \
-m set ! --match-set IP_QUOTA_SET src \
-j SET --add-set IP_QUOTA_SET src --timeout 300
#if packet exists in the set, check bytes
#if byte counter > quota then close connection
#by sending of tcp-reset packet.
iptables -t filter -A PER_IP_QUOTING \
-m set --match-set IP_QUOTA_SET src \
--bytes-gt 1000 -j REJECT --reject-with tcp-rst
#pass other packets (for debug purpose)
iptables -t filter -A PER_IP_QUOTING \
-j RETURN
В этом случае вы можете проверить список и отредактировать его с помощью команды ipset. Показать текущий список со счетчиками и таймаутами: список ipset IP_QUOTA_SET.
Для подробностей прочитайте документацию.