sysctl (Русский) - ArchWiki

Jump to content
From ArchWiki

Состояние перевода: На этой странице представлен перевод статьи sysctl. Дата последней синхронизации: 22 апреля 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

sysctl — утилита, предназначенная для управления параметрами ядра на лету (пакет procps-ng из официальных репозиториев). sysctl реализован как часть procfs — виртуальной файловой системы, которую обычно монтируют в `/proc/`.

## Настройка

Примечание: Начиная с версии 207 и 21x, systemd применяет только настройки из `/etc/sysctl.d/*.conf` и `/usr/lib/sysctl.d/*.conf`. Если у вас был файл `/etc/sysctl.conf`, нужно переименовать его в `/etc/sysctl.d/99-sysctl.conf`. Если у вас был, например, `/etc/sysctl.d/foo`, нужно переименовать его в `/etc/sysctl.d/foo.conf`.

Файл настроек sysctl может быть создан в `/etc/sysctl.d/99-sysctl.conf`. Для systemd, `/etc/sysctl.d/` и `/usr/lib/sysctl.d/` являются drop-in каталогами для sysctl-параметров ядра. Именование и исходный каталог определяют порядок обработки; параметры, обрабатываемые позже, могут отменить предыдущие параметры. Например, параметры из файла `/usr/lib/sysctl.d/50-default.conf` будут переопределены параметрами с теми же именами из `/etc/sysctl.d/50-default.conf` и любом файле, обработанном позже из обоих каталогов.

Чтобы вручную загрузить параметры из всех файлов, выполните команду:

    # sysctl --system

которая также выведет применённую иерархию. Можно указать параметр для явной загрузки только одного файла:

    # sysctl --load=файл.conf

Дополнительная информация доступна в sysctl.d(5) и the new configuration files.

Доступные для изменения параметры представлены в каталоге `/proc/sys/`. Например, параметр `kernel.sysrq` соответствует файлу `/proc/sys/kernel/sysrq` в файловой системе. Команда `sysctl --all` отобразит значения всех доступных параметров.

Примечание: Если у вас установлена документация ядра (linux-docs), вы можете найти подробную информацию о настройках sysctl в `/usr/lib/modules/$(uname -r)/build/Documentation/admin-guide/sysctl/`. Ссылка на онлайн-версию содержится в разделе #Смотрите также этой статьи. Настоятельно рекомендуется прочитать её перед изменением настроек sysctl.

Настройки можно изменить путём редактирования файлов напрямую или вызова утилиты `sysctl`. Например, чтобы временно включить magic SysRq key:

    # sysctl kernel.sysrq=1

илт:

    # echo "1" > /proc/sys/kernel/sysrq

Подробности о `kernel.sysrq` доступны в документации ядра.

Чтобы сделать изменения постоянными, добавьте или измените соответствующие строки в `/etc/sysctl.d/99-sysctl.conf` или другом подходящем файле в каталоге `/etc/sysctl.d/`.

Совет: Некоторые параметры зависят от модулей ядра. Например, параметры в `/proc/sys/net/bridge/*` зависят от модуля `br_netfilter`. Если он не загружен, изменения этих параметров будут проигнорированы. Смотрите статью Модули ядра.

## Безопасность

Смотрите Безопасность#Ядро, а также следующие разделы в данной статье.

## Сеть

### Увеличение производительности

#### Увеличение длины очереди входящих пакетов

После получения пакетов из кольцевого буфера сетевой карты они помещаются в специальную очередь в ядре.

При использовании высокоскоростных сетевых карт увеличение размера очереди может помочь предотвратить потерю пакетов:

    net.core.netdev_max_backlog = 16384

Примечание: В приложениях реального времени, таких как SIP-маршрутизаторы, этот вариант требует высокой скорости процессора, иначе данные в очереди будут устаревшими.

#### Увеличение максимального числа ожидающих соединений

Максимальное число входящих соединений, ожидающих приёма (accept) программой, на одном сокете:

    net.core.somaxconn = 8192

