1 (28.03.2014 23:42:53 отредактировано Gentoos)

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

-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

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

2

Gentoos пишет:

Есть еще варианты?

То есть любые варианты.
Юзал скрипт: http://sys-admin.kz/os/nix/510-centos-p … s-dos.html - аналогично > 0 результата

3 (29.03.2014 14:09:01 отредактировано Gentoos)

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

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

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

# 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

4

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

5 (29.03.2014 19:49:37 отредактировано Gentoos)

# 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

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

6

...
-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 "правило никогда не будет применено"
...

И баба с воза, и волки сыты...

7 (01.04.2014 00:21:08 отредактировано Gentoos)

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

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

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

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

8

Gentoos пишет:

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

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

# Создаем цепочки 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 

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

9

# Создаем цепочки 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

Все верно?

http://data2.floomby.com/files/share/1_4_2014/12/vB13D3BQkUnb0rNc11yw.jpg

10

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

# 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

11

Строчка

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

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

12 (01.04.2014 19:33:03 отредактировано Gentoos)

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

+ iptables -vL

http://data3.floomby.com/files/share/1_4_2014/17/vVcbVhDKOkC6SHEuF9eJA.jpg

+ Правила

# 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

13

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

14

Есть идеи?

15

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

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

...
-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-"плечем" не должны работать (по идее ab))

И баба с воза, и волки сыты...

16

afanasev.p пишет:

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

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

17 (04.04.2014 21:41:01 отредактировано Gentoos)

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

18 (05.04.2014 01:31:28 отредактировано Gentoos)

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

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

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

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

19

+  Список правил Iptables на сейчас
# 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

http://data3.floomby.com/files/share/4_4_2014/23/dLWfxP558UWD4DTGunMxDA.jpg

20

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 пакетов. Один из них был принят, все остальные - сброшены.
Это то, что вам нужно?

И баба с воза, и волки сыты...

21 (05.04.2014 18:30:24 отредактировано Gentoos)

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

Посмотрите первые посты, все это уже использовалось. Пакеты уходили в дроп, но толку от этого не было. Уходило 5% трафика.
В ближайшее время посмотрю что к чему, но я сомневаюсь, что iptraf показывает "неверные данные".

22

Какой "толк" вы от этих правил хотите получить? Чтобы трафик перестал литься на сетевуху?

И баба с воза, и волки сыты...

23 (06.04.2014 12:44:30 отредактировано Gentoos)

Что-то вроде этого.
То есть чтобы выше 200 пакетов в секунду с одного айпи уходили в дроп, а лучше айпи в бан.

24

-A INPUT -p udp -m udp --dport 444 -m hashlimit --hashlimit-upto 200/sec --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name udp -j ACCEPT 
-A INPUT -p udp -m udp --dport 444 -j DROP

Эти правила пропускают 200 пакетов в секунду с одного ip (+10 пакетов бурста). Все остальное дропается.

И баба с воза, и волки сыты...

25 (07.04.2014 17:05:37 отредактировано Gentoos)

Посмотрите первые посты, это правило уже было испробовано.
"Толку от него чуть больше, чем ничего".

+ открыть спойлер

http://data3.floomby.com/files/share/7_4_2014/12/NWFLAKFKzkmkgse91f5FSQ.jpg

То есть изначально работает, потом увеличиваем количество пакетов и все. "Отпадает". После дальнейших ресетов и вовсе не работает.
Короче говоря, можно сделать вывод: нужно что-то, что будет ловить пакеты до машины(циско например). С iptables каши особо не сваришь.

26

ab
Вы, для начала, поймите, что iptables фильтрует те пакеты, которые _уже_ попали на сетевой интерфейс. Т.е. iptables не заставит сетевой интерфейс получать меньше пакетов, он способен только не допустить эти пакеты до конечного приложения. Но - так или иначе, утилизация канала будет происходить.
Пример:
Создаем поток на сервер по udp:1111 (любой номер порта сюда подставьте) и наблюдаем за загрузкой интерфейса. Вне зависимости от фильтров, установленных в iptables все пакеты будут приходить на интерфейс, а уже после этого дропаться фаерволом. Даже если политики для INPUT будет DROP без единого разрешающего правила - пакеты все равно будут доставлены. Канал все равно будет утилизирован.

Если же вас интересует именно "уменьшить утилизацию интерфейса сервера", то конечно же перед сервером нужно ставить какую-нибудь дополнительную железку (cisco, dlink, софтовый фаервол на том же linux-е - абсолютно не важно. Эффект, описанный выше вы получите на любом "железе"), и с помощью нее "фильтровать" трафик. Только в этом случае вы можете добиться уменьшения утилизации линка сервера.

И баба с воза, и волки сыты...

27 (08.04.2014 23:36:22 отредактировано Gentoos)

Вообще я предлагал более правильное решение - банить айпи.
То есть при наличии порога трафика с айпи - баним, а не просто дропаем.

28

Можно конечно и банить. Только смотря какими средствами ab

И баба с воза, и волки сыты...