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