Проверка и настройка sysctl: производительность и безопасность

ГлавнаяПроверка и настройка sysctl: производительность и безопасность

Содержание

Когда я только начинала разворачивать свои первые VPS, честно говоря, файл

/etc/sysctl.conf
вообще не входил в мою зону внимания. Ну работает и ладно, не трогаем. Но однажды после очередной нагрузки база начала вести себя странно — тормозила на ровном месте, а сеть будто «захлёбывалась». Тогда один знакомый админ мимоходом спросил: «Ты
sysctl
вообще трогала?» И вот с того момента у меня началась целая история — не просто трогала, а научилась использовать
sysctl
как инструмент тонкой настройки ядра Linux. Сейчас расскажу, как и зачем его настраивать, и на что он влияет.


Что такое sysctl?

sysctl
— это утилита в Linux, которая позволяет управлять параметрами ядра ОС в реальном времени. Она работает с так называемыми sysctl-переменными, которые определяют поведение сетевых стеков, управления памятью, безопасности и многого другого.

Значения переменных можно увидеть и поменять на лету. Это особенно важно, когда ты хочешь оптимизировать сервер под свою задачу — будь то высоконагруженный API, VPN-туннель или просто безопасный SSH-доступ.


Где живут параметры sysctl?

Основной файл конфигурации — это:

/etc/sysctl.conf

Также система может загружать параметры из:

/etc/sysctl.d/*.conf

А если хочется что-то быстро протестировать:

sudo sysctl -w net.ipv4.ip_forward=1

Этот параметр включит маршрутизацию между интерфейсами, и сразу же, без ребута. Но после перезагрузки он слетит, если не прописать его в

sysctl.conf
.


Почему важно настраивать sysctl?

Настройки ядра напрямую влияют на:

  • пропускную способность сети (
    net.core.rmem_max
    ,
    net.core.wmem_max
    );
  • безопасность (
    net.ipv4.conf.all.accept_source_route
    ,
    kernel.kptr_restrict
    );
  • стабильность при DDoS-атаках (
    net.ipv4.tcp_syncookies
    );
  • работу NAT и VPN (
    net.ipv4.ip_forward
    );
  • поведение TCP-соединений (
    net.ipv4.tcp_fin_timeout
    ,
    net.ipv4.tcp_tw_reuse
    ).

Если ты работаешь с VPS и держишь, например, свой VPN-сервер, или пробрасываешь трафик через туннель, тебе обязательно нужно зайти в

sysctl
и вычистить то, что ставится по умолчанию, особенно на дистрибутивах вроде Ubuntu Server 22.04 — там половина параметров просто отключены или устарели.


Проверка текущих значений

Чтобы посмотреть текущее значение переменной, вводим:

sysctl net.ipv4.tcp_syncookies

А если хотим посмотреть всё, что связано с TCP:

sysctl -a | grep tcp

Можно быстро выгрузить все параметры и сохранить:

sysctl -a > sysctl-before.txt

Очень удобно сравнивать с «после».


Пример настроек для повышения безопасности и производительности

Вот пример, который я использую на одном из своих публичных серверов (где работает WireGuard и DNS over HTTPS):

# Сеть net.ipv4.ip_forward = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.all.log_martians = 1 # TCP оптимизация net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_window_scaling = 1 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 # Защита kernel.kptr_restrict = 2 fs.protected_symlinks = 1 fs.protected_hardlinks = 1

После внесения изменений применяю:

sudo sysctl -p

Если всё ок — сразу чувствуешь прирост в стабильности, особенно на активных соединениях.


Настройка под WireGuard, VPN и маршрутизацию

Если вы используете WireGuard VPN на VPS, не забудьте включить IP-переадресацию:

net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding = 1

Без этого туннель просто не будет маршрутизировать трафик.


Файл
/etc/sysctl.conf
vs
sysctl -w

Важно понимать:

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

sudo nano /etc/sysctl.conf

Потом сохраняем и:

sudo sysctl -p

Личный опыт

На одном из проектов, где мы держим mini-K3s кластер на VPS для микросервисов, неправильно выставленный

tcp_tw_reuse
вызывал перегрузку порта, и из-за этого приходили таймауты в самом API. Я бы и не подумала на
sysctl
, если бы не случайный диалог с DevOps в чате, где он бросил ссылку: «А ты порт TIME_WAIT не чистишь случайно?» — оказалось, да, и плохо.

С тех пор я внимательно отслеживаю любые изменения в

sysctl.conf
, особенно перед выкладкой чего-то на прод.


Отдельно про

net.ipv4.tcp_syncookies

Это буквально спасение от SYN-флуд атак. Если у вас открыт порт (например, веб или SSH), включите это:

net.ipv4.tcp_syncookies = 1

Сервер будет корректно обрабатывать фальшивые соединения, не тратя память.


Частые ошибки

  • Ошибка: поставили
    ip_forward = 1
    , но не применили
    sysctl -p
    . → Не работает VPN.
  • Ошибка: добавили
    tcp_tw_reuse
    , но не проверили
    tcp_fin_timeout
    . → Порты забиваются.
  • Ошибка: изменили параметр через
    sysctl -w
    , но забыли сохранить в файл. → После ребута всё пропало.

Итого в сухом остатке

sysctl
— это не что-то для «очень умных DevOps». Это просто мощный инструмент для настройки своего VPS под конкретную задачу. И да, он может пугать, особенно когда не знаешь, что за
net.ipv4.conf.default.rp_filter
, но шаг за шагом можно выстроить конфигурацию, которая не только быстрее работает, но и безопаснее.

Если вы держите сервер под VPN, прокси, git или просто под веб-приложение — настройте

sysctl
. Даже базовые параметры уже дадут плюс в стабильности. А главное — это бесплатно и под полным контролем.


Чек-лист
sysctl
по задачам

VPN-сервер (WireGuard/OpenVPN/IPSec)

net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.all.send_redirects = 0

Обязательно проверяй: работает ли маршрут и пробрасывается ли NAT.


Web-сервер (Nginx/Apache/Node.js)

net.core.somaxconn = 65535 net.ipv4.tcp_max_syn_backlog = 4096 net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_fin_timeout = 15 net.ipv4.tcp_tw_reuse = 1

Сильно повышает отказоустойчивость под нагрузкой и при DDoS.


Git-сервер (Gitea, GitBucket, bare repo)

fs.inotify.max_user_watches = 1048576 fs.file-max = 2097152 net.ipv4.tcp_keepalive_time = 600 net.ipv4.tcp_keepalive_intvl = 60 net.ipv4.tcp_keepalive_probes = 10

Важно для большого количества одновременных соединений и операций git push/pull.


Monitoring & Logging (Zabbix, ELK, Prometheus)

vm.max_map_count = 262144 fs.file-max = 2097152 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216

Обязательные параметры, если используешь Elasticsearch или Logstash.


Kubernetes / K3s / Контейнеры

net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 vm.overcommit_memory = 1

Без этого K3s и kube-proxy могут работать некорректно.

Забирай бонус

Миграция бесплатна, а за оплату года — ещё месяц сверху.

Месяц в подарок
COPIED
NEWCOMM COPIED