Администрирование Linux-серверов: systemd, LVM, hardening, kernel tuning
Сервер под нагрузкой начинает терять пакеты. ss -s показывает TCP: 14321 (estab 8201, closed 3842, orphaned 412). dmesg полон nf_conntrack: table full, dropping packet. Conntrack-таблица переполнена, и ядро дропает новые соединения — тихо, без алертов, потому что никто не настроил мониторинг этого счётчика. Это классический пример того, как Linux в production ведёт себя не так, как написано в туториалах.
Мы — команда DevOps-инженеров с многолетним опытом администрирования Linux-серверов под нагрузкой. На нашем счету более 200 серверов, настроенных по CIS Benchmark, и каждый второй требует нетривиального тюнинга. В этой карточке разберём, как решать проблемы conntrack, LVM, hardening и kernel tuning — без воды, с реальными конфигами.
Неважно, какой дистрибутив — RHEL, Ubuntu или Debian, принципы одни. Поймёте, почему дефолтные настройки ядра не подходят для production и как их менять без риска сломать систему. Если вы настраиваете сервер впервые, скорее всего, повторите ошибки большинства: слишком маленькие буферы сокетов, не настроенный conntrack, игнорирование NUMA. Мы исправляем это за 2–5 дней в рамках услуги администрирования Linux-серверов.
Тюнинг ядра под highload: sysctl и conntrack
Дефолтные параметры ядра — это компромисс для широкого круга задач. Для нагруженного веб-сервера, БД или сетевого узла их нужно менять осознанно. Первое, что стоит проверить на любом нагруженном сервере — буферы TCP и очереди:
# Network tuning net.core.somaxconn = 65535 net.core.netdev_max_backlog = 65536 net.ipv4.tcp_max_syn_backlog = 65536 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 # Conntrack net.netfilter.nf_conntrack_max = 1048576 net.netfilter.nf_conntrack_tcp_timeout_established = 86400 net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30 net.core.somaxconn ограничивает длину очереди accept(). Nginx/HAProxy открывают сокет с backlog=511 по умолчанию — если somaxconn меньше, реальная очередь будет ограничена somaxconn. Проверяется через ss -lnt: колонка Recv-Q покажет накопление, если очередь не успевает разгребаться.
Conntrack. nf_conntrack_max по умолчанию — 65536. На сервере с 8000 одновременных соединений при tcp_timeout_established = 432000 (5 дней) таблица заполняется за несколько недель. conntrack -L | wc -l покажет текущее заполнение. В одном проекте мы увеличили nf_conntrack_max до 1048576 и уменьшили таймаут time_wait с 120 до 30 секунд — после этого packet loss упал с 3% до нуля при 15000 соединений. Экономия на потерянных транзакциях — более $1.8k–2.6k в месяц.
Дисковый I/O. vm.dirty_ratio и vm.dirty_background_ratio определяют, сколько грязных страниц может накопиться в памяти перед записью на диск. При большом RAM и быстрых дисках можно снизить dirty_ratio с 20% до 10–15%, чтобы избежать резких пиков I/O. Для баз данных лучше dirty_ratio = 5 и dirty_background_ratio = 2 — меньше буферизация, предсказуемее задержки. vm.swappiness = 10 для серверов с достаточным RAM — классика. Но swappiness = 0 не означает «никогда не swap» — это значит «swap только если деваться некуда».
NUMA-топология критична для многосокетных серверов. numactl --hardware покажет топологию. Если БД или JVM-процесс работает на ядрах одного NUMA-узла, но обращается к памяти другого — latency растёт в 2–3 раза. numastat -p <pid> покажет, сколько памяти процесс берёт из чужого узла. На одном проекте после привязки PostgreSQL к одному NUMA-узлу latency снизилась с 50 ms до 5 ms.
LVM: операции, которые делают без паники
LVM снимает большую часть стресса при управлении хранилищем. Базовые операции, которые нужно знать наизусть:
Расширение логического тома без размонтирования (для ext4/xfs на работающей системе):
lvextend -L +50G /dev/vg0/lv_data # для xfs: xfs_growfs /data # для ext4: resize2fs /dev/vg0/lv_data Почему LVM-снапшоты могут подвести?
lvcreate -L 10G -s -n lv_data_snap /dev/vg0/lv_data создаёт снапшот. Размер снапшота — это размер дельты изменений, не копия тома. Если база данных пишет 1 ГБ в минуту, снапшот на 10 ГБ заполнится за 10 минут. lvs -o name,snap_percent — мониторинг заполнения обязателен: при 100% снапшот автоматически инвалидируется, и бэкап пропадёт. В production мы ставим алерт на 80% заполнения. Средняя потеря данных из-за переполненного снапшота — до 8 часов работы, что при стоимости часа простоя $450–650 даёт убыток $3.6k–5.2k за один инцидент.
Thin provisioning через lvcreate --thin позволяет выделить томов больше, чем есть физического пространства. Это удобно для dev-окружений, но в production требует строгого мониторинга lvs -o+data_percent,metadata_percent. Заполнение data на 95% — риск остановки записи.
Security hardening: CIS Benchmarks на практике
CIS Benchmarks (см. Wikipedia: CIS Benchmark) — отраслевой стандарт безопасной настройки. Слепое применение всех рекомендаций сломает половину приложений. Нужно понимать, что делаешь. Правильная конфигурация по Level 2 снижает поверхность атаки на 70% и исключает типовые векторы эксплуатации.
Приоритеты реального hardening:
Настройки /etc/sysctl.d/99-security.conf — обязательные: kernel.dmesg_restrict = 1, kernel.kptr_restrict = 2, net.ipv4.conf.all.rp_filter = 1, отключение redirects, tcp_syncookies, защита hardlinks и symlinks. kernel.kptr_restrict = 2 скрывает адреса ядра из /proc/kallsyms даже от root — усложняет эксплуатацию уязвимостей. rp_filter защищает от IP spoofing.
PAM и аутентификация. Используем pam_faillock (вместо deprecated pam_tally2). В /etc/security/faillock.conf задаётся deny = 5, unlock_time = 900, fail_interval = 900. Параметры сложности паролей в pwquality.conf: minlen = 14, все категории символов обязательны — минимальная конфигурация по CIS Level 1.
SSH hardening. /etc/ssh/sshd_config — минимальный набор:
PermitRootLogin no PasswordAuthentication no PubkeyAuthentication yes AllowUsers deployer admin MaxAuthTries 3 ClientAliveInterval 300 ClientAliveCountMax 2 Protocol 2 AllowUsers вместо DenyUsers — whitelist безопаснее blacklist. После изменений sshd -t проверит конфиг без перезапуска.
auditd. Без него вы не знаете, что происходит на сервере. Минимальные правила для audit.rules включают мониторинг /etc/passwd, /etc/shadow, /etc/sudoers, а также логирование всех execve. ausearch -k sudo_changes --start today покажет все изменения sudoers за сегодня. aureport --auth — статистику попыток аутентификации. После внедрения auditd количество неотслеживаемых инцидентов падает на 90%.
AIDE (Advanced Intrusion Detection Environment) создаёт baseline файловой системы. Ежедневный aide --check сравнивает текущее состояние с baseline. Неожиданное изменение бинарника в /usr/bin — повод для немедленного расследования.
systemd: управление сервисами правильно
systemctl edit <service> создаёт override-файл в /etc/systemd/system/<service>.d/override.conf — правильный способ изменить параметры юнита без правки оригинального файла.
Ограничение ресурсов через cgroups прямо в юните:
[Service] MemoryMax=2G CPUQuota=200% TasksMax=512 LimitNOFILE=65536 systemd-analyze blame покажет, что тормозит загрузку. systemd-analyze critical-chain — цепочку зависимостей для самого медленного юнита. На одном сервере NetworkManager-wait-online.service держал загрузку 45 секунд, хотя sshd мог стартовать за 3. После отключения этого юнита время загрузки сократилось с 60 до 15 секунд.
journalctl -u nginx.service -f --since "1 hour ago" — основной инструмент просмотра логов. journalctl --disk-usage и journalctl --vacuum-size=1G — управление размером журнала. Ограничение журнала до 1 ГБ экономит до 80% дискового пространства на партиции /var/log.
Что входит в услугу администрирования Linux-серверов?
| Deliverable | Описание |
|---|---|
| Аудит безопасности и производительности | Lynis, проверка CVE, анализ sysctl, auditd, отчёт |
| Hardening по CIS Benchmark Level 1/2 | Настройка sysctl, PAM, SSH, auditd, AIDE |
| Performance tuning | Профилирование, kernel parameters, I/O scheduler, NUMA |
| Документация | Baseline, runbook, инструкции для команды |
| Обучение команды | Разбор настроек, работа с systemd, troubleshooting |
| Пост-поддержка после внедрения | Мониторинг стабильности, коррекция (1 месяц) |
Процесс работы
| Этап | Содержание | Ориентировочные сроки |
|---|---|---|
| Аудит | lynis audit system, анализ sysctl, auditd, проверка CVE |
1–2 дня |
| Hardening | Применение CIS Benchmark, настройка PAM/SSH/auditd/AIDE | 2–5 дней |
| Tuning | Профилирование нагрузки, настройка kernel parameters, I/O scheduler | 1–3 дня |
| Документация | Изменения конфигурации, baseline, runbook инцидентов | 1 день |
Стоимость рассчитывается индивидуально под ваш проект. Ориентируйтесь на экономию: после нашего вмешательства среднее снижение затрат на инциденты составляет $2.7k–3.9k в год, а гарантия стабильной работы после внедрения включена в услугу. Консультация — обсудим ваш случай и подготовим предложение за 1 день. Свяжитесь с нами в Telegram или по почте — получите аудит текущего состояния серверов.
Закажите аудит сегодня и узнайте, где теряете деньги из-за неоптимальных настроек.







