Если гоняешь ansible по сотне серверов, SSH каждый раз делает хендшейк заново
Переиспользовать одно TCP-соединение
Замерил на локальном sshd: первое подключение 0.22 секунды, второе и третье — по 0.01. Разница в двадцать раз, и это на loopback, где сети как таковой нет. На реальном канале с задержкой выигрыш будет больше.
Каталог
Не упереться в лимит длины пути
Нюанс:
Проверил на пути в 109 байт — ровно на границе.
Проверить, жив ли мастер
Отвечает
Сбросить залипшую сессию
Печатает
Нюанс: если мастер-процесс умер не сам, а был убит, файл сокета остаётся сиротой. Прибил мастера через
Честный минус: ноутбук ушёл в сон с активным сокетом — при пробуждении получишь висящую сессию и таймаут вместо мгновенного входа. Лечится тем же
А вы ControlPersist держите глобально на
#Linux #SSH #Ansible #DevOps #Terminal
Переиспользовать одно TCP-соединение
# ~/.ssh/config
Host *
ControlMaster auto
ControlPath ~/.ssh/sockets/%C
ControlPersist 10m
Замерил на локальном sshd: первое подключение 0.22 секунды, второе и третье — по 0.01. Разница в двадцать раз, и это на loopback, где сети как таковой нет. На реальном канале с задержкой выигрыш будет больше.
Каталог
~/.ssh/sockets надо создать заранее, сам он не появится.Не упереться в лимит длины пути
Нюанс:
%C тут не для красоты. Классический %r@%h:%p на длинных именах хостов выходит за предел, и ssh отказывается работать:
ControlPath too long ('/root/.ssh/sockets/xxx...
-root@127.0.0.1:2222' >= 108 bytes)
Проверил на пути в 109 байт — ровно на границе.
%C даёт хеш фиксированной длины и снимает вопрос совсем.Проверить, жив ли мастер
ssh -O check user@host
Отвечает
Master running (pid=924). Пригодится, когда непонятно, идёт ли новая сессия через кеш или поднимает соединение с нуля.Сбросить залипшую сессию
ssh -O exit user@host
Печатает
Exit request sent. и удаляет файл сокета. Нужно, когда на сервере поменялись ключи или конфиг, а мастер держит старую сессию.Нюанс: если мастер-процесс умер не сам, а был убит, файл сокета остаётся сиротой. Прибил мастера через
kill -9 — -O check стал отвечать Connection refused, но новое подключение прошло нормально: ssh увидел мёртвый сокет и поднял соединение заново.Честный минус: ноутбук ушёл в сон с активным сокетом — при пробуждении получишь висящую сессию и таймаут вместо мгновенного входа. Лечится тем же
-O exit, но сначала надо догадаться, что дело в нём.А вы ControlPersist держите глобально на
Host * или включаете точечно?#Linux #SSH #Ansible #DevOps #Terminal
👍4🔥1
Как достать пароль из kdbx, когда графика легла и буфер обмена недоступен
Всё проверено на keepassxc-cli 2.7.6 из репозитория Ubuntu 24.04.
Посмотреть, что вообще есть в базе
Нюанс: без
Вытащить конкретный пароль в терминал
Нюанс: обычный
Открыть базу с файлом ключей
Тот же
Найти запись, когда не помнишь путь
Вернёт полный путь вида
Забрать всю базу разом
Отдаёт в stdout все записи вместе с паролями открытым текстом. Полезно при переезде, но перенаправлять это в файл на общей машине — плохая идея.
Про
И про совет закрыть GUI перед работой в консоли. Проверил: при открытой базе KeePassXC создаёт рядом файл
А вы держите пароли в локальных kdbx или переехали на self-hosted Vaultwarden?
#Linux #KeePass #Security #CLI #DevOps
Всё проверено на keepassxc-cli 2.7.6 из репозитория Ubuntu 24.04.
Посмотреть, что вообще есть в базе
keepassxc-cli ls -R database.kdbx
Нюанс: без
-R увидишь только верхний уровень. Вложенные записи в группах не покажет — легко решить, что база пустая.Вытащить конкретный пароль в терминал
keepassxc-cli show -a Password database.kdbx "Production/DB"
Нюанс: обычный
show без ключей выводит Password: PROTECTED вместо значения. Флаг -s раскрывает все поля, -a Password отдаёт только пароль одной строкой — удобно подставлять в скрипт.Открыть базу с файлом ключей
keepassxc-cli ls -k keyfile.key database.kdbx
Тот же
-k работает во всех подкомандах. Если пароля на базе нет вообще, добавь --no-password, иначе утилита будет ждать ввода.Найти запись, когда не помнишь путь
keepassxc-cli search database.kdbx "DB"
Вернёт полный путь вида
/Production/DB, который дальше подставляется в show.Забрать всю базу разом
keepassxc-cli export -f csv database.kdbx
Отдаёт в stdout все записи вместе с паролями открытым текстом. Полезно при переезде, но перенаправлять это в файл на общей машине — плохая идея.
Про
clip, который советуют для копирования пароля в буфер. Именно в сценарии «GUI лёг» он и не работает: без графической сессии команда отвечает All clipping programs failed. Tried xclip. Смысл в нём есть только в живой графике, где он же и чистит буфер через 10 секунд.И про совет закрыть GUI перед работой в консоли. Проверил: при открытой базе KeePassXC создаёт рядом файл
.kdbx.lock. Утилита о нём знает, так что «гарантированного повреждения» не будет — но менять базу из двух мест одновременно всё равно не стоит, последняя запись затрёт чужие правки.А вы держите пароли в локальных kdbx или переехали на self-hosted Vaultwarden?
#Linux #KeePass #Security #CLI #DevOps
👍2
Диски гостей раздулись, а внутри места полно. Вернуть его хосту — и не просадить запись
Проверить, поддерживает ли диск discard
Нюанс: в подборках советуют
Ненулевые
Отдать блоки хосту прямо сейчас
Сначала
Настроить регулярный TRIM
Нюанс: свой скрипт в
Если всё-таки делаешь через cron, помни про две вещи. Скрипт без строки
Не включать онлайн-TRIM в fstab
Опция
Всё это работает, только если discard включён в настройках диска на самом гипервизоре. Иначе гость честно шлёт команды, а хост их игнорирует и продолжает копить мусор.
А вы fstrim по таймеру гоняете или руками, когда место кончилось?
#Linux #Virtualization #Proxmox #fstrim #DevOps
Проверить, поддерживает ли диск discard
lsblk --discard
Нюанс: в подборках советуют
hdparm -I /dev/sda | grep -i trim. На virtio-диске это не сработает вовсе — у меня вернуло Operation not permitted, потому что hdparm говорит по протоколу ATA, которого у виртуального диска нет. lsblk --discard показывает нужное для любого типа:
NAME DISC-GRAN DISC-MAX
vda 4K 1G
vdb 0B 0B
Ненулевые
DISC-GRAN и DISC-MAX означают, что discard проходит. Нули — гипервизор его не отдаёт, дальше можно не настраивать.Отдать блоки хосту прямо сейчас
fstrim -av --dry-run
fstrim -av
Сначала
--dry-run: он делает всё то же самое, но без самого discard. У меня показал 0 B (dry run) trimmed on /dev/vda, а боевой запуск вернул 243.1 GiB trimmed.Настроить регулярный TRIM
systemctl enable --now fstrim.timer
systemctl list-timers fstrim.timer
Нюанс: свой скрипт в
/etc/cron.weekly писать не нужно — в пакете util-linux уже лежит готовый fstrim.timer с OnCalendar=weekly и разбросом запуска до 100 минут, чтобы виртуалки не пошли в discard одновременно.Если всё-таки делаешь через cron, помни про две вещи. Скрипт без строки
#!/bin/sh не выполнится: run-parts: failed to exec: Exec format error. И файл с точкой в имени, вроде fstrim.sh, run-parts молча пропустит.Не включать онлайн-TRIM в fstab
UUID=xxxx / ext4 defaults,discard 0 1
Опция
discard при монтировании шлёт запрос на очистку при удалении каждого файла. Пакетный TRIM раз в неделю делает то же самое, но одним заходом и в спокойное время.Всё это работает, только если discard включён в настройках диска на самом гипервизоре. Иначе гость честно шлёт команды, а хост их игнорирует и продолжает копить мусор.
А вы fstrim по таймеру гоняете или руками, когда место кончилось?
#Linux #Virtualization #Proxmox #fstrim #DevOps
🔥2
Сервис упал ночью, до утра гигабайт логов. Порядок, в котором в них лезть
Начать с ошибок текущей загрузки
Сузить окно до времени инцидента
Нюанс: форматы вроде
Посмотреть, не прибило ли сервис ядро
Проверить блокировки SELinux
Нюанс: на Debian и Ubuntu команда чаще всего вернёт пустоту — там AppArmor, а не SELinux, и
Найти, кто сканирует сайт
Нюанс: ходовой вариант
Для пары серверов этого хватает. Когда машин десятки, CLI перестаёт работать и нужен Loki или ELK — но и там первый вопрос будет тот же: какое окно и какой приоритет.
А с чего начинаете вы, когда прод упал и надо быстро локализовать причину?
#Linux #Logs #journalctl #Troubleshooting #DevOps
Начать с ошибок текущей загрузки
journalctl -p err -b
-b отсекает всё, что было до последней перезагрузки, -p err оставляет уровень Error и выше. Цифровой вариант -p 3 делает то же самое, но словом читается лучше.Сузить окно до времени инцидента
journalctl --since "2026-08-13 23:00:00" \
--until "2026-08-14 01:00:00"
Нюанс: форматы вроде
yesterday 23:00:00, которые кочуют по подборкам, systemd не разбирает — получишь Failed to parse timestamp. Проверил на systemd 255: отдельно yesterday работает, -2h работает, 23:00 работает, а вот их комбинация — нет. Надёжнее всегда писать полную дату.Посмотреть, не прибило ли сервис ядро
dmesg -T --level=err,warn
dmesg -T | grep -i oom-killer
-T переводит секунды аптайма в нормальную дату. Фильтр по уровню полезнее грепа: покажет и OOM, и ошибки диска, и отвалившийся сетевой интерфейс.Проверить блокировки SELinux
ausearch -m avc -ts recent
Нюанс: на Debian и Ubuntu команда чаще всего вернёт пустоту — там AppArmor, а не SELinux, и
/sys/fs/selinux просто нет. Шаг актуален для RHEL-семейства; на Debian смотри journalctl -t audit и dmesg | grep -i apparmor.Найти, кто сканирует сайт
awk -F'"' '{split($3,a," ");
if (a[1]==404) print $1}' access.log |
awk '{print $1}' | sort | uniq -c | sort -rn
Нюанс: ходовой вариант
awk '$9 == 404' разваливается, если в URL попал пробел — поле уезжает, и строка молча не считается. У меня из трёх запросов с 404 такой вариант нашёл два. Разбор по кавычкам берёт код ответа там, где он реально лежит.Для пары серверов этого хватает. Когда машин десятки, CLI перестаёт работать и нужен Loki или ELK — но и там первый вопрос будет тот же: какое окно и какой приоритет.
А с чего начинаете вы, когда прод упал и надо быстро локализовать причину?
#Linux #Logs #journalctl #Troubleshooting #DevOps
👍5🔥1
Прокинуть скрипт и каталог на сервер и не собрать по дороге чужие абсолютные пути
Всё проверено на OpenSSH 9.6p1, подключением к живому sshd.
Увидеть, какие параметры реально применились
Отдаёт итоговый конфиг после разбора всех
Выполнить локальный скрипт на сервере
Нюанс:
Убрать устаревший ключ хоста
Нюанс: для нестандартного порта нужен формат
Забрать каталог без промежуточных файлов
Нюанс:
Уйти в фон сразу после авторизации
Управление вернулось через 181 мс, при этом клиентский процесс продолжает висеть, пока команда не отработает. Удобно для проброса портов:
Держать ключ в агенте ограниченное время
Через 30 секунд ключ уйдёт из памяти агента сам. Нюанс: без запущенного
Про
А чем пробрасываете доступ к внутренним панелям —
#Linux #SSH #Networking #DevOps #Terminal
Всё проверено на OpenSSH 9.6p1, подключением к живому sshd.
Увидеть, какие параметры реально применились
ssh -G user@host
Отдаёт итоговый конфиг после разбора всех
Host и Match: порт, пользователя, список шифров, таймауты. Быстрее, чем перечитывать ~/.ssh/config глазами и гадать, какая секция сработала. Если сессия висит — ssh -vvv покажет, на каком этапе.Выполнить локальный скрипт на сервере
ssh user@host bash -s arg1 arg2 < ./script.sh
Нюанс:
-s обязателен, если передаёшь аргументы. Без него bash примет arg1 за имя файла и ответит No such file or directory. И второе: интерактивный read внутри такого скрипта работать не будет — stdin уже занят самим скриптом.Убрать устаревший ключ хоста
ssh-keygen -f ~/.ssh/known_hosts -R '[10.0.0.1]:2222'
Нюанс: для нестандартного порта нужен формат
[host]:port в кавычках. Просто -R 10.0.0.1 строку не найдёт и молча ничего не сделает. Старый файл сохраняется рядом как known_hosts.old.Забрать каталог без промежуточных файлов
ssh user@host "tar -cf - -C /data ." | tar -xC ~/bak/
Нюанс:
-C на удалённой стороне обязателен. Вариант tar -cf - /data утащит в архив весь абсолютный путь, и локально ты получишь ~/bak/data/... вместо содержимого. Проверил — распаковалось именно так.Уйти в фон сразу после авторизации
ssh -f user@host "sleep 300"
Управление вернулось через 181 мс, при этом клиентский процесс продолжает висеть, пока команда не отработает. Удобно для проброса портов:
ssh -f -N -L 9998:localhost:15672 user@host.Держать ключ в агенте ограниченное время
ssh-add -t 30 ~/.ssh/id_ed25519
Через 30 секунд ключ уйдёт из памяти агента сам. Нюанс: без запущенного
ssh-agent команда просто скажет Could not open a connection to your authentication agent.Про
sshpass из подборок: он кладёт пароль в аргументы процесса, где его видно в ps любому пользователю системы. Для закрытого стенда — ладно, дальше стенда лучше ProxyJump и ключи.А чем пробрасываете доступ к внутренним панелям —
-L руками или прописываете в конфиг?#Linux #SSH #Networking #DevOps #Terminal
👍5
🎥 Вебинар: «LVM без простоя: расширение тома, перенос данных и аварийный откат через snapshot»
На открытом уроке разберем, как использовать возможности LVM при работе с хранилищем в production-среде. Рассмотрим расширение логического тома, перенос данных на другое блочное устройство и применение snapshot для возврата к предыдущему состоянию системы.
О чем поговорим:
— Как устроен LVM и какие задачи он помогает решать
— Как расширять логические тома при увеличении объема данных
— Как перенести данные на другое блочное устройство
— Что такое snapshot и как он работает
— Как использовать snapshot для отката при возникновении проблем
🧠 Вебинар приурочен к старту курса «Администратор Linux. Продвинутый уровень». Программа постоянно обновляется с учётом современных требований рынка. Занятия проводят практикующие эксперты, которые ежедневно работают с производственной инфраструктурой. Вы изучите востребованные инструменты: Zabbix, Prometheus, Docker, Nginx, PostgreSQL, ELK, Ansible, SELinux, Bash и многие другие.
👉 Для участия зарегистрируйтесь https://otus.pw/T9OrR/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
На открытом уроке разберем, как использовать возможности LVM при работе с хранилищем в production-среде. Рассмотрим расширение логического тома, перенос данных на другое блочное устройство и применение snapshot для возврата к предыдущему состоянию системы.
О чем поговорим:
— Как устроен LVM и какие задачи он помогает решать
— Как расширять логические тома при увеличении объема данных
— Как перенести данные на другое блочное устройство
— Что такое snapshot и как он работает
— Как использовать snapshot для отката при возникновении проблем
🧠 Вебинар приурочен к старту курса «Администратор Linux. Продвинутый уровень». Программа постоянно обновляется с учётом современных требований рынка. Занятия проводят практикующие эксперты, которые ежедневно работают с производственной инфраструктурой. Вы изучите востребованные инструменты: Zabbix, Prometheus, Docker, Nginx, PostgreSQL, ELK, Ansible, SELinux, Bash и многие другие.
👉 Для участия зарегистрируйтесь https://otus.pw/T9OrR/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍6👎1
Обойти массив путей с пробелами и не получить вместо одной папки три несуществующих.
Перебрать элементы, не разорвав их по пробелам
Кавычки вокруг
Посчитать элементы
Нюанс:
Обойти разреженный массив
Нюанс: если удалить элемент через
Прочитать файл в массив
Нюанс:
Сделать словарь
Нюанс:
Общее у всех пяти: bash не ругается, а тихо делает не то. Поэтому
А вы конфиги в bash разбираете ассоциативными массивами или сразу отдаёте jq?
#Linux #Bash #Shell #Scripting #DevOps
Перебрать элементы, не разорвав их по пробелам
folders=("/var/log/nginx" "/var/log/app with space")
for d in "${folders[@]}"; do
ls -ld "$d"
done
Кавычки вокруг
${folders[@]} обязательны. Без них тот же цикл на моём тесте выдал четыре итерации вместо двух: путь распался на /var/log/app, with и space. И не путай @ с *: под кавычками "${folders[*]}" склеивает весь массив в одну строку.Посчитать элементы
echo "${#folders[@]}"
Нюанс:
${#folders} без [@] — это не размер массива, а длина первого элемента. У меня вернуло 8 вместо 3, и никакой ошибки.Обойти разреженный массив
for i in "${!sparse[@]}"; do
echo "$i = ${sparse[$i]}"
done
Нюанс: если удалить элемент через
unset, индексы останутся с дырками. Массив с индексами 0, 5, 9 имеет размер 3 — обход по seq 0 2 найдёт один элемент из трёх. Перебирать надо индексы через ${!arr[@]}, а не числа от нуля.Прочитать файл в массив
readarray -t lines < /var/log/app.log
readarray -t lines < <(grep -v '^$' /var/log/app.log)
Нюанс:
cat file | readarray -t lines не работает. Пайп запускает readarray в подоболочке, массив заполняется там и умирает вместе с ней. У меня получилось 0 элементов вместо 4, снова без ошибки. Нужен либо редирект, либо подстановка процесса < <(...).Сделать словарь
declare -A ports=([nginx]=80 [php-fpm]=9000)
Нюанс:
declare -A не формальность. Без него bash создаёт обычный индексный массив, все строковые ключи считаются нулём, и каждое присваивание перетирает предыдущее. Проверил: ${ports[nginx]} вернуло 9000 — значение от php-fpm.Общее у всех пяти: bash не ругается, а тихо делает не то. Поэтому
shellcheck на скриптах с массивами экономит больше времени, чем кажется.А вы конфиги в bash разбираете ассоциативными массивами или сразу отдаёте jq?
#Linux #Bash #Shell #Scripting #DevOps
👍2
Выкинуть из скрипта форки awk и cut и не нарваться на подстановку, которая молчит
Разобрать путь без basename и dirname
Замерил тысячу итераций в цикле:
Собрать файлы в массив вместо ls
Нюанс: без
Сравнить вывод двух команд без временных файлов
Задать дефолт и проверить обязательные переменные
Нюанс: двоеточие в
Собрать тайминги шагов скрипта
Нюанс: в подборках сюда пишут
А что вы чаще выносите из скриптов — cut и awk или всё-таки оставляете, потому что читается понятнее?
#Linux #Bash #Shell #Scripting #DevOps
Разобрать путь без basename и dirname
path="/var/log/nginx/access.log.tar.gz"
name="${path##*/}" # access.log.tar.gz
dir="${path%/*}" # /var/log/nginx
Замерил тысячу итераций в цикле:
basename — 1107 мс, подстановка — 5 мс. Разница в двести раз, и это не про скорость самой утилиты, а про форк процесса на каждый вызов.Собрать файлы в массив вместо ls
shopt -s nullglob
files=(/var/log/nginx/*.log)
cp -- "${files[@]}" /backup/logs/
Нюанс: без
nullglob массив по несуществующей маске не пустой. Проверил — в нём оказался один элемент, сама строка /var/log/nginx/*.nosuch, и cp уедет с несуществующим файлом. shopt -s nullglob заставляет пустой glob разворачиваться в ноль элементов.Сравнить вывод двух команд без временных файлов
diff <(ls -1 dir1) <(ls -1 dir2)
<(...) подставляет путь вида /dev/fd/63, за которым стоит обычный pipe — проверил через ls -l. Нюанс: код возврата команды внутри скобок теряется, diff его не увидит. И это только bash: в dash тот же синтаксис даёт Syntax error, так что для #!/bin/sh не годится.Задать дефолт и проверить обязательные переменные
: "${TIMEOUT:=30}"
: "${DB_USER:?не задана}"
Нюанс: двоеточие в
:? обязательно. Вариант ${DB_USER?...} из подборок срабатывает только когда переменная не объявлена вовсе — пустую строку он пропускает, и скрипт идёт дальше с пустым логином. С :? тот же случай падает с кодом 127. То же и с :-: он подставляет дефолт, но не присваивает, переменная остаётся пустой.Собрать тайминги шагов скрипта
PS4='+ ${EPOCHREALTIME} '
set -x
Нюанс: в подборках сюда пишут
PS4='+ $(date "+%s.%N") => ' — и это форк date на каждую строку трассировки, в посте про избавление от форков. Встроенная EPOCHREALTIME даёт то же время с микросекундами и без единого процесса.А что вы чаще выносите из скриптов — cut и awk или всё-таки оставляете, потому что читается понятнее?
#Linux #Bash #Shell #Scripting #DevOps
👍4🔥1
Найти на сервере скрытых рутов и не поверить проверке, которая их не видит.
Найти лишние учётки с нулевым UID
Нюанс: в подборках пишут
Убедиться, что root не пускают по SSH
Нюанс, и он главный.
Именно так выглядит типовой облачный образ.
Проверить sudoers перед сохранением
Найти SUID-бинарники
Нюанс:
Про
А вы root на серверах отключаете совсем или держите для аварийной консоли?
#Linux #Security #SSH #sudo #DevOps
Найти лишние учётки с нулевым UID
getent passwd | awk -F: '($3 == 0) {print $1}'
Нюанс: в подборках пишут
awk -F: '($3 == "0")' — со строковым сравнением. Оно пропускает UID, записанный как 00 или 0000. Проверил: завёл пользователя с -u 00, id показал uid=0(root), то есть для ядра это полноценный рут, а строковая проверка его не увидела. Без кавычек awk сравнивает числа и ловит все варианты.getent вместо cat /etc/passwd нужен, чтобы захватить пользователей из LDAP и SSSD.Убедиться, что root не пускают по SSH
sshd -T | grep -i permitrootlogin
Нюанс, и он главный.
grep по /etc/ssh/sshd_config показывает то, что написано, а не то, что действует. Собрал стенд: в основном конфиге PermitRootLogin no, а в /etc/ssh/sshd_config.d/99-cloud.conf — yes. Строка Include стоит выше, drop-in побеждает:
grep -> PermitRootLogin no
sshd -T -> permitrootlogin yes
Именно так выглядит типовой облачный образ.
sshd -T печатает итоговую конфигурацию после всех включений.Проверить sudoers перед сохранением
visudo -c -f /etc/sudoers.d/devops
visudo без аргументов знают все, а вот -c -f работает с любым файлом и годится для CI или проверки после Ansible. На кривом правиле показывает строку и место ошибки, на нормальном — parsed OK. Заодно sudo -l покажет, что реально разрешено текущему пользователю.Найти SUID-бинарники
find / -xdev -perm /6000 -type f -ls 2>/dev/null
Нюанс:
-perm -4000 -user root из чек-листов пропускает SGID. На моей машине разница 9 файлов против 12 — мимо проверки прошли chage, expiry, ssh-agent. Фильтр -user root тоже лишний: чужой SUID опаснее рутового, а он под этот фильтр не попадёт. И -xdev обязателен, иначе find захлебнётся на /proc.Про
sudo -i вместо su спорить не буду, но помнить стоит другое: жёсткие правила в sudoers обходятся через less, find, awk и десяток других утилит — у всех есть побег в шелл. Разрешать по одной команде безопаснее, чем кажется, только если это не интерпретатор.А вы root на серверах отключаете совсем или держите для аварийной консоли?
#Linux #Security #SSH #sudo #DevOps
👍4
🎥 Вебинар: Где Linux хранит настройки и логи: разбираем файловую структуру на практике.
На открытом уроке разберем структуру каталогов Linux и узнаем, где искать конфигурационные файлы, системные журналы и другие важные данные. Рассмотрим назначение основных директорий и вспомним, как права доступа влияют на работу с файлами.
Данный открытый урок проходит в рамках курса «Администратор Linux. Базовый уровень».
О чем поговорим:
— Как устроена файловая структура Linux
— Для чего предназначены основные системные каталоги
— Что такое конфигурационный файл и где обычно хранятся настройки сервисов
— Где Linux хранит системные логи и как найти нужный журнал
— Как права доступа влияют на чтение и изменение файлов
🧠 Вебинар приурочен к старту курса «Администратор Linux. Базовый уровень». Вы освоите Bash, TCP/IP, Nginx, Apache, MySQL, Docker, Git, Prometheus, Grafana и ELK. На живых занятиях с практикующими экспертами научитесь настраивать веб-серверы, работать с сетью, контейнерами, мониторингом и фильтрацией трафика.
👉 Для участия зарегистрируйтесь https://otus.pw/e3sf/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
На открытом уроке разберем структуру каталогов Linux и узнаем, где искать конфигурационные файлы, системные журналы и другие важные данные. Рассмотрим назначение основных директорий и вспомним, как права доступа влияют на работу с файлами.
Данный открытый урок проходит в рамках курса «Администратор Linux. Базовый уровень».
О чем поговорим:
— Как устроена файловая структура Linux
— Для чего предназначены основные системные каталоги
— Что такое конфигурационный файл и где обычно хранятся настройки сервисов
— Где Linux хранит системные логи и как найти нужный журнал
— Как права доступа влияют на чтение и изменение файлов
🧠 Вебинар приурочен к старту курса «Администратор Linux. Базовый уровень». Вы освоите Bash, TCP/IP, Nginx, Apache, MySQL, Docker, Git, Prometheus, Grafana и ELK. На живых занятиях с практикующими экспертами научитесь настраивать веб-серверы, работать с сетью, контейнерами, мониторингом и фильтрацией трафика.
👉 Для участия зарегистрируйтесь https://otus.pw/e3sf/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍2👎1
Смонтировать сетевую шару и не подвесить процессы, когда сервер отвалится.
Убрать пароль из fstab
Файл
Отцепить зависшую шару
Проверил на tmpfs: после
Посмотреть, что отдаёт сервер
Нюанс:
Монтировать по требованию, а не при загрузке
Нюанс:
Не залипнуть на медленном NFS
Нюанс: man про
А вы сетевые шары монтируете через fstab или отдаёте systemd с automount?
#Linux #NFS #Samba #systemd #DevOps
Убрать пароль из fstab
mount -t cifs -o credentials=/etc/cifs-creds \
//10.0.0.10/share /mnt/samba
Файл
/etc/cifs-creds из трёх строк: username=, password=, domain=. Нюанс: chmod 600 на нём — целиком на вашей совести, mount права не проверяет и с файлом 644 отработает молча. Заодно проверьте, что каталог с ним не уезжает в бэкап открытым текстом.Отцепить зависшую шару
umount -l /mnt/nfs
Проверил на tmpfs: после
-l каталог пуст и монтирования в mount больше нет, но процесс, державший файл открытым, спокойно дочитал его по старому дескриптору. Нюанс: -l убирает точку из дерева, а не освобождает ресурсы — пока живы процессы, ФС остаётся. Ищите их через lsof +D до того, как отцепите, иначе искать будет негде.-f имеет смысл только для NFS и только вместе с недоступным сервером, для cifs он почти ничего не даёт.Посмотреть, что отдаёт сервер
showmount -e 10.0.0.10
Нюанс:
showmount говорит по протоколу MOUNT, которого в NFSv4 нет вообще. На сервере с отключёнными v2 и v3 получите clnt_create: RPC: Program not registered — и это не значит, что сервер мёртв. Для v4 просто монтируйте корень экспорта: mount -t nfs4 10.0.0.10:/ /mnt.Монтировать по требованию, а не при загрузке
//10.0.0.10/share /mnt/samba cifs
noauto,x-systemd.automount,_netdev,
credentials=/etc/creds 0 0
Нюанс:
_netdev нужен наравне с x-systemd.automount. Без него systemd не знает, что монтирование сетевое, и может дёрнуть его до поднятия интерфейсов. Плюс x-systemd.idle-timeout= отцепит шару после простоя — на нестабильном канале это лучше, чем висящая точка.Не залипнуть на медленном NFS
mount -t nfs -o soft,timeo=50,retrans=2 \
10.0.0.10:/data /mnt/nfs
timeo в децисекундах, так что 50 — это 5 секунд. По умолчанию для TCP стоит 600, то есть минута, да ещё с линейным ростом после каждой переотправки.Нюанс: man про
soft пишет прямо — silent data corruption. Приложение получит I/O error, и если оно его не обработает, запись потеряется тихо. Для баз и любой записи оставляйте hard. И не тащите из старых шпаргалок intr — опция игнорируется с ядра 2.6.25.А вы сетевые шары монтируете через fstab или отдаёте systemd с automount?
#Linux #NFS #Samba #systemd #DevOps
👍5
Не оставить пароль в bash_history и не удивиться, что он всё равно там оказался.
Скрыть команду от истории
Ведущий пробел, и строка не попадёт в
Если пусто — трюк не сработает вообще, а вы будете уверены в обратном.
Исправить опечатку в предыдущей команде
Заменяет и сразу выполняет. Нюанс: только первое вхождение. Проверил на
Открыть длинную команду в редакторе
Вытаскивает последнюю команду в
Оживить терминал после вывода бинарника
Отвязать процесс от закрывающейся сессии
Нюанс:
И про главное ограничение трюка с пробелом: он прячет команду от файла истории, но не от системы. Пока процесс жив, его аргументы видны в
А чем вы правите длинные пайплайны —
#Linux #Bash #Terminal #Security #DevOps
Скрыть команду от истории
mysql -u root -p'super_secret'
Ведущий пробел, и строка не попадёт в
~/.bash_history. Работает, если в HISTCONTROL есть ignorespace. Нюанс: в Ubuntu это уже настроено, но по-разному. В /etc/skel/.bashrc стоит ignoreboth, а в root-сессии у меня было ignoredups:ignorespace. Проверьте своё:
echo "$HISTCONTROL"
Если пусто — трюк не сработает вообще, а вы будете уверены в обратном.
Исправить опечатку в предыдущей команде
systemctl status nginx-confg
^confg^config
Заменяет и сразу выполняет. Нюанс: только первое вхождение. Проверил на
echo aaa bbb aaa — после ^aaa^XXX получилось XXX bbb aaa. Для всех вхождений другая конструкция:
!!:gs/aaa/XXX/
Открыть длинную команду в редакторе
fc
Вытаскивает последнюю команду в
$EDITOR, после сохранения bash её выполняет. Нюанс: порядок поиска редактора — FCEDIT, потом EDITOR, и только потом vi по умолчанию. На голом сервере без vi получите bash: vi: command not found и никакого редактирования. Заранее пропишите export FCEDIT=nano или что вам ближе.Оживить терминал после вывода бинарника
reset
clear только прокручивает экран, а reset переинициализирует терминал целиком. Если и это не помогает — stty sane возвращает настройки ввода, когда не видно набираемых символов.Отвязать процесс от закрывающейся сессии
bg
disown -h %1
Нюанс:
-h и без него — разные вещи. С -h задача остаётся в jobs, но не получит SIGHUP при закрытии терминала. Без флага задача исчезает из таблицы совсем. Проверил оба варианта, разница именно в этом.И про главное ограничение трюка с пробелом: он прячет команду от файла истории, но не от системы. Пока процесс жив, его аргументы видны в
ps -eo args любому пользователю. Пароль в командной строке остаётся паролем в командной строке — читайте его из файла или переменной окружения.А чем вы правите длинные пайплайны —
fc или сразу пишете в файл?#Linux #Bash #Terminal #Security #DevOps
👍4
Собрать дерево каталогов одной строкой и не получить папку с фигурными скобками в имени.
Создать вложенную структуру
Нюанс: раскрытие скобок — фича bash, а не mkdir. В
Если скрипт начинается с
Вернуться в предыдущий каталог
Нюанс:
Ходить по каталогам стеком
Нюанс: лишний
Пройти сквозь симлинк
Проверил на своём симлинке: обычный
Снести пустую цепочку каталогов
Поднимается снизу вверх, пока каталоги пустые. Нюанс: наткнувшись на непустой, останавливается с
А вы по дереву каталогов ходите
#Linux #Bash #Terminal #Scripting #DevOps
Создать вложенную структуру
mkdir -p project/src/{configs,utils,tests}
Нюанс: раскрытие скобок — фича bash, а не mkdir. В
sh строка отработает буквально, создав каталог с именем {configs,utils,tests} — проверил, ошибки при этом никакой. То же будет от пробела после запятой и от одного элемента без запятой: {only} останется как есть.Если скрипт начинается с
#!/bin/sh, скобки не использовать.Вернуться в предыдущий каталог
cd -
Нюанс:
cd - печатает путь в stdout. В скрипте это мусор в выводе, а $(cd -) вообще бесполезен — подстановка уходит в подоболочку, и рабочий каталог самого скрипта не меняется. Для скриптов тише так:
cd "$OLDPWD"
Ходить по каталогам стеком
pushd /var/log >/dev/null
popd >/dev/null
Нюанс: лишний
popd возвращает directory stack empty и код 1. Под set -e скрипт на этом падает — а такое легко получить, если между pushd и popd стоит выход по ошибке. Перенаправление в /dev/null тоже нужно: обе команды печатают содержимое стека.Пройти сквозь симлинк
cd -P /var/run
Проверил на своём симлинке: обычный
cd оставляет PWD равным /tmp/dd/link, с -P он становится /tmp/dd/real. Нюанс не в самом переходе, а в том, что будет дальше. Из link/sub команда cd .. вернёт в link, а cd -P .. — в real. Скрипт, который ходит относительными путями через симлинк, легко уедет не туда. Заодно pwd -P показывает физический путь, когда pwd показывает логический.Снести пустую цепочку каталогов
rmdir -p a/b/c
Поднимается снизу вверх, пока каталоги пустые. Нюанс: наткнувшись на непустой, останавливается с
Directory not empty — но то, что успел удалить ниже, уже удалено. Возврата нет, так что для глубоких цепочек лучше сначала посмотреть find a -type d -empty.А вы по дереву каталогов ходите
pushd или всё-таки алиасами и cd -?#Linux #Bash #Terminal #Scripting #DevOps
👍5
🎥 Вебинар: «Типовые задачи с RAID-массивами: создание, эксплуатация, перенос данных и восстановление»
На открытом уроке разберем повседневные задачи, возникающие при работе с RAID-массивами: замену дисков, перенос данных на другой сервер и восстановление массива после сбоя. Обсудим, как собрать RAID из оставшихся дисков и в каких случаях восстановление данных возможно, а когда вернуть массив уже не получится.
О чем поговорим:
— Как создавать и эксплуатировать RAID-массивы
— Как правильно менять вышедшие из строя диски
— Как собрать массив из оставшихся рабочих дисков
— Как перенести данные на другой сервер
— Как восстанавливать RAID после сбоя и оценивать вероятность успешного восстановления
🧠 Вебинар приурочен к старту курса «Администратор Linux. Продвинутый уровень». Программа постоянно обновляется с учётом современных требований рынка. Занятия проводят практикующие эксперты, которые ежедневно работают с производственной инфраструктурой. Вы изучите востребованные инструменты: Zabbix, Prometheus, Docker, Nginx, PostgreSQL, ELK, Ansible, SELinux, Bash и многие другие.
👉 Для участия зарегистрируйтесь https://otus.pw/ZrYD/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
На открытом уроке разберем повседневные задачи, возникающие при работе с RAID-массивами: замену дисков, перенос данных на другой сервер и восстановление массива после сбоя. Обсудим, как собрать RAID из оставшихся дисков и в каких случаях восстановление данных возможно, а когда вернуть массив уже не получится.
О чем поговорим:
— Как создавать и эксплуатировать RAID-массивы
— Как правильно менять вышедшие из строя диски
— Как собрать массив из оставшихся рабочих дисков
— Как перенести данные на другой сервер
— Как восстанавливать RAID после сбоя и оценивать вероятность успешного восстановления
🧠 Вебинар приурочен к старту курса «Администратор Linux. Продвинутый уровень». Программа постоянно обновляется с учётом современных требований рынка. Занятия проводят практикующие эксперты, которые ежедневно работают с производственной инфраструктурой. Вы изучите востребованные инструменты: Zabbix, Prometheus, Docker, Nginx, PostgreSQL, ELK, Ansible, SELinux, Bash и многие другие.
👉 Для участия зарегистрируйтесь https://otus.pw/ZrYD/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👎1
Собрать архив с исключениями и не обнаружить потом, что исключения не сработали.
Исключить каталог из архива
Нюанс:
Достать один файл из архива
Нюанс: при упаковке по абсолютному пути tar срезает ведущий слеш и пишет
Дописать или удалить файл в архиве
Нюанс: только для несжатых архивов. На
Сжать быстрее и плотнее gzip
На моих тестовых данных zstd дал 199 байт против 225 у gzip. Нюанс: если пакета
Не перезаписать свежие файлы при распаковке
Работает: файл, который новее архивного, остаётся нетронутым, в выводе
Про сравнение архива с диском:
А вы чем сжимаете бэкапы — gzip по привычке или уже переехали на zstd?
#Linux #tar #Backup #Bash #DevOps
Исключить каталог из архива
tar --exclude='data/logs' -czf arch.tgz data
Нюанс:
--exclude обязан стоять до источника. Поставил после — tar честно предупредил --exclude 'data/logs' has no effect и всё равно упаковал логи. Второе: шаблон сравнивается с тем, как путь записан внутри архива. Упаковываете data, значит исключать надо data/logs, а не /tmp/ta/data/logs — с абсолютным путём совпадения не будет.Достать один файл из архива
tar -tf arch.tar | grep app.conf
tar -xf arch.tar tmp/ta/data/conf/app.conf
Нюанс: при упаковке по абсолютному пути tar срезает ведущий слеш и пишет
Removing leading '/' from member names. Поэтому распаковать по тому же абсолютному пути не выйдет — получите Not found in archive. Сначала посмотрите список через -t, потом копируйте путь оттуда.Дописать или удалить файл в архиве
tar -rf arch.tar newfile.txt
tar --delete -f arch.tar oldfile.txt
Нюанс: только для несжатых архивов. На
.tgz обе команды падают с Cannot update compressed archives и Error is not recoverable: exiting now. Чтобы поправить сжатый архив, его придётся распаковать целиком.Сжать быстрее и плотнее gzip
tar --zstd -cf arch.tar.zst data
На моих тестовых данных zstd дал 199 байт против 225 у gzip. Нюанс: если пакета
zstd в системе нет, tar создаст файл нулевого размера и завершится с кодом 2. Файл при этом лежит на месте и выглядит как архив — в скрипте бэкапа такое заметят не сразу. Проверяйте код возврата, а не наличие файла.Не перезаписать свежие файлы при распаковке
tar -xf arch.tar --keep-newer-files
Работает: файл, который новее архивного, остаётся нетронутым, в выводе
Current 'data/logs/a.log' is newer or same age. Нюанс: код возврата при этом 2, как при ошибке. Под set -e скрипт упадёт, хотя всё прошло по плану.Про сравнение архива с диском:
tar -df arch.tar показывает Mod time differs и Size differs по каждому расхождению. Удобно проверить бэкап, не распаковывая.А вы чем сжимаете бэкапы — gzip по привычке или уже переехали на zstd?
#Linux #tar #Backup #Bash #DevOps
👍6
Добавить пользователя в группу и не выкинуть его при этом из sudo
Добавить во вторичную группу
Нюанс, ради которого стоит перечитать свои скрипты: без
Удалить из группы
Печатает
Сменить GID существующей группы
Нюанс:
Создать группу в скрипте
Нюанс: обычный
Удалить группу
Нюанс: если группа у кого-то основная, команда откажет —
Про проверку:
А вы группы раскатываете Ansible-модулями или скриптом с
#Linux #Security #Ansible #DevOps #Bash
---
Что нашлось при проверке
Главную ловушку воспроизвёл. Завёл lisa в
Находка сверх исходника: `groupmod -g` оставляет файлы без группы. Сменил GID у
`groupadd -f` для идемпотентности. Обычный вызов на существующей группе — код 9. В скриптах инициализации, о которых говорит сам исходник, это ровно та причина, по которой люди начинают городить проверки через
`groupdel` на основной группе.
`groupadd -r` даёт GID из системного диапазона. У меня 996 против 2002 у обычной. Исходник пишет «GID до 1000» — подтвердилось.
Из пятнадцати пунктов оставил шесть. Убрал
Метрики: объём 2027, подводка 67 символов, форма — инфинитив цели. Строк кода длиннее 60 нет, восклицательных нет, хештегов 5.
Добавить во вторичную группу
usermod -aG developers lisa
Нюанс, ради которого стоит перечитать свои скрипты: без
-a флаг -G не добавляет, а заменяет весь список. Было sudo,developers,ops — после usermod -G developers lisa осталось только developers. Ни ошибки, ни предупреждения, код возврата 0. Человек узнает об этом, когда в следующий раз наберёт sudo.Удалить из группы
gpasswd -d bob developers
Печатает
Removing user bob from group developers. В отличие от usermod -G, трогает ровно одну группу.Сменить GID существующей группы
groupmod -g 2000 developers
find / -xdev -nogroup 2>/dev/null
chgrp -R developers /data
Нюанс:
groupmod меняет запись в /etc/group, но файлы на диске остаются со старым числовым GID. У меня после смены ls -ld /data показал вместо имени голое 1004 — каталог стал ничьим. Ищите такие через find -nogroup и чините chgrp -R, иначе доступ к данным потеряется молча.Создать группу в скрипте
groupadd -f developers
groupadd -r pgsql
Нюанс: обычный
groupadd на существующей группе возвращает код 9 и роняет скрипт под set -e. Флаг -f делает операцию идемпотентной — то, что нужно для повторных прогонов Ansible или cloud-init. А -r создаёт системную группу: у меня она получила GID 996, обычная — 2002.Удалить группу
groupdel testers
Нюанс: если группа у кого-то основная, команда откажет —
cannot remove the primary group of user 'bob', код 8. Вторичную удалит без вопросов, и у пользователей она просто исчезнет из списка.Про проверку:
id -nG lisa показывает актуальный список из базы, а groups в чужой открытой сессии — то, что было на момент входа. Пользователь не увидит новых групп, пока не перелогинится или не выполнит newgrp.А вы группы раскатываете Ansible-модулями или скриптом с
groupadd -f?#Linux #Security #Ansible #DevOps #Bash
---
Что нашлось при проверке
Главную ловушку воспроизвёл. Завёл lisa в
sudo, developers, ops. После usermod -G developers lisa осталась одна developers, код возврата 0, ни слова в выводе. Исходник называет это в «честном минусе», но в самом пункте 7 стоит только скобка «обязательно -a» — я вынес разбор в тело, потому что это главное содержание всей темы.Находка сверх исходника: `groupmod -g` оставляет файлы без группы. Сменил GID у
developers с 1004 на 2000 — каталог /data стал показывать 1004 вместо имени. Формально данные не потеряны, но группа к ним больше не имеет отношения. Исходник даёт команду без единой оговорки. Добавил find -nogroup и chgrp -R как лечение.`groupadd -f` для идемпотентности. Обычный вызов на существующей группе — код 9. В скриптах инициализации, о которых говорит сам исходник, это ровно та причина, по которой люди начинают городить проверки через
grep /etc/group. Флага -f в исходнике нет.`groupdel` на основной группе.
cannot remove the primary group of user 'bob', код 8. Проверил обе ветки — вторичная удаляется молча.`groupadd -r` даёт GID из системного диапазона. У меня 996 против 2002 у обычной. Исходник пишет «GID до 1000» — подтвердилось.
Из пятнадцати пунктов оставил шесть. Убрал
groups, id, chgrp, find -group, newgrp, groupmod -n, gpasswd -A как отдельные блоки — по ним нечего добавить сверх справки. Мысль про groups против id вплёл в текст: она объясняет, почему пользователь «не видит» новую группу.Метрики: объём 2027, подводка 67 символов, форма — инфинитив цели. Строк кода длиннее 60 нет, восклицательных нет, хештегов 5.
👍2
🎥 Вебинар: «Сможет ли ИИ починить Linux-сервер: где заканчиваются подсказки и начинается инженерная диагностика»
Разберем реальный инцидент с Linux-сервером и попробуем найти причину проблемы с помощью ИИ. Посмотрим, какие рекомендации действительно помогают инженеру, какой информации не хватает модели и почему некоторые команды опасно выполнять без понимания состояния системы.
О чем поговорим:
- Разберем реальный инцидент с Linux-сервером и попробуем диагностировать его с помощью ИИ.
- Проверим, какие рекомендации AI можно использовать, а какие требуют дополнительной проверки.
- Сравним готовые команды с последовательной инженерной диагностикой и поиском первопричины.
- Покажем, как безопасно применять ИИ для анализа логов, формирования гипотез и подготовки плана действий.
- Разберем формат обучения, практические задания, поддержку преподавателей и итоговый проект курса.
🧠 Вебинар приурочен к старту курса «Администратор Linux. Продвинутый уровень». Программа постоянно обновляется с учётом современных требований рынка. Занятия проводят практикующие эксперты, которые ежедневно работают с производственной инфраструктурой. Вы изучите востребованные инструменты: Zabbix, Prometheus, Docker, Nginx, PostgreSQL, ELK, Ansible, SELinux, Bash и многие другие.
👉 Для участия зарегистрируйтесь https://otus.pw/6rPu/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
Разберем реальный инцидент с Linux-сервером и попробуем найти причину проблемы с помощью ИИ. Посмотрим, какие рекомендации действительно помогают инженеру, какой информации не хватает модели и почему некоторые команды опасно выполнять без понимания состояния системы.
О чем поговорим:
- Разберем реальный инцидент с Linux-сервером и попробуем диагностировать его с помощью ИИ.
- Проверим, какие рекомендации AI можно использовать, а какие требуют дополнительной проверки.
- Сравним готовые команды с последовательной инженерной диагностикой и поиском первопричины.
- Покажем, как безопасно применять ИИ для анализа логов, формирования гипотез и подготовки плана действий.
- Разберем формат обучения, практические задания, поддержку преподавателей и итоговый проект курса.
🧠 Вебинар приурочен к старту курса «Администратор Linux. Продвинутый уровень». Программа постоянно обновляется с учётом современных требований рынка. Занятия проводят практикующие эксперты, которые ежедневно работают с производственной инфраструктурой. Вы изучите востребованные инструменты: Zabbix, Prometheus, Docker, Nginx, PostgreSQL, ELK, Ansible, SELinux, Bash и многие другие.
👉 Для участия зарегистрируйтесь https://otus.pw/6rPu/
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👎1
Закрыть периметр правилами iptables и не остаться при этом за дверью вместе с атакующим.
Посмотреть, что слушает наружу
Даёт порт, состояние и процесс:
Найти, кто держит больше всего соединений
Нюанс: в шпаргалках этот однострочник идёт без
Закрыть вход по умолчанию
Нюанс: в подборках порядок обратный — сначала
Заодно
Ограничить SSH подсетью и числом сессий
Оба правила встали. Полезная деталь:
Отправить подсеть в никуда без файрвола
Нюанс: это не тихий дроп. Локальные попытки получают отлуп сразу —
И общее: всё это живёт до перезагрузки.
А вы вредоносные IP баните iptables напрямую или отдаёте это CrowdSec и fail2ban?
#Linux #Security #iptables #Networking #DevOps
Посмотреть, что слушает наружу
ss -tulpn
Даёт порт, состояние и процесс:
0.0.0.0:8099 users:(("python3",pid=3545,fd=3)). Первое, с чего начинается любой аудит — половина находок обычно в том, что сервис слушает 0.0.0.0 вместо 127.0.0.1.Найти, кто держит больше всего соединений
ss -Hntu | awk '{print $5}' |
sed 's/:[^:]*$//' | sort | uniq -c | sort -rn
Нюанс: в шпаргалках этот однострочник идёт без
-H и с cut -d: -f1. Оба места ломаются. Без -H в подсчёт попадает строка заголовка, и в топе появляется несуществующий адрес Local. А cut по первому двоеточию режет IPv6: адрес [2001:db8::2]:54321 превращается в [2001. Отсечение через sed берёт только порт с конца.Закрыть вход по умолчанию
iptables -A INPUT -m conntrack \
--ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP
Нюанс: в подборках порядок обратный — сначала
-F, потом -P INPUT DROP, а разрешающие правила ниже. Между этими двумя строками сессия уже мертва, и до правил вы не дойдёте. Политика ставится последней, всегда.Заодно
-m state там устаревший, актуален -m conntrack --ctstate.Ограничить SSH подсетью и числом сессий
iptables -A INPUT -p tcp --dport 22 \
! -s 10.0.0.0/24 -j DROP
iptables -A INPUT -p tcp --dport 22 \
-m connlimit --connlimit-above 3 -j REJECT
Оба правила встали. Полезная деталь:
iptables -S показывает, что модуль сам дописал --connlimit-mask 32 --connlimit-saddr — лимит считается по одному адресу, а не по подсети. Если нужен другой охват, маску задавайте явно.Отправить подсеть в никуда без файрвола
ip route add blackhole 192.168.10.0/24
Нюанс: это не тихий дроп. Локальные попытки получают отлуп сразу —
ping вернул connect: Invalid argument, curl завершился с кодом 7. Для исходящего трафика это плюс, ошибка приходит мгновенно вместо таймаута, но маскировки не ждите.И общее: всё это живёт до перезагрузки.
netfilter-persistent для правил, ip route — в конфигурацию сети, иначе следующий ребут откроет всё обратно.А вы вредоносные IP баните iptables напрямую или отдаёте это CrowdSec и fail2ban?
#Linux #Security #iptables #Networking #DevOps
👍2