Защищаем сервер от DDOS атак
Собственно, речь пойдет о защите от SYN flood атак:
Определить SYN атаку просто — команда netstat выдает огромный список полуоткрытых подключений:
netstat -n --tcp | grep SYN_RECV tcp 0 0 xxx.xxx.xxx.xxx:80 yyy.yyy.yyy.yyy:1084 SYN_RECV tcp 0 0 xxx.xxx.xxx.xxx:80 yyy.yyy.yyy.yyy:1228 SYN_RECV tcp 0 0 xxx.xxx.xxx.xxx:80 yyy.yyy.yyy.yyy:2652 SYN_RECV tcp 0 0 xxx.xxx.xxx.xxx:80 yyy.yyy.yyy.yyy:3446 SYN_RECV
Можем просто подсчитать количество:
netstat -n --tcp | grep SYN_RECV | wc -l 238
Для начала — проверяем параметр tcp_syncookies — он должен быть равен 1:
cat /proc/sys/net/ipv4/tcp_syncookies 1
Так и оставляем. По умолчанию в новых дистрибутивах этот параметр всегда включен.
SYN cookies вообще не использует очередь SYN. Вместо этого ядро отвечает на каждый SYN пакет, как обычно SYN|ACK, но туда будет включено специально сгенерированное число на основе IP адресов и портов источника и получателя, а также времени посылки пакета. Атакующий никогда не получит эти пакеты, а поэтому и не ответит на них. При нормальном соединении, будет послан третий пакет, содержащий число, а сервер проверит был ли это ответ на SYN cookie и, если да, то разрешит соединение даже в том случае, если в очереди SYN нет соответствующей записи.
Включение механизма SYN cookies является очень простым способом борьбы против атаки SYN флудом. При этом немного больше загружается процессор из-за необходимости создавать и сверять cookie. Так как альтернативным решением является отклонять все запросы на соединение, SYN cookies являются хорошим выбором.
Также нужно увеличить очередь полуоткрытых соединений — tcp_max_syn_backlog (в Debian Lenny по-умолчанию 1024 соединения):
cat /proc/sys/net/ipv4/tcp_max_syn_backlog 1024
Увеличиваем:
echo "20000" > /proc/sys/net/ipv4/tcp_max_syn_backlog
Кроме того, можем уменьшить время ожидания соединения tcp_synack_retries:
cat /proc/sys/net/ipv4/tcp_synack_retries 5
Уменьшаем до 1 (это примерно 9 секунд):
echo "1" > /proc/sys/net/ipv4/tcp_synack_retries
tcp_fin_timeout
cat /proc/sys/net/ipv4/tcp_fin_timeout 60
Меняем на 30:
echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout
tcp_keepalive_probes
cat /proc/sys/net/ipv4/tcp_keepalive_probes 9
Ставим 5:
echo "5" > /proc/sys/net/ipv4/tcp_keepalive_probes
tcp_keepalive_intvl
cat /proc/sys/net/ipv4/tcp_keepalive_intvl 75
Ставим 15:
echo "15" > /proc/sys/net/ipv4/tcp_keepalive_intvl
netdev_max_backlog
Здесь указывается максимальное количество пакетов в очередь на обработку если интерфейс получает пакеты быстрее, чем ядро может их обработать.
cat /proc/sys/net/core/netdev_max_backlog 1000
Увеличиваем:
echo "20000" > /proc/sys/net/core/netdev_max_backlog
somaxconn
Максимальное число открытых сокетов, ждущих соединения.
cat /proc/sys/net/core/somaxconn 1024
Увеличиваем:
echo "20000" > /proc/sys/net/core/somaxconn
Так как подобные изменения параметров ядра не сохранятся после перезагрузки — добавляем в /etc/rc.local
:
echo "20000" > /proc/sys/net/ipv4/tcp_max_syn_backlog echo "1" > /proc/sys/net/ipv4/tcp_synack_retries echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout echo "5" > /proc/sys/net/ipv4/tcp_keepalive_probes echo "15" > /proc/sys/net/ipv4/tcp_keepalive_intvl echo "20000" > /proc/sys/net/core/netdev_max_backlog echo "20000" > /proc/sys/net/core/somaxconn
Кроме того, можно добавить ограничение числа SYN пакетов в единицу времени в iptables:
iptables -N syn_flood iptables -A INPUT -p tcp --syn -j syn_flood iptables -A syn_flood -m limit --limit 500/s --limit-burst 1500 -j RETURN iptables -A syn_flood -j DROP
Число новых SYN пакетов — максимум 500 в секунду, при превышении порога в 1500 — новые пакеты блокируются:
Собственно это одна из мер по защите от DDos атак. Тестировалось на Debian. Помогло. А помогло ли это вам?
Обсуждение