sysctl (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
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
[
устаревшая ссылка
2024-11-06 ⓘ]
сообщает, что он не является официальным продуктом 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