В сети много разных примеров конфигурации ядра Linux для обеспечения большого количества tcp соединений, для высоко-нагруженных веб проектов и противостояния DDoS-атакам. ниже еще один из примеров, реально использующийся на не которых из серверов, которыми я занимаюсь. Стоит отметить, что - это спасение от всего, а лишь часть настройки о которой стоит помнить.
Обычно файл /etc/sysctl.conf - пустой, а если нет. Необходимо добавить в конец файла следующие строки.
Не принимать и не отправлять ICMP-пакеты перенаправления. ICMP-перенаправления могут быть использованы злоумышленником для изменения таблиц маршрутизации. Целесообразно установить значение (нуль). Единица имеет смысл только для хостов, использующихся в качестве маршрутизаторов.
net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.all.send_redirects = 0
Целочисленное значение параметра tcp_max_orphans определяет максимальное число допустимых в системе TCP сокетов, не связанных каким-либо идентификатором пользовательского файла (user file handle). При достижении порогового значения "осиротевшие" (orphan) соединения незамедлительно сбрасываются с выдачей предупреждения. Этот порог помогает предотвращать только простые атаки DDoS. Не следует уменьшать пороговое значение (скорее увеличить его в соответствии с требованиями системы - например, после добавления памяти. Каждое orphan-соединение поглощает около 64 Кбайт не сбрасываемой на диск (unswappable) памяти>.
net.ipv4.tcp_max_orphans = 65536
Параметр tcp_fin_timeout определяет время сохранения сокета в состоянии FIN-WAIT-2 после его закрытия локальной стороной. Партнер может не закрыть это соединение никогда, поэтому следует закрыть его по своей инициативе по истечении тайм-аута. По умолчанию тайм-аут составляет 60 секунд. В ядрах серии 2.2 обычно использовалось значение 180 секунд и вы можете сохранить это значение, но не следует забывать, что на загруженных WEB-серверах вы рискуете израсходовать много памяти на сохранение полуразорванных мертвых соединений. Сокеты в состоянии FIN-WAIT-2 менее опасны, нежели FIN-WAIT-1, поскольку поглощают не более 1.5 Кбайт памяти, но они могут существовать дольше.
net.ipv4.tcp_fin_timeout = 10
tcp_keepalive_time - переменная определяет как часто следует проверять соединение, если оно давно не используется. Значение переменной имеет смысл только для тех сокетов, которые были созданы с флагом SO_KEEPALIVE. Целочисленная переменная tcp_keepalive_intvl определяет интервал передачи проб. Произведение tcp_keepalive_probes * tcp_keepalive_intvl определяет время, по истечении которого соединение будет разорвано при отсутствии откликов. По умолчанию установлен интервал 75 секунд, т.е., время разрыва соединения при отсутствии откликов составит приблизительно 11 минут.
net.ipv4.tcp_keepalive_time = 1800 net.ipv4.tcp_keepalive_intvl = 15 net.ipv4.tcp_keepalive_probes = 5
Целочисленное значение в файле tcp_max_syn_backlog определяет максимальное число запоминаемых запросов на соединение, для которых не было получено подтверждения от подключающегося клиента. Если на сервере возникают перегрузки, можно попытаться увеличить это значение.
net.ipv4.tcp_max_syn_backlog = 4096
Целочисленное значение (1 байт) tcp_synack_retries определяет число попыток повтора передачи пакетов SYNACK для пассивных соединений TCP. Число попыток не должно превышать 255. Значение 5 соответствует приблизительно 180 секундам на выполнение попыток организации соединения.
net.ipv4.tcp_synack_retries = 1
Векторная переменная net.ipv4.tcp_mem определяется тремя значениями (минимум, режим нагрузки, максимум) cодержит общие настройки потребления памяти для протокола TCP. Эта переменная измеряется в страницах (обычно 4Кб), а не байтах.
net.ipv4.tcp_mem = 50576 64768 98152
Векторная переменная net.ipv4.tcp_wmem содержит 3 целых числа (минимум, по умолчанию, максимум), определяющих размер приемного буфера сокетов TCP.
net.ipv4.tcp_wmem = 4096 65536 16777216
Целочисленной значение tcp_orphan_retries определяет число неудачных попыток, после которого уничтожается соединение TCP, закрытое на локальной стороне. По умолчанию используется значение 7, соответствующее приблизительно периоду от 50 секунд до 16 минут в зависимости от RTO. На сильно загруженных веб-серверах имеет смысл уменьшить значение этого параметра, поскольку закрытые соединения могут поглощать достаточно много ресурсов.
net.ipv4.tcp_orphan_retries = 0
Параметр - tcp_syncookies по рекомендациям разработчиков ядра, лучше отключить значение (нуль).
net.ipv4.tcp_syncookies = 0
Максимальное количество соединений для работы механизма connection tracking (используется, например, iptables). При слишком маленьких значениях ядро начинает отвергать входящие подключения с соответствующей записью в системном логе.
net.ipv4.netfilter.ip_conntrack_max = 16777216
Разрешает временные метки протокола TCP. Их наличие позволяет управлять работой протокола в условиях серьезных нагрузок.
net.ipv4.tcp_timestamps = 1
Разрешить выборочные подтверждения протокола TCP. Опция необходима для эффективного использования всей доступной пропускной способности некоторых сетей.
net.ipv4.tcp_sack = 1
Протокол, используемый для управления нагрузкой в сетях TCP. bic и cubic реализации, используемые по умолчанию, содержат баги в большинстве версий ядра RedHat и ее клонов. Рекомендуется использовать параметр htcp.
net.ipv4.tcp_congestion_control = htcp
Не сохранять результаты измерений TCP соединения в кеше при его закрытии. В некоторых случаях помогает повысить производительность.
net.ipv4.tcp_no_metrics_save = 1
Актуально для ядер 2.4. По странной причине в ядрах 2.4, если в рамках TCP сессии произошел повтор передачи с уменьшенным размером окна, все соединения с данным хостом в следующие 10 минут будут иметь именно этот уменьшенный размер окна. Данная настройка позволяет этого избежать.
net.ipv4.route.flush = 1
Активируем защиту от IP-спуфинга.
net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.lo.rp_filter = 1 net.ipv4.conf.eth0.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1
Запрещаем маршрутизацию от источника.
net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.lo.accept_source_route = 0 net.ipv4.conf.eth0.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0
Увеличиваем диапазон локальных портов, доступных для установки исходящих подключений.
net.ipv4.ip_local_port_range = 1024 65535
Разрешаем повторное использование TIME-WAIT сокетов в случаях, если протокол считает это безопасным.
net.ipv4.tcp_tw_reuse = 1
Разрешаем динамическое изменение размера окна TCP стека.
net.ipv4.tcp_window_scaling = 1
Защищаемся от TIME_WAIT атак.
net.ipv4.tcp_rfc1337 = 1
Запрещаем переадресацию пакетов, т.к. это не роутер.
net.ipv4.ip_forward = 0
Не отвечаем на ICMP ECHO запросы, переданные широковещательными пакетами.
net.ipv4.icmp_echo_ignore_broadcasts = 1
Можно вообще не отвечать на ICMP ECHO запросы (сервер не будет пинговаться)
net.ipv4.icmp_echo_ignore_all = 1
Не отвечаем на ошибочно сформированные сообщения
net.ipv4.icmp_ignore_bogus_error_responses = 1
Максимальное число открытых сокетов, ждущих соединения. Имеет смысл увеличить значение по умолчанию.
net.core.somaxconn = 65535
Параметр определяет максимальное количество пакетов в очереди на обработку, если интерфейс получает пакеты быстрее, чем ядро может их обработать.
net.core.netdev_max_backlog = 1000
Размер буфера приема данных по умолчанию для всех соединений.
net.core.rmem_default = 65536
Размер буфера передачи данных по умолчанию для всех соединений.
net.core.wmem_default = 65536
Максимальный размер буфера приема данных для всех соединений.
net.core.rmem_max = 16777216
Максимальный размер буфера передачи данных для всех соединений.
net.core.wmem_max = 16777216
net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.secure_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.tcp_max_orphans = 65536 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_keepalive_time = 1800 net.ipv4.tcp_keepalive_intvl = 15 net.ipv4.tcp_keepalive_probes = 5 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_synack_retries = 1 net.ipv4.tcp_mem = 50576 64768 98152 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 net.ipv4.tcp_orphan_retries = 0 net.ipv4.tcp_syncookies = 0 net.ipv4.netfilter.ip_conntrack_max = 16777216 net.netfilter.nf_conntrack_max = 16777216 net.ipv4.tcp_timestamps = 1 net.ipv4.tcp_sack = 1 net.ipv4.tcp_congestion_control = htcp net.ipv4.tcp_no_metrics_save = 1 net.ipv4.route.flush = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.lo.rp_filter = 1 net.ipv4.conf.eth0.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.lo.accept_source_route = 0 net.ipv4.conf.eth0.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_window_scaling = 1 net.ipv4.tcp_rfc1337 = 1 net.ipv4.ip_forward = 0 net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_echo_ignore_all = 1 net.ipv4.icmp_ignore_bogus_error_responses = 1 net.core.somaxconn = 65535 net.core.netdev_max_backlog = 1000 net.core.rmem_default = 65536 net.core.wmem_default = 65536 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 fs.inotify.max_user_watches = 16777216