LINUX.ORG.RU

Ответ на: комментарий от Amet13

Подсчитывать число коннектов через netstat - долго и накладно. conntrackd - это процесс, который отслеживает создание/удаление соединений. Если модифицировать его для подсчета коннектов по заданным портам/адресам, то скорость реакции на ddos и накладные расход на подсчет коннектов резко сократятся. Но это требует программирования :( Так что conntrackd заточенный для подсчета коннектов - это светлое, далекое будующее.

Может быть есть смысл использовать «conntrack -L -p tcp --state ESTABLISHED ...» для подсчета соединений на заданый ip/порт. Там фильтр реализован на уровне ядра - т.е. в userspace передаются только сведенья о соединениях соответствующих фильтру. Делается это очень быстро (через netlink), а не через медленный procfs.

Другой вариант - использование connlimit + SET. общая идея

ipset create DDOS hash:ip timeout 7200
#raw
iptables -t raw -A PREROUTING -p tcp --dport 80 -m set --match-set DDOS src -j DROP
....
#filter
iptables -N BLOCK_DDOS
iptables -A BLOCK_DDOS -j SET --add-set DDOS src
#так делать нельзя - это DDOS самому себе
#нужно слать tcp-reset в обе стороны
#нужно маркировать коннект и на любую попытку обмена данными IN & OUT
# делать -j REJECT --reject-with tcp-reset
iptables -A BLOCK_DDOS -j DROP

#после synproxy
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-saddr --connlimit-above XXX -j BLOCK_DDOS

В данном случае скрипт с netstat & other вообще не нужен.

Чтобы коннекты подсчитывались правильно, нужно интересующие нас коннекты запихивать в отделную зону (через -j CT --zone). В новых ядрах connlimit работает с учетом зоны!

На счет synproxy - есть смысл предложить шаблон ( на опеннете приведен стандартный вариант использования synproxy). Нужно напомнить, что synproxy работает только с локальным трафиком (local input/local output) - для защиты машины в сети (за роутером) synproxy использовать нельзя.

Важно понять про разницу дропов пакетов в raw и filter. Если бы дропаем пакет в raw, то conntrack даже не будет создан.

Еще раз повторю - создание conntrack дорогая операция, т.ч. мусорный трафик лучше в conntrack не пускать.

В ipset есть замечательная опция «timeout» которая позволяет вносить адрес не навсегда, а на какое-то время (не нужно самостоятельно чистить таблицу).

Кстати ipset можно собрать совсем отдельно, правда если ядро не совсем старое.

Ну и не плохо было бы напомнить про RPS/RFS ( IMHO есть неплохая статейка на хабре про пользу RPS/RFS) Это софтверные фичи, которые реально помогают распараллеливать обработку трафика, особенно в случае «тупых» сетевых карт.

vel ★★★★★
()
Последнее исправление: vel (всего исправлений: 2)
Ответ на: комментарий от vel

Спасибо за развернутый ответ, узнал много нового.

Если есть варианты проще и производительнее, то ddos-deflate я уже допиливать не буду наверное. Пусть остается пока таким.

Amet13 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.