Network Stack - GNU/Linux Tune (sysctl)

Transmission Control Protocol (TCP, протокол управления передачей) — один из основных протоколов передачи данных интернета (Network).

По умолчанию сетевой стек (Network Stack) Linux не настроен для высокоскоростной передачи больших файлов через WAN соединения. Это сделано для экономии ресурсов памяти. Вы можете легко настроить сетевой стек Linux, увеличив размер сетевых буферов для высокоскоростных сетей, которые соединяют серверные системы для обработки большего количества сетевых пакетов. Перед изменениями следует понимать, что и зачем вы делаете. Слепое копирование настроек (sysctl), не рекомендуется. База Arch Linux, для подробного анализа работы с sysctl, прочтите Wiki.

По умолчанию максимальный размер буфера Linux TCP слишком мал. Память TCP вычисляется автоматически на основе системной памяти; фактические значения можно найти, набрав следующие команды:

$ cat /proc/sys/net/ipv4/tcp_mem

Стандартный и максимальный объем памяти:

$ cat /proc/sys/net/core/rmem_default

$ cat /proc/sys/net/core/rmem_max

Максимальный объем памяти сокета для отправки:

$ cat /proc/sys/net/core/wmem_default

$ cat /proc/sys/net/core/wmem_max

Максимальное количество буфера опционной памяти:

$ cat /proc/sys/net/core/optmem_max

Значения rmem_max и wmem_max по умолчанию составляют около 128 КБ в большинстве дистрибутивов Linux, что может быть достаточно для низколатентного сетевого окружения общего назначения или для таких приложений, как DNS / Web-сервер. Однако, если латентность велика, размер по умолчанию может быть слишком мал. Пожалуйста, обратите внимание, что следующие настройки увеличат использование памяти на вашем сервере (ПК).

Не принимать и не отправлять 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Кб), а не байтах.

  1. Минимум: пока общий размер памяти для структур протокола TCP менее этого количества страниц, операционная система ничего не делает.
  2. Режим нагрузки: как только количество страниц памяти, выделенное для работы протокола TCP, достигает этого значения, активируется режим работы под нагрузкой, при котором операционная система старается ограничивать выделение памяти. Этот режим сохраняется до тех пор, пока потребление памяти опять не достигнет минимального уровня.
  3. Максимум: максимальное количество страниц памяти, разрешенное для всех TCP сокетов.
net.ipv4.tcp_mem = 50576   64768   98152

Векторная переменная net.ipv4.tcp_wmem содержит 3 целых числа (минимум, по умолчанию, максимум), определяющих размер приемного буфера сокетов TCP.

  1. Минимум: каждый сокет TCP имеет право использовать эту память по факту своего создания. Возможность использования такого буфера гарантируется даже при достижении порога ограничения (moderate memory pressure). Размер минимального буфера по умолчанию составляет 8 Кбайт (8192).
  2. Значение по умолчанию: количество памяти, допустимое для буфера передачи сокета TCP по умолчанию. Это значение применяется взамен параметра /proc/sys/net/core/rmem_default, используемого другими протоколами. Значение используемого по умолчанию буфера обычно (по умолчанию) составляет 87830 байт. Это определяет размер окна 65535 с заданным по умолчанию значением tcp_adv_win_scale и tcp_app_win = 0, несколько меньший, нежели определяет принятое по умолчанию значение tcp_app_win.
  3. Максимум: максимальный размер буфера, который может быть автоматически выделен для приема сокету TCP. Это значение не отменяет максимума, заданного в файле /proc/sys/net/core/rmem_max. При "статическом" выделении памяти с помощью SO_RCVBUF этот параметр не имеет значения.
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

Активируем защиту от 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

Реализации TCP обычно встроены в ядра ОС. Существуют реализации TCP, работающие в пространстве пользователя.