веб-сервер (linux), который я администрирую (на VPS) для веб-сайта с небольшим объемом, только что подвергся примерно 5 запросам SYN в секунду на порту 80, при этом другой трафик с удаленного хоста не поступал. Это было больше капать чем наводнение, но оно продолжалось примерно час после того, как я впервые его заметил. Я не знаю, была ли это атака усиления или нет.
У меня нет желания участвовать в подобных вещах, и в любом случае все эти полуоткрытые соединения, забивающие netstat, раздражали, даже если не было никакого реального вреда. (SYN-файлы cookie включены, ссылка была далека от насыщения, и apache справлялся, хотя я думаю, что использование памяти увеличилось и ответы немного медленнее, чем обычно.)
Итак, этот я «смягчил», вручную заблокировав поддельный / фактический исходный IP-адрес, а затем следил за ним с помощью tcpdump, и именно поэтому я знал, что они сдались. Я хочу автоматическое решение ...
Поскольку это общедоступный веб-сервер, ДОЛЖНЫ быть соединения! А некоторые страницы содержат много изображений / файлов CSS и т. Д. Поэтому я полностью ожидаю, что настоящие пользователи будут намного превышать 5 «атакующих» запросов в секунду, и поэтому такие вещи, как
iptables -A INPUT -m state --state NEW -m limit --limit 4 / second --limit-burst 20 ....
просто поймает настоящих пользователей, но вряд ли поймает атаку, если вообще.
Помимо чего-то грубого, например, сценария, который периодически подсчитывает записи SYN_RCVD в выводе netstat и затем передает результаты в журнал для ответа fail2ban, есть ли эффективное решение для отбрасывания пакетов, если общее количество полуоткрытых подключений из данный IP превышает какое-то число? Я ничего не вижу в iptables, но, возможно, я что-то упускаю.
РЕДАКТИРОВАТЬ: Забыл сказать, что VPS основан на openVZ (построен на RHEL6), поэтому на данный момент я использую ядро 2.6.32. Ответы, которые работают с древними ядрами, были бы замечательными!
РЕДАКТИРОВАТЬ2: Таймауты Conntrack в соответствии с запросом:
net.netfilter.nf_conntrack_generic_timeout = 120
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 30
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 15
net.netfilter.nf_conntrack_tcp_timeout_established = 86400
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 30
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 15
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 10
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
net.netfilter.nf_conntrack_tcp_timeout_close = 5
net.netfilter.nf_conntrack_tcp_timeout_max_retrans = 60
net.netfilter.nf_conntrack_tcp_timeout_unacknowledged = 60
net.netfilter.nf_conntrack_udp_timeout = 10
net.netfilter.nf_conntrack_udp_timeout_stream = 60
net.netfilter.nf_conntrack_icmpv6_timeout = 30
net.netfilter.nf_conntrack_icmp_timeout = 10
net.netfilter.nf_conntrack_events_retry_timeout = 15
net.ipv6.nf_conntrack_frag6_timeout = 4194
Но, как я уже писал выше, меня не столько интересует влияние на сервер (пока оно было минимальным), сколько блокировка скрипт-кидди и т.п., точно так же, как когда они пытаются проверить, есть ли у меня phpmyAdmin, dlink -router, (и т. д.) это последний их пакет, который я получил.
Да, вы можете сделать эти настройки ядра (например, установить тайм-ауты через модуль conntrack) в сочетании с ограничениями iptables и SYNPROXY.
По сути, то, что делает synproxy, - это проверять, установлено ли полное TLS-соединение, и если нет, то отбрасывает запрос. Он имеет гораздо лучшую производительность, чем другие решения, которые были раньше (хеш-ограничения и т. Д.).
И вы правы, ограничение в 4 соединения в секунду заблокирует множество законных соединений, около 60-80 в секунду более реалистично. Для вашего случая использования synproxy определенно подойдет.
Когда я раньше в этом году поигрался с защитой от DDoS-атак с помощью встроенных инструментов Linux, я нашел здесь отличное руководство по борьбе с DoS-атаками: https://javapipe.com/ddos/blog/iptables-ddos-protection/
Это руководство по сути является практическим советом по всем тем, о чем я упоминал выше. Он объясняет, что делает каждое правило, почему вы должны или не должны его реализовывать, как это работает, как влияет на производительность, и сообщает, является ли оно необязательным, действительно отличное руководство.