Примечание: Начиная с Linux 5.4, по умолчанию используется значение 4096.[1]
Важно: Увеличение этого значения имеет смысл только на высоконагруженных серверах и может привести как к низкой скорости обработки (например, в случае однопоточного блокирующего сервера), так и к недостаточному количеству рабочих потоков/процессов [2].

#### Включение TCP Fast Open

TCP Fast Open — это расширение протокола управления передачей (TCP), которое помогает уменьшить задержки в сети, позволяя начать передачу данных сразу при отправке клиентом первого TCP SYN [3]. Значение `3` вместо стандартного `1` включит TCP Fast Open как для входящих, так и для исходящих соединений:

    net.ipv4.tcp_fastopen = 3

#### Настройка обработки ожидающих соединений

`tcp_max_syn_backlog` задаёт максимальную длину очереди соединений в состоянии 'Waiting Acknowledgment'.

В случае DoS-атаки synflood эта очередь может быстро заполниться, и в этот момент сработает TCP SYN cookies, позволяя вашей системе продолжать отвечать на легитимный трафик и позволяя вам получить доступ к блокировке вредоносных IP.

Если сервер страдает от перегрузок в пиковое время, можно попробовать немного увеличить это значение:

    net.ipv4.tcp_max_syn_backlog = 8192

`tcp_max_tw_buckets` — максимальное число сокетов в состоянии TIME_WAIT.

После достижения этого числа система начнёт уничтожать сокеты, находящиеся в этом состоянии.

Увеличение этого значения может помочь от простых DoS-атак:

    net.ipv4.tcp_max_tw_buckets = 2000000

`tcp_tw_reuse` задаёт, должен ли TCP повторно использовать существующее соединение в состоянии TIME-WAIT для нового исходящего соединения, если новая временная метка строго больше самой последней временной метки, записанной для предыдущего соединения.

Это помогает избежать исчерпания доступных сетевых сокетов:

    net.ipv4.tcp_tw_reuse = 1

Указывает, сколько секунд нужно ждать последнего FIN-пакета, прежде чем сокет будет принудительно закрыт. Это является нарушением спецификации TCP, но необходимо для предотвращения DoS-атак. В Linux 2.2 значение по умолчанию было 180 [4]:

    net.ipv4.tcp_fin_timeout = 10

`tcp_slow_start_after_idle`, будучи включенным, сбрасывает размер окна по умолчанию в долгоживущих TCP-соединениях, которые длительное время не использовались.

Отключение этой опции приведёт к тому, что размер окна по умолчанию будет применяться только для новых соединений, что может улучшить производительность долгоживущих соединений:

    net.ipv4.tcp_slow_start_after_idle = 0

#### Изменение параметров TCP keepalive

TCP keepalive — механизм TCP-соединений, который помогает определить потерю связи с другой стороной. TCP посылает запрос keepalive, содержащий нулевые данные, несколько раз после неактивности. Если другая сторона не отвечает, сокет автоматически закрывается. По умолчанию процесс TCP keepalive ожидает активности сокета в течение двух часов (7200 секунд) перед отправкой первого запроса keepalive, а затем повторно отправляет его каждые 75 секунд. Пока связь между сокетами TCP/IP продолжается и активна, пакеты keepalive не нужны.

Примечание: При следующих настройках ваше приложение будет обнаруживать мёртвые TCP-соединения через 120 секунд (60с + 10с + 10с + 10с + 10с + 10с + 10с).

    net.ipv4.tcp_keepalive_time = 60
    net.ipv4.tcp_keepalive_intvl = 10
    net.ipv4.tcp_keepalive_probes = 6

#### Включение MTU probing

Чем больше maximum transmission unit (MTU), тем выше производительность, но хуже надёжность.

Это связано с тем, что потерянный пакет означает необходимость повторной передачи большего количества данных, а также с тем, что многие маршрутизаторы в интернете не могут передавать очень длинные пакеты:

    net.ipv4.tcp_mtu_probing = 1

Смотрите https://blog.cloudflare.com/path-mtu-discovery-in-practice/ для более подробной информации.

#### TCP timestamps

Важно: TCP timestamps защищают от переполнения порядковых номеров (на гигабитных скоростях) и позволяют вычислять время передачи пакетов. Отключать их не рекомендуется, так как это считается риском для безопасности [5].

Отключение генерации временных меток в TCP-пакетах уменьшит пики и может дать прирост производительности в гигабитных сетях:

    net.ipv4.tcp_timestamps = 0

#### Включение BBR

Алгоритм управления перегрузками BBR может помочь достичь более высокой пропускной способности и более низких задержек для интернет-трафика. Сначала загрузите модуль `tcp_bbr`.

Примечание: Страница BBR на GitHub сообщает, что он не является официальным продуктом Google.

    net.core.default_qdisc = cake
    net.ipv4.tcp_congestion_control = bbr

#### Увеличение диапазона динамических портов

Динамические (эфемерные) порты обычно используются в протоколах TCP, UDP и SCTP. Когда клиентское приложение не запрашивает привязку сокета к какому-то конкретному порту, система выдаёт ему произвольный порт из определённого диапазона. В некоторых специфических ситуациях размер этого диапазона может влиять на производительность установки соединения.

    net.ipv4.ip_local_port_range = 30000 65535

### Защита стека TCP/IP

Ниже приведён набор параметров для усиления сетевой безопасности ядра для протокола IPv4 и соответствующие параметры IPv6, если существует эквивалент.

Для некоторых сценариев использования, например, при использовании системы в качестве маршрутизатора, могут быть полезны или необходимы и другие параметры.

#### Защита TCP SYN cookie

Помогает защититься от атак SYN flood. Срабатывает только при достижении значения `net.ipv4.tcp_max_syn_backlog`. Более подробную информацию можно найти, например, в [6]. Начиная с linux 5.10, это включено по умолчанию.

    net.ipv4.tcp_syncookies = 1

#### TCP rfc1337

Защита от tcp time-wait assassination hazards, отбрасывание RST-пакетов для сокетов в состоянии time-wait. За пределами Linux поддерживается не очень широко, но соответствует RFC:

    net.ipv4.tcp_rfc1337 = 1

#### Reverse path filtering

При включении reverse path filtering ядро будет проверять источник пакетов, полученных со всех интерфейсов машины. Это может защитить от злоумышленников, которые используют методы подмены IP-адресов для нанесения вреда.

По умолчанию стоит значение 0 (без проверки), но systemd поставляет `/usr/lib/sysctl.d/50-default.conf`, который устанавливает `net.ipv4.conf.all.rp_filter` в значение `2` (loose mode)[7].

Включение строгого режима:

    net.ipv4.conf.default.rp_filter = 1
    net.ipv4.conf.all.rp_filter = 1

Взаимосвязь и поведение `net.ipv4.conf.default.*`, `net.ipv4.conf.interface.*` и `net.ipv4.conf.all.*` описаны в ip-sysctl.html.

#### Журналирование марсианских пакетов

Марсианский пакет (martian packet) — это IP-пакет, который содержит адрес источника или получателя, зарезервированный IANA для специального использования (смотрите Reserved IP addresses).

Часто марсианские и немаршрутизируемые пакеты могут быть использованы в опасных целях. Запись этих пакетов в журнал для последующей проверки может быть полезной [8]:

    net.ipv4.conf.default.log_martians = 1
    net.ipv4.conf.all.log_martians = 1

Примечание: Это может заполнить ваши журналы большим количеством информации, поэтому рекомендуется включать эту функцию только для тестирования.

#### Отключение перенаправлений ICMP

ICMP-пакеты типа 5 (Redirect) помогают оптимизировать маршрутизацию, однако из-за того, что они могут быть легко подделаны злоумышленником, они считаются проблемой безопасности и их лучше отключить. Подробнее об этом можно почитать здесь: What are ICMP redirects? Should they be blocked?

Отключение приёма перенаправлений ICMP:

    net.ipv4.conf.all.accept_redirects = 0
    net.ipv4.conf.default.accept_redirects = 0
    net.ipv4.conf.all.secure_redirects = 0
    net.ipv4.conf.default.secure_redirects = 0
    net.ipv6.conf.all.accept_redirects = 0
    net.ipv6.conf.default.accept_redirects = 0

Отключение отправки перенаправлений ICMP на устройствах, не являющихся маршрутизаторами:

    net.ipv4.conf.all.send_redirects = 0
    net.ipv4.conf.default.send_redirects = 0

#### Игнорирование эхо-запросов ICMP

Чтобы система не отвечала на пинги:

    net.ipv4.icmp_echo_ignore_all = 1
    net.ipv6.icmp.echo_ignore_all = 1

Примечание: Имейте в виду, что это может нарушить работу инструментов мониторинга, которые полагаются на эхо-запросы ICMP.

## Виртуальная память

Есть несколько ключевых параметров для настройки работы подсистемы виртуальной памяти ядра Linux и записи изменённых (dirty) данных на диск. Подробности в документации ядра Например:

- `vm.dirty_ratio = 10`

  Указывает (в процентах от общего объёма доступной памяти, содержащей свободные и восстанавливаемые (reclaimable) страницы) количество страниц, при достижении которого выполняющий запись процесс сам начнёт записывать изменённые данные из памяти на диск.

- `vm.dirty_background_ratio = 5`

  Указывает (в процентах от общего объёма доступной памяти, содержащей свободные и восстанавливаемые (reclaimable) страницы) количество страниц, при достижении которого фоновые потоки для записи данных в ядре начнут записывать изменённые данные из памяти на диск.

Как отмечено в комментариях к параметрам, при установке этих значений необходимо учитывать общий объём оперативной памяти. Например, упрощая, можно взять установленную системную оперативную память вместо доступной памяти:

Важно:

- Бо́льшие значения могут повысить производительность, но при этом повышается риск потери данных.
- Установка этого значения в `0` может привести к увеличению задержки на дисках и подвисаниям.

Смотрите https://lonesysadmin.net/2013/12/22/better-linux-disk-caching-performance-vm-dirty_ratio/ для более подробной информации.

- Согласно общепринятому мнению, установка `vm.dirty_ratio` на 10% от ОЗУ является разумным значением, если ОЗУ составляет, скажем, 1 ГБ (поэтому 10% — это 100 МБ). Но если машина имеет гораздо больше ОЗУ, скажем, 16 ГБ (10% — это 1.6 ГБ), этот процент оказывается непропропорционально большим, поскольку он превратится в несколько секунд записи на вращающиеся диски. Более разумным значением в этом случае может быть `3` (3% от 16 ГБ — это примерно 491 МБ).
- Аналогично, установка `vm.dirty_background_ratio` на значение `5` может быть подходящим вариантом для небольших объёмов памяти, но опять же, учитывайте и настраивайте в соответствии с объёмом памяти конкретной системы.

### Кэш VFS

Уменьшение значения параметра кэша virtual file system (VFS) может улучшить отзывчивость системы:

- `vm.vfs_cache_pressure = 50`

  Он контролирует память, которая используется ядром для кэширования объектов каталогов и inode (кэш VFS). Уменьшение этого значения по сравнению со значением по умолчанию 100 делает ядро менее склонным к использованию кэша VFS (не устанавливайте его в 0, это может привести к состоянию out-of-memory).

## MDADM

Смотрите RAID#Change sync speed limits.

## Решение проблем

### Периодические маленькие подвисания системы

Попробуйте поставить максимальный объём изменённых в памяти данных (dirty bytes) поменьше (в данном примере 4 МиБ):

    vm.dirty_background_bytes = 4194304
    vm.dirty_bytes = 4194304

Примечание: Параметры `dirty_background_bytes` и `dirty_bytes` являются аналогами параметров `dirty_background_ratio` и `dirty_ratio` (описанных в разделе #Виртуальная память). Одновременно может быть указан только один из наборов параметров: или bytes, или ratio.

## Смотрите также

- sysctl(8) и sysctl.conf(5)
- Документация ядра: /proc/sys/
- Документация ядра: IP Sysctl
- Kernel network parameters for sysctl
- sysctl-explorer.net – инициатива по облегчению доступа к справочной документации по sysctl в Linux
- Disable Source Routing - Red Hat Customer Portal
- SUSE handbook about Security Features in the Kernel

Categories:

- Kernel (Русский)
- Commands (Русский)