====== Настройка ядра Linux для поддержки большего числа соединений ======
Настройка ядра Linux для поддержки большего числа соединений, что обеспечит бесперебойную работу сервера и дополнительную защиту в случае DoS-атак.
Не принимать и не отправлять **ICMP**-пакеты перенаправления. **ICMP**-перенаправления могут быть использованы злоумышленником для изменения таблиц маршрутизации. Целесообразно выставить в «0». Единица имеет смысл только для хостов, использующихся в качестве маршрутизаторов.
|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//) соединения незамедлительно сбрасываются с выдачей предупреждения. Этот порог помогает предотвращать только простые атаки **DoS**. Не следует уменьшать пороговое значение (скорее увеличить его в соответствии с требованиями системы – например, после добавления памяти. Каждое 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
|
Векторная (минимум, режим нагрузки, максимум) переменная в файле ''tcp_mem'' содержит общие настройки потребления памяти для протокола **TCP**. Эта переменная измеряется в страницах (обычно 4Кб), а не байтах.
**Минимум**: пока общий размер памяти для структур протокола **TCP** менее этого количества страниц, операционная система ничего не делает.
**Режим нагрузки**: как только количество страниц памяти, выделенное для работы протокола **TCP**, достигает этого значения, активируется режим работы под нагрузкой, при котором операционная система старается ограничивать выделение памяти. Этот режим сохраняется до тех пор, пока потребление памяти опять не достигнет минимального уровня.
**Максимум**: максимальное количество страниц памяти, разрешенное для всех **TCP** сокетов.
|net.ipv4.tcp_mem = "50576 64768 98152"
|
Векторная (минимум, по умолчанию, максимум) переменная в файле ''tcp_rmem'' содержит 3 целых числа, определяющих размер приемного буфера сокетов **TCP**.
**Минимум**: каждый сокет **TCP** имеет право использовать эту память по факту своего создания. Возможность использования такого буфера гарантируется даже при достижении порога ограничения (moderate memory pressure). Размер минимального буфера по умолчанию составляет 8 Кбайт (8192).
**Значение по умолчанию**: количество памяти, допустимое для буфера передачи сокета **TCP** по умолчанию. Это значение применяется взамен параметра ''/proc/sys/net/core/rmem_default'', используемого другими протоколами. Значение используемого по умолчанию буфера обычно (по умолчанию) составляет 87830 байт. Это определяет размер окна 65535 с заданным по умолчанию значением ''tcp_adv_win_scale'' и ''tcp_app_win = 0'', несколько меньший, нежели определяет принятое по умолчанию значение ''tcp_app_win''.
**Максимум**: максимальный размер буфера, который может быть автоматически выделен для приема сокету **TCP**. Это значение не отменяет максимума, заданного в файле ''/proc/sys/net/core/rmem_max''. При “статическом” выделении памяти с помощью ''SO_RCVBUF'' этот параметр не имеет значения.
|net.ipv4.tcp_rmem = "4096 87380 16777216"
|
Векторная переменная в файле ''tcp_wmem'' содержит 3 целочисленных значения, определяющих минимальное, принятое по умолчанию и максимальное количество памяти, резервируемой для буферов передачи сокета **TCP**.
**Минимум**: каждый сокет **TCP** имеет право использовать эту память по факту своего создания. Размер минимального буфера по умолчанию составляет 4 Кбайт (4096)
**Значение по умолчанию**: количество памяти, допустимое для буфера передачи сокета **TCP** по умолчанию. Это значение применяется взамен параметра ''/proc/sys/net/core/wmem_default'', используемого другими протоколами и обычно меньше, чем ''/proc/sys/net/core/wmem_default''. Размер принятого по умолчанию буфера обычно (по умолчанию) составляет 16 Кбайт (16384)
**Максимум**: максимальное количество памяти, которое может быть автоматически выделено для буфера передачи сокета **TCP**. Это значение не отменяет максимум, заданный в файле ''/proc/sys/net/core/wmem_max''. При “статическом” выделении памяти с помощью ''SO_SNDBUF'' этот параметр не имеет значения.
|net.ipv4.tcp_wmem = "4096 65536 16777216"
|
Целочисленной значение ''tcp_orphan_retries'' определяет число неудачных попыток, после которого уничтожается соединение **TCP**, закрытое на локальной стороне. По умолчанию используется значение 7, соответствующее приблизительно периоду от 50 секунд до 16 минут в зависимости от **RTO**. На сильно загруженных **WEB**-серверах имеет смысл уменьшить значение этого параметра, поскольку закрытые соединения могут поглощать достаточно много ресурсов.
|net.ipv4.tcp_orphan_retries = 0
|
Согласно [[https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt|рекомендациям разработчиков ядра]], этот режим лучше отключить.
|net.ipv4.tcp_syncookies = 0
|
Максимальное количество соединений для работы механизма ''connection tracking'' (используется, например, //iptables//). При слишком маленьких значениях ядро начинает отвергать входящие подключения с соответствующей записью в системном логе.
|net.ipv4.netfilter.ip_conntrack_max = 1048576
|
Разрешает [[https://www.ietf.org/rfc/rfc1323.txt|временные метки протокола TCP]]. Их наличие позволяет управлять работой протокола в условиях серьезных нагрузок (см. ''tcp_congestion_control'').
|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
|
Максимальное число открытых сокетов, ждущих соединения. Имеет смысл увеличить значение по умолчанию, для высоко-нагруженных серверов советуют значения в районе 15000-20000.
|net.core.somaxconn = 15000
|
Параметр определяет максимальное количество пакетов в очереди на обработку, если интерфейс получает пакеты быстрее, чем ядро может их обработать.
|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
|