Когда я только начинала разворачивать свои первые 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 могут работать некорректно.