LinuxForum.Fans
Тема

Ограничения входящего трафика.

Автор: Gentoos 28 сообщений 6649 просмотров
#374428

Как ограничить количество пакетов с одного айпи? Как ограничить "вес" пакетов с одного айпи? \ udp протокол
p.s. CentOS, залипаю, пятница %)
Пробовал так \ на количество пакетов:

text
-A INPUT -p udp --dport 444 -m hashlimit --hashlimit 1/s --hashlimit-burst 5 --hashlimit-mode srcip,srcport --hashlimit-name TEST -j ACCEPT
-A INPUT -p udp --dport 444 -j DROP

Не помогло. Есть еще варианты?

#374473
text
-A INPUT -p udp --dport 444 -m connlimit --connlimit-above 10 -j DROP

Так тоже не помогло.

Вся пачка правил:

text
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m udp -p udp --dport 444 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT 
-A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
-A INPUT -p udp --dport 444 -m connlimit --connlimit-above 10 -j DROP
COMMIT
#374485

p.s. Проверил еще раз скрипт, лил трафик в течении 2-ух минут - бана не было, пробовал как дефолт + iptables, так и разлиные дополнения с мануалов.

#374548
text
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p udp --dport 444 -j DROP
-A INPUT -p udp --dport 444 -m hashlimit --hashlimit 1/s --hashlimit-burst 5 --hashlimit-mode srcip,srcport --hashlimit-name TEST -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A INPUT -m state --state NEW -m udp -p udp --dport 444 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

COMMIT

Сейчас юзаю так - тоже не помогает, трафик проходит без проблем.

#374803


...
-A INPUT -p udp --dport 444 -j DROP -m comment --comment "дропаем весь входящий udp-трафик на порт 444"
-A INPUT -p udp --dport 444 -m hashlimit --hashlimit 1/s --hashlimit-burst 5 --hashlimit-mode srcip,srcport --hashlimit-name TEST -j ACCEPT -m comment --comment "правило никогда не будет применено"
...
-A INPUT -m state --state NEW -m udp -p udp --dport 444 -j ACCEPT -m comment --comment "правило никогда не будет применено"
...
#374869

Стоп-стоп, спасибо конечно.
Но я вроде разобрался, только есть немного другая проблема - нужно просто забанить айпи при превышении лимита входящих пакетов.
Правило пофиксил:

text
-A INPUT -p udp --dport 444 -m hashlimit --hashlimit 200/s --hashlimit-mode srcip,srcport --hashlimit-name TEST -j ACCEPT

То есть получается 200 пакетов в секунду с одного айпи. И если лимит привышен - айпи в бан.

Ибо в любом случае трафик проходит, режет только 5%. От дропа как я понял толку не много.

#374893
Gentoos написал:
только есть немного другая проблема - нужно просто забанить айпи при превышении лимита входящих пакетов.

Попробуй модифицировать такое:

text
# Создаем цепочки POP3 attack 
$IPT -N POP3_CHECK
$IPT -N POP3_ATTACKED
# Захватываем POP3-соединение
$IPT -A INPUT -p tcp -m state --state NEW --dport 110 -j POP3_CHECK
# Определяем цепочку POP3_CHECK
$IPT -A POP3_CHECK -m recent --set --name POP3
$IPT -A POP3_CHECK -m recent --update --seconds 10 --hitcount 2 --name POP3 -j POP3_ATTACKED
$IPT -A POP3_CHECK -j ACCEPT
# Определяем цепочку POP3_ATTACKED
$IPT -A POP3_ATTACKED -j LOG --log-prefix "iptables POP3 attack: "
$IPT -A POP3_ATTACKED -j REJECT --reject-with icmp-host-unreachable 

У меня несколько таких правил в скрипте, каждое на свой порт настроено. Можно и перестроить...

#374920
text
# Создаем цепочки POP3 attack 
-N POP3_CHECK
-N POP3_ATTACKED
# Захватываем POP3-соединение
-A INPUT -p udp --dport 444 -m hashlimit --hashlimit 200/s --hashlimit-mode srcip,srcport --hashlimit-name TEST -j POP3_CHECK
# Определяем цепочку POP3_CHECK
-A POP3_CHECK -m recent --set --name POP3
-A POP3_CHECK -m recent --update --seconds 1 --hitcount 2 --name POP3 -j POP3_ATTACKED
-A POP3_CHECK -j ACCEPT
# Определяем цепочку POP3_ATTACKED
-A POP3_ATTACKED -j LOG --log-prefix "iptables POP3 attack: "
-A POP3_ATTACKED -j REJECT --reject-with icmp-host-unreachable 
-A INPUT -m state --state NEW -m udp -p udp --dport 444 -j ACCEPT

Все верно?

#374922

Полный набор правил:

text
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# Создаем цепочки POP3 attack -N POP3_CHECK -N POP3_ATTACKED # Захватываем POP3-соединение -A INPUT -p udp --dport 444 -m hashlimit --hashlimit 200/s --hashlimit-mode srcip,srcport --hashlimit-name TEST -j POP3_CHECK # Определяем цепочку POP3_CHECK -A POP3_CHECK -m recent --set --name POP3 -A POP3_CHECK -m recent --update --seconds 10 --hitcount 2 --name POP3 -j POP3_ATTACKED -A POP3_CHECK -j ACCEPT # Определяем цепочку POP3_ATTACKED -A POP3_ATTACKED -j LOG --log-prefix "iptables POP3 attack: " -A POP3_ATTACKED -j REJECT --reject-with icmp-host-unreachable

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A INPUT -m state --state NEW -m udp -p udp --dport 444 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

COMMIT

#374923

Строчка

text
-A INPUT -m state --state NEW -m udp -p udp --dport 444 -j ACCEPT

лишняя. Так как ACCEPT на 444-UDP был выше, в фильтре. Это первое.
Втрое - какой смысл несет --state NEW для udp-протокола? Это же протокол без установления соединения и в нём нет "первого" пакета.
Ну и третье - зачем писать про POP3 если оно не используется? Лучше комментировать то, что есть в реале.

#374924

Предположим комментарии лишние(то есть неправильные), аццепт убрал(то есть правило).
Почему трафик полноценно проходит?

iptables -vL
Правила

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# Создаем цепочки POP3 attack
-N POP3_CHECK
-N POP3_ATTACKED
# Захватываем POP3-соединение
-A INPUT -p udp --dport 444 -j POP3_CHECK
# Определяем цепочку POP3_CHECK
-A POP3_CHECK -m recent --set --name POP3
-A POP3_CHECK -m recent --update --seconds 10 --hitcount 2 --name POP3 -j POP3_ATTACKED
-A POP3_CHECK -j ACCEPT
# Определяем цепочку POP3_ATTACKED
-A POP3_ATTACKED -j LOG --log-prefix "iptables POP3 attack: "
-A POP3_ATTACKED -j REJECT --reject-with icmp-host-unreachable

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT

COMMIT
#374954

Не могу понять где именно накосячил, в первый раз все работало корректно, резало 90% трафика. Ну а сейчас вообще реакция = 0

#375294

Есть идеи?

#375358

Чего-то я не пойму. Почему POP3 и udp:444? POP3 работает по tcp:110. Если мне мой RAM не изменяет :)
Судя по счетчикам пакетов в выводе команды - пакеты таки дропаются (iptables -nvL POP3_ATTACKED --line-numbers).

У нас на ns-серверах есть такие вот штуки:

text
...
-A INPUT -p udp -m udp --dport 53 -m hashlimit --hashlimit-upto 400/sec --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name udp -j ACCEPT 
-A INPUT -p udp -m udp --dport 53 -j DROP
...

Соответственно - от одного ip максимум 400 запросов в секунду (по udp, по tcp таких ограничений нет, т.к. ddos-ы с tcp-dns-"плечем" не должны работать (по идее :)))

#375419
afanasev.p написал:
Чего-то я не пойму. Почему POP3 и udp:444? POP3 работает по tcp:110. Если мне мой RAM не изменяет :)

а это потомк что копипаста с моего примера. У меня в правилах несколько однотипных проверок реализовано на разные протоколы. Одну опубликовал. А топикстартер просто поленился текст про POP3 заменить на нужный, описывающий реальную ситуацию. А вот почему проверки не отрабатывают - я не пойму. Не вижу в записи ошибок.

#375429

afanasev.p
Это все понятно, поэтому ищу аналог для udp.

#375430
text
Не вижу в записи ошибок.

Как мне предоставить информацию?

опикстартер просто поленился текст про POP3 заменить на нужный, описывающий реальную ситуацию

К сожалению с POP3 не приходилось работать, да и в Iptables новичок. Поэтому толком и не понял о каком тексте речь.
Хотя я так понимаю, что POP3 - это порт почты, мне просто переименовать в UDP? Если да, то:

#375447
Список правил Iptables на сейчас
text
# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]

# Создаем цепочки UDP attack -N UDP_CHECK -N UDP_ATTACKED # Захватываем UDP-соединение -A INPUT -p udp --dport 444 -j UDP_CHECK # Определяем цепочку POP3_CHECK -A UDP_CHECK -m recent --set --name UDP -A UDP_CHECK -m recent --update --seconds 10 --hitcount 2 --name UDP -j UDP_ATTACKED -A UDP_CHECK -j ACCEPT # Определяем цепочку UDP_ATTACKED -A UDP_ATTACKED -j LOG --log-prefix "iptables UDP attack: " -A UDP_ATTACKED -j REJECT --reject-with icmp-host-unreachable

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -j REJECT --reject-with icmp-host-prohibited -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT COMMIT

iptables -vL
#375533
Gentoos написал:
Это все понятно, поэтому ищу аналог для udp.

Хех. Привел же вам работающие правила, разрешающие для одного ip 400 запросов в секунду (по udp).
В ваших текущих правилах:


# Захватываем UDP-соединение
-A INPUT -p udp --dport 444 -j UDP_CHECK -m comment --comment "Все пакеты на udp:444 отправить в цепочку UDP_CHECK"
# Определяем цепочку POP3_CHECK
-A UDP_CHECK -m recent --set --name UDP -m comment --comment "Обновить время поступления пакетов для UDP"
-A UDP_CHECK -m recent --update --seconds 10 --hitcount 2 --name UDP -j UDP_ATTACKED -m comment --comment "если за последние 10 секунд поймали 2 пакета (и более) с одного ip - обновляем время поступления пакетов и обрабатываем эти пакеты с помощью цепочки UDP_ATTACKED"
-A UDP_CHECK -j ACCEPT -m comment --comment "Разрешаем прохождение всех пакетов (не попавших под правила выше)"
# Определяем цепочку UDP_ATTACKED
-A UDP_ATTACKED -j LOG --log-prefix "iptables UDP attack: " -m comment --comment "Заносим в системный лог (обычно /var/log/messages) сообщение о блокировке пакетов"
-A UDP_ATTACKED -j REJECT --reject-with icmp-host-unreachable -m comment --comment "Дропаем пакеты все пакеты, попавшие в эту цепочку"

Судя по выводу iptables за время после последнего сброса трафика по udp:444 у вас прошло 13436 пакетов. Один из них был принят, все остальные - сброшены.
Это то, что вам нужно?

Войдите или зарегистрируйтесь, чтобы ответить.