networkadminru | Unsorted

Telegram-канал networkadminru - NetworkAdmin.ru

4722

Авторский блог про сетевое и системное администрирование. Сайт: networkadmin.ru Реклама: @dad_admin Биржа: https://telega.in/c/networkadminru

Subscribe to a channel

NetworkAdmin.ru

systemd.path: запуск действия при изменении файла

У systemd есть удобный механизм, о котором часто забывают - systemd.path. Он позволяет следить за событиями в файловой системе и запускать нужный .service, когда файл или каталог изменился.

Например:

изменился конфиг - перезапустить сервис
появился файл - запустить обработчик
обновился сертификат - скопировать его и сделать reload

▪️ Пример: реагируем на изменение конфига. Допустим, нужно выполнить действие при изменении файла:


/etc/daemon/daemon.conf


Создаем unit:


/etc/systemd/system/daemon.path
[Unit]
Description=Watch /etc/daemon/daemon.conf for changes

[Path]
PathModified=/etc/daemon/daemon.conf

[Install]
WantedBy=multi-user.target


Этот .path будет следить за изменением файла.

▪️ Сервис, который запустится по событию. Теперь создаем:


/etc/systemd/system/daemon.service



[Unit]
Description=Run action after daemon.conf change

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo "daemon config changed at $(date)" >> /etc/daemon/restart.date'


Для примера сервис просто пишет дату события в файл:


/etc/daemon/restart.date


На практике в ExecStart можно указать любой скрипт:

• перезапуск сервиса;
• reload nginx;
• копирование файла;
• отправка алерта;
• валидация конфига.

▪️ Включаем и запускаем


systemctl daemon-reload
systemctl enable --now daemon.path


Проверяем статус:


systemctl status daemon.path


Теперь изменяем файл:


echo "# test" >> /etc/daemon/daemon.conf


И смотрим результат:


cat /etc/daemon/restart.date


Должна появиться новая строка с текущей датой.

▪️ Почему это удобно. Главный плюс- все работает через systemd. Значит, события и ошибки можно смотреть привычно:


journalctl -u daemon.path
journalctl -u daemon.service


Не нужно писать отдельный бесконечный watcher на bash или городить cron.

▪️ Полезные директивы


[Path]
PathModified=/path/file


Срабатывает при изменении файла.


PathChanged=/path/file


Срабатывает после закрытия файла, в который была запись.


PathExists=/path/file


Срабатывает, когда файл или каталог появился.


PathExistsGlob=/path/*.conf


То же самое, но с маской.


DirectoryNotEmpty=/path/dir


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

#linux #systemd

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

❗️ Как сохранить команду в историю, не запуская ее

Есть в bash одна малозаметная, но крайне удобная функция, о которой знают далеко не все. Она помогает сохранить длинную команду в истории без ее выполнения. Отлично подходит для случаев, когда вы передумали запускать команду, но хотите оставить ее на потом.

▪️ Как это работает

Вы набираете длинную строку в консоли, но понимаете, что сейчас выполнять ее не нужно. Вместо того чтобы копировать ее куда-то в файл, используйте простую комбинацию:

Alt + Shift + 3

После нажатия bash автоматически добавит символ # в начало строки. Команда будет выполнена как комментарий: фактически не запускается, потому что закомментирована, но при этом сохраняется в history вместе с #.

▪️ Как потом ее найти

Открываете поиск по истории (Ctrl + R) и просто ищете по #, нужная команда окажется первой.

Маленькая фича, но иногда очень ускоряет работу.

#bash

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

Нежно зайду и нажму кнопку «перезагрузка»

#юмор

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

📱 Тестирование производительности PostgreSQL

Если нужно быстро оценить, как PostgreSQL чувствует себя на разных типах дисков, файловых системах или конфигурациях виртуалок, необязательно глубоко погружаться в тюнинг СУБД. Достаточно воспользоваться встроенной утилитой pgbench, она идет в комплекте с PostgreSQL и позволяет получить базовые, но показательные метрики.

▪️ Установка и подготовка среды. Устанавливаем PostgreSQL:


apt install postgresql


Проверяем работу службы:


systemctl status postgresql


Создаем тестовую базу:


su - postgres
psql
create database test_db;
\q


Инициализируем тестовые данные, увеличив объём в 10 раз:


pgbench -i test_db -s 10


▪️ Запуск теста нагрузки. Прогоняем тест: 5 клиентов, 2 потока, 60 секунд, вывод статистики каждые 5 секунд:


pgbench test_db -c 5 -j 2 -P 5 -T 60


Пример результата:


number of transactions actually processed: 219950
latency average = 1.362 ms
tps = 3665.930847


СУБД обработала 219 950 транзакций со скоростью ~3666 TPS, это и есть показатель, который удобно использовать для сравнения.

▪️ Что именно тестирует pgbench?

По умолчанию запускается смесь операций, напоминающая TPC-B: внутри одной транзакции идут SELECT, UPDATE и INSERT. Можно использовать свои сценарии, создавая кастомные SQL-скрипты. В документации PostgreSQL (в том числе русской) всё подробно описано.

#postgresql

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

✍️ Быстрый способ выпустить свой HTTPS-сертификат через собственный CA

Сегодня почти любой сервис требует HTTPS. Даже если ресурс локальный или временный, браузеры без сертификата засыпают предупреждениями. Если нет внешнего доступа для Lets Encrypt, приходится копировать сертификаты вручную или постоянно продлевать их.

Гораздо удобнее выпустить свой корневой CA, добавить его в доверенные и генерировать сертификаты под любые домены/IP с любым сроком (хоть на 9999 дней). Покажу, как сделать это для Nginx.

В примере выпускаем сертификат для домена zabbix.internal и IP 192.168.77.55.

1️⃣ Создаем свой CA


mkdir ~/tls && cd ~/tls
openssl ecparam -out myCA.key -name prime256v1 -genkey
openssl req -x509 -new -nodes -key myCA.key -sha256 -days 9999 -out myCA.crt


На вопросы можно отвечать что угодно, это локальный CA.

2️⃣ Генерируем ключ и CSR для сервера


openssl genrsa -out zabbix.internal.key 2048
openssl req -new -key zabbix.internal.key -out zabbix.internal.csr


3️⃣ Создаем файл расширений


mcedit zabbix.internal.ext


Добавляем:


authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names

[alt_names]
IP.1 = 192.168.77.55
DNS.1 = zabbix.internal


4️⃣ Выпускаем сертификат


openssl x509 -req -in zabbix.internal.csr -CA myCA.crt -CAkey myCA.key \
-CAcreateserial -out zabbix.internal.crt -days 9999 -sha256 -extfile zabbix.internal.ext


5️⃣ Копируем сертификаты в nginx


mkdir /etc/nginx/certs
cp zabbix.internal.crt /etc/nginx/certs/
cp zabbix.internal.key /etc/nginx/certs/


Создаем DH-параметры:


openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048


6️⃣ Настраиваем виртуальный хост nginx


listen 443 http2 ssl;
server_name zabbix.internal 192.168.77.55;
ssl_certificate /etc/nginx/certs/zabbix.internal.crt;
ssl_certificate_key /etc/nginx/certs/zabbix.internal.key;
ssl_dhparam /etc/ssl/certs/dhparam.pem;


Перезапуск:


nginx -t
nginx -s reload


7️⃣ Делаем CA доверенным

Передайте файл myCA.crt на свой ПК и добавьте в хранилище доверенных сертификатов.

Если нужно доверить CA прямо на Debian:


cp myCA.crt /usr/local/share/ca-certificates/
update-ca-certificates


Теперь можно заходить на сайт по доменному имени или IP, браузер будет полностью доверять сертификату.

#webserver

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

🖥 Small HTTP Server

Small HTTP Server - программа родом из эпохи Windows 95 и NT, но до сих пор развивается. Написана на C++, невероятно компактная - установщик весит всего около 1 МБ.

▪️ Что умеет Small HTTP Server?

▪️ HTTP-сервер: поддерживает CGI/FastCGI, ISAPI, запуск внешних интерпретаторов (PHP, Perl и т.д.), виртуальные хосты и директории. Можно использовать как полноценный небольшой веб-сервер.

▪️ Почтовый сервер POP3/SMTP: фильтры антиспама, чёрные/белые/серые списки, переотправка писем, запуск скриптов для обработки входящей почты, интеграция с внешними антивирусами.

▪️ FTP-сервер: с виртуальными каталогами и базовым управлением пользователями.

▪️ HTTP-proxy: работает с HTTP/HTTPS/FTP, умеет докачивать файлы, кешировать контент, запрашивать сжатые данные и распаковывать их на лету (через zlib).

▪️ DNS-сервер: поддерживает рекурсивные запросы, кеширование, DNSBL, DoH (RFC8484), а также интересную функцию: если удалённый сервис не отвечает, сервер может автоматически подменять IP-адрес на резервный.

▪️ DHCP-сервер: простой, но рабочий.

▪️ HTTP-TLS VPN: есть свой мини-VPN, использующий OpenVPN TAP-драйвер. И сервер, и клиент.

▪️ Интерфейс и работа

Программа доступна под Windows, Linux и ARM, отличный вариант для маломощных одноплатников.

Все службы настраиваются через удобный веб-интерфейс со статистикой. Конфигурация хранится в обычном текстовом файле. На Windows сервер запускается просто запуском EXE, по умолчанию работает как файловый листинг каталога. Можно установить как службу.

#utils

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

🏠 Windows Firewall: как включить логирование и понять, что именно он блокирует

Встроенный брандмауэр windows по умолчанию не пишет логи о входящих и исходящих соединениях, которые он блокирует. Из-за этого сложно понять, кто виноват: само приложение, сеть или firewall. Многие в такой ситуации просто отключают защиту целиком, но это плохая практика.

Куда правильнее включить логирование DROP-пакетов, посмотреть, что именно блокируется (порт, IP, протокол), и уже после этого создать точечное правило.

▪️ Логирование в текстовый файл. Самый простой способ - это включить запись в стандартный лог:


Set-NetFireWallProfile -Profile Public `
-LogBlocked True `
-LogMaxSize 20480 `
-LogFileName "%systemroot%\system32\LogFiles\Firewall\pfirewall.log" `
-Verbose


После включения логи будут появляться в файле pfirewall.log. В них видно источник, порт, направление и действие (DROP/ALLOW).

▪️Логирование в Event Viewer. Иногда удобнее смотреть блокировки прямо в журнале событий Windows: фильтрация, сортировка и быстрый поиск куда приятнее, чем анализ текста. Активируем аудит:


Auditpol /set /category:"System" /SubCategory:"Filtering Platform Packet Drop" /failure:enable


После этого записи о блокировках появятся в: Event Viewer → Windows Logs → Security

#windows #firewall

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

👒 Легкий TCP/UDP туннель поверх HTTP

Хочу поделиться полезным инструментом, который часто упоминают в контексте пентестов, но который одинаково удобен и администраторам: Chisel. Это один бинарник (на Go) и для сервера, и для клиента доступный для linux, windows, macOS. Работает поверх HTTP, поэтому его очень просто поднять там, где открыт веб-порт.

▪️ Коротко, зачем нужно:

▪️быстро организовать SOCKS5-прокси через открытую HTTP/HTTPS точку;
▪️поднять обратный туннель (reverse) с защищённого хоста, который не доступен извне;
▪️пробросить локальный порт на удалённый хост по HTTP, когда прямой доступ заблокирован.

▪️ Примеры (общая схема)

1️⃣ Быстрый SOCKS5-прокси. На сервере (с публичным IP, порт 80/443 доступен):


./chisel server --port 80 --socks5


На клиенте (локальная машина, откуда хотите выходить в интернет через сервер):


./chisel client http://server.example.com:80 socks


После этого в браузере можно указать SOCKS5 proxy 127.0.0.1:1080, трафик пойдет через сервер.

2️⃣ Обратный SSH-туннель (клиент инициирует соединение, сервер принимает). Если целевая (закрытая) машина не доступна извне, но может инициировать исходящее HTTP-соединение:
На публичном сервере:


./chisel server --port 80 --reverse


На внутреннем хосте (тот, к которому хотим подключиться):


./chisel client http://server.example.com:80 R:2222:localhost:22


Теперь на публичном сервере можно подключиться к внутреннему хосту:


ssh -p 2222 root@127.0.0.1


3️⃣ Проброс локального сервиса (например, MySQL на сервере) на клиент. На публичном сервере запускаем с --reverse. На внутреннем клиенте даем правило:


./chisel client http://server.example.com:80 33306:127.0.0.1:3306


После этого на клиенте MySQL будет доступен локально на порту 33306.

▪️ Дополнительно

Аутентификация: есть опция --auth user:pass и на сервере, и на клиенте, используйте для защиты туннеля.

Маскировка: --backend позволяет прятать chisel-сервер за обычным веб-сервером (перенаправлять чужие HTTP-запросы), что облегчает развертывание в средах с ограничениями.

Один бинарник, удобно распространять и для разных ОС.

#network #security

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

😏

#юмор

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

🔑 Простой инструмент для выпуска сертификатов Lets Encrypt

acme.sh - это полностью bash-скрипт для работы с Lets Encrypt и другими ACME-совместимыми центрами сертификации. Он не требует python, библиотек или дополнительных пакетов, достаточно стандартного окружения linux. Именно легкость, автономность и гибкость сделали его популярной альтернативой certbot.

▪️ Установка. Устанавливается одной командой:


curl https://get.acme.sh | sh -s email=you@networkadmin.ru


Инсталлятор делает все автоматически:

Размещает скрипт в ~/.acme.sh/
Добавляет алиас acme.sh в .bashrc
Создает cron задачу для автообновления сертификатов

После перезапуска среды можно сразу работать.

▪️ Выпуск сертификата (HTTP-01). Самый простой вариант:


acme.sh --issue --server letsencrypt -d networkadmin.ru -w /var/www/html


Для каждого домена создается отдельная директория ~/.acme.sh/networkadmin.ru/, где хранятся:

приватный ключ
сертификат
конфигурация домена

▪️ Установка сертификатов и автоматический reload. Вместо ручного копирования файлов можно доверить все acme.sh:


acme.sh --install-cert -d networkadmin.ru \
--key-file /etc/nginx/certs/key.pem \
--fullchain-file /etc/nginx/certs/cert.pem \
--reloadcmd "systemctl reload nginx"


Теперь при автообновлении сертификатов acme.sh сам скопирует файлы и перезагрузит веб-сервер.

▪️ Почему стоит посмотреть на acme.sh? Главные преимущества:

▪️ Чистый bash без зависимостей. Работает на минимальных системах, легких контейнерах.
▪️ Поддержка десятков DNS-провайдеров. Можно выпускать wildcard-сертификаты одной командой без ручной настройки TXT-записей.
▪️ Поддержка нескольких ACME-CA. Не только Lets Encrypt: ZeroSSL, Buypass и другие.
▪️ Гибкость. Любые действия после выпуска/обновления: копирование, синхронизация, рестарт сервисов, уведомления.
▪️ Работает изолированно. Все файлы хранятся в ~/.acme.sh, не трогают системные каталоги.

#letsencrypt #ssl

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

🧐 Анализ трафика

tcpdump - легкий и быстрый способ посмотреть сетевой трафик прямо в терминале, когда GUI-инструменты недоступны.

▪️ Основные приемы

Быстрые параметры:

-i eth0 - интерфейс
-nn - без DNS/порт-резолва
-s 0 - захватывать пакет полностью
-w file.pcap - сохранить трафик
-r file.pcap - прочитать файл

Фильтры:


tcpdump -i eth0 -nn host 10.0.0.5
tcpdump -i eth0 -nn tcp port 443
tcpdump -i eth0 -nn 'tcp and dst port 22'


▪️ Практические сценарии

HTTP-запросы в ASCII:


tcpdump -i any -nn -s 0 -A 'tcp port 80'


DNS-трафик:


tcpdump -i any -nn -s 0 -A 'udp port 53'


Сохранение дампа:


tcpdump -i eth0 -nn -s 0 -w capture.pcap


Новые TCP-подключения (SYN):


tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0'


MAC-адреса:


tcpdump -i eth0 -nn -e


▪️ Быстрый анализ

Посчитать активность:


timeout 10 tcpdump -i eth0 -nn icmp | wc -l


Просмотреть SNI в HTTPS (если не шифруется):


tcpdump -i any -nn -s 0 -A 'tcp port 443' | grep -i 'server name'


#tcpdump #network

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

⌨️ Инструмент для управления RDP-серверами Windows

Для администраторов windows есть небольшой, очень быстрый и почти олдовейший по духу инструмент - Terminal Services Manager от LizardSystems. Размер всего ~4 МБ, работает мгновенно, интерфейс простой и предельно функциональный. Изначально утилиту делали для терминальных серверов, но по факту она отлично подходит для любой Windows-машины: от серверов до обычных рабочих станций.

Программа платная, но условно. Для персонального использования доступна полностью бесплатная версия без ограничений.

▪️ Что умеет Terminal Services Manager

▪️ Управление терминальными сессиями

- Просмотр всех подключённых пользователей
- Видно, кто активен, кто в состоянии Disconnected
- Подключение к пользовательской сессии
- Принудительный logout или завершение всех сессий

▪️ Взаимодействие с пользователями

- Отправка сообщений прямо в их RDP-сессии

▪️ Мониторинг состояния системы

- Быстрый просмотр нагрузки CPU, RAM, диска

▪️ Управление процессами

- Просмотр процессов на удалённой машине
- Завершение зависших приложений
- Видно процессы по пользователям

▪️ Администрирование хоста

- Перезагрузка и выключение удалённых серверов
- Очистка профилей пользователей
- Быстрое включение/отключение RDP-доступа

Если вы часто управляете RDP-серверами, разгребаете зависшие сессии, мониторите пользователей, то эта утилита сильно экономит время.

#windows #RDP

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

🧑‍💻 Создание и отладка собственных сервисов

Systemd давно стал стандартом для запуска, управления и наблюдения за сервисами. Но многие используют его только для управления уже существующими демонами и не создают собственные unit-файлы, а ведь это удобный способ автоматизировать любые скрипты, фоновые процессы или приложения.

▪️ Шаг 1: создаём unit-файл. Все пользовательские сервисы кладутся в:


/etc/systemd/system/


Пример простого сервиса, который запускает bash-скрипт:


/etc/systemd/system/myapp.service

[Unit]
Description=My custom app
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/myapp.sh
Restart=on-failure
User=myuser
Group=myuser

[Install]
WantedBy=multi-user.target


Несколько рекомендаций по параметрам:

Type=simple - подходит для скриптов и обычных демонов
Restart=on-failure - перезапуск при сбоях
User=… - всегда запускайте сервисы НЕ от root, если это возможно
After=network.target - ожидаем сеть перед запуском


▪️ Шаг 2: корректно пишем исполняемый скрипт. Для стабильной работы сервисов:

указываем shebang (#!/bin/bash);
используем абсолютные пути к бинарникам;
перенаправляем вывод в syslog или файл (если нужно);
завершаемся с кодами ошибок.

Пример:


#!/bin/bash
set -e

echo "Service started"
ping -c 1 8.8.8.8


Не забываем:


chmod +x /usr/local/bin/myapp.sh


▪️ Шаг 3: включаем и запускаем сервис


systemctl daemon-reload
systemctl enable --now myapp.service


Проверяем статус:


systemctl status myapp.service


▪️ Отладка. Systemd имеет отличные инструменты диагностики.

Посмотреть логи сервиса:


journalctl -u myapp.service -f


Проверить последнюю ошибку:


systemctl status myapp.service


Проверить, что systemd видит изменения:


systemctl daemon-reload


Принудительно перезапустить сам процесс:


systemctl restart myapp.service


▪️ Полезные параметры, которые часто забывают

LimitNOFILE - увеличить максимальное количество файлов
LimitNOFILE=65535

WorkingDirectory - задать рабочую директорию
WorkingDirectory=/opt/myapp

Environment - задать переменные окружения
Environment="APP_ENV=prod"

▪️ Безопасность. Systemd умеет частично изолировать сервисы, похожим образом на контейнеры, например:


ProtectSystem=full
ProtectHome=true
PrivateTmp=true
NoNewPrivileges=true


#linux #systemd

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

Как современные дистрибутивы управляют сетями

В последние годы сетевой стек linux стал удобнее и гибче. Вместо громоздких init-скриптов и ручной правки /etc/network/interfaces сейчас используются более современные инструменты - netplan и networkmanager. Часто они сосуществуют в одной системе, и админам важно понимать, когда и что использовать. Поделюсь, как работает каждый из этих инструментов и чем они отличаются.

▪️ Netplan: YAML-конфигурации и единая точка входа. Netplan появился в Ubuntu начиная с 17.10 и задумывался как универсальный слой конфигурации.
Его роль проста:

▪️читать YAML-файлы из /etc/netplan/
▪️транслировать их в настройки сетевого бэкенда (NetworkManager или systemd-networkd)
▪️выполнять примененную конфигурацию при загрузке

Сам Netplan не поднимает сети, он лишь управляет настройками. Пример конфигурации для systemd-networkd:


network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
addresses: [192.168.1.50/24]
gateway4: 192.168.1.1
nameservers:
addresses: [1.1.1.1, 8.8.8.8]


Применение:


sudo netplan apply


▪️Используется на серверах Ubuntu;
▪️Простой, декларативный, без лишних зависимостей;
▪️Отлично подходит для headless-сред, VPS, Kubernetes-нод и любых серверных задач.

▪️ NetworkManager: Wi-Fi, VPN и десктопные сценарии. NetworkManager - это полноценный сетевой менеджер с интерактивными инструментами:

nmcli (CLI);
nmtui (TUI-интерфейс);
GUI в GNOME/KDE;

Он умеет управлять:

Wi-Fi
VPN
Bonding/LACP
VLAN
Bridge
PPPoE
мобильными модемами
и многим другим.


Пример настройки интерфейса статикой через nmcli:


nmcli connection add type ethernet ifname ens33 con-name static-ens33 \
ip4 192.168.1.50/24 gw4 192.168.1.1
nmcli connection modify static-ens33 ipv4.dns "1.1.1.1 8.8.8.8"
nmcli connection up static-ens33


▪️Стандарт для десктопов
▪️Основной сетевой менеджер в Fedora, CentOS и др.
▪️Удобен при сложных сетевых сценариях и динамических подключениях

▪️ Как Netplan и NetworkManager работают вместе

В Ubuntu Desktop схема следующая:

Netplan читает конфигурацию
В YAML указано renderer: NetworkManager
NetworkManager реально поднимает сеть

Пример:


network:
version: 2
renderer: NetworkManager


После этого весь контроль переходит NetworkManager, а Netplan становится лишь точкой начальной конфигурации.

#netplan #networkmanager

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

👓 Изоляция процессов без Docker

В linux есть встроенный механизм изоляции системных ресурсов - namespaces. Именно на нем основаны контейнеры вроде docker и LXC. Но namespaces можно использовать и напрямую без всяких надстроек.

Namespace - это способ ядра linux изолировать разные части системы: процессы, сеть, точки монтирования, пользователей и т.д.
Каждое приложение может жить в своем отдельном пространстве, не видя другие процессы и ресурсы.


▪️ Пример 1: изоляция процессов и монтирования. Запустим новую оболочку bash в отдельном пространстве процессов (PID) и монтирования (mount).


unshare --pid --mount --fork --mount-proc /bin/bash
ps aux

USER PID %CPU %MEM COMMAND
root 1 0.0 0.0 /bin/bash
root 18 0.0 0.0 ps aux


Здесь процесс bash получил PID 1 - он главный в своем изолированном пространстве. Теперь создадим изолированное монтирование:


mkdir /tmp/testdir /mnt/testdir
mount --bind /tmp/testdir /mnt/testdir
mount | grep testdir

/dev/sda3 on /mnt/testdir type ext4 (rw,relatime)


На хосте это монтирование вы не увидите, оно существует только внутри namespace.

▪️ Просмотр активных namespaces. Список всех пространств можно увидеть с помощью lsns:


lsns

NS TYPE NPROCS PID USER COMMAND
4026532480 pid 3 123 root unshare --pid --mount --fork --mount-proc /bin/bash
4026532481 mnt 3 123 root └─/bin/bash


Тут видны PID и MOUNT пространства, созданные нашей командой unshare. Если у вас работают контейнеры, их namespaces тоже будут отображены здесь.

▪️ Пример 2: запуск процессов в чужом namespace. Можно подключиться к уже существующему пространству с помощью nsenter.

Предположим, у нас есть процесс bash с PID 123. Подключимся к нему и запустим команду top:


nsenter -t 123 -p -m top


Теперь top выполняется внутри того же PID и mount namespace, что и процесс bash.

▪️ Полезные инструменты

unshare - создает новые namespaces.
nsenter - позволяет войти в уже существующие.
systemd-nspawn - мини-контейнерная система от systemd.

Пример запуска простого контейнера через systemd-nspawn:


systemd-nspawn -D /var/chroot/debian bash


#linux #namespaces

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

Как смотреть потоки процесса через ps, /proc и strace

Обычно при работе с ps мы смотрим процесс по PID или грепаем по имени:


ps -p 524 -o %mem,%cpu,cmd
ps ax | grep prometheus


Но часто удобнее сразу указать имя процесса через -C. Например, посмотрим потоки prometheus:


ps -T -C prometheus

PID SPID TTY TIME CMD
525 525 ? 00:55:34 prometheus
525 803 ? 00:03:10 prometheus
525 808 ? 00:09:22 prometheus
525 1054 ? 00:08:44 prometheus


PID - ID основного процесса
SPID - ID конкретного потока

▪️ Посчитать количество потоков


ps -T -C zabbix_server | wc -l


Важно: количество потоков и количество процессов - не одно и то же. Например:


ps -T -C zabbix_server | wc -l
ps ax | grep zabbix_server | wc -l


Результаты могут сильно отличаться.

▪️ Посмотреть нагрузку по потокам. Если приложение тормозит, полезно вывести CPU/MEM с разбивкой по потокам. Например, для процесса с PID 508:


ps -L -o spid,%mem,%cpu,cmd 508

SPID %MEM %CPU CMD
1070 0.6 0.0 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
1071 0.6 0.1 /usr/bin/python3 /usr/bin/fail2ban-server -xf start
1077 0.6 0.3 /usr/bin/python3 /usr/bin/fail2ban-server -xf start


Так можно увидеть, какой именно поток ест CPU.

▪️ Найти подробности потока через /proc. Если знаем PID процесса и SPID потока:


cat /proc/508/task/1077/stat


В начале строки можно увидеть имя потока, например:


1077 (f2b/f.wp-login)


У Fail2ban это может подсказать, какой jail сейчас нагружает систему. Больше информации:


cat /proc/508/task/1077/status


▪️ Подключить strace к конкретному потоку. strace умеет подключаться не только к PID процесса, но и к SPID потока:


strace -p 1077


На нагруженном сервере вывод быстро завалит консоль, поэтому лучше писать в файл:


strace -p 1077 -o ~/strace.out


Можно ограничить типы системных вызовов. Открытие файлов и чтение:


strace -p 1077 -e trace=openat,read


Запись:


strace -p 1077 -e trace=write


Сеть:


strace -p 1077 -e trace=connect,recvfrom,sendto


▪️ Через htop. В htop тоже можно смотреть трейсы. Выберите нужный процесс или поток и нажмите: s. Если strace установлен, htop покажет системные вызовы в реальном времени.

#linux #htop

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

⚙️ Автоматизация резервного копирования

rsync до сих пор остается самым простым и быстрым инструментом для резервного копирования с нескольких и более серверов. А если обернуть его в ansible, можно получить полностью автоматизированную и воспроизводимую систему бэкапов, без ручных скриптов и кронов вразнобой.

Ansible будет отвечать за логику: какие хосты, какие директории, куда складывать.
rsync за быструю передачу файлов.

▪️ Пример структуры проекта


backup/
├── inventory
├── playbook.yml
└── vars.yml


▪️ vars.yml


backup_src: "/var/www"
backup_dest: "/backups/{{ inventory_hostname }}/"


▪️ playbook.yml


- hosts: all
become: yes
vars_files:
- vars.yml
tasks:
- name: Создать директорию для бэкапов
file:
path: "{{ backup_dest }}"
state: directory
recurse: yes

- name: Rsync данных
synchronize:
src: "{{ backup_src }}/"
dest: "{{ backup_dest }}"
archive: yes
compress: yes
delete: no


synchronize - это модуль ansible, который под капотом использует rsync.

▪️ Планировщик на контроллере. Бэкапы можно запускать с машины-контроллера ansible через cron:


0 3 * * * ansible-playbook /opt/backup/playbook.yml


Теперь в 03:00 ночи ansible пройдет по инвентарю и снимет инкрементальные копии со всех серверов.

➕ Плюсы такого подхода

единая логика бэкапов;
легко масштабировать на новые сервера;
rsync быстро переносит только измененные файлы.

#ansible #backup

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

🖥 RemoteApp на Windows 10/11

Если вам нужно, чтобы пользователи запускали через RDP не целый рабочий стол, а только определенное приложение, то для этого подойдет режим RemoteApp. Он чаще ассоциируется с серверами windows, но его реально настроить и на обычной win 10/11.

▪️ Что нужно сделать на сервере (удаленном Windows).

1. Включить RDP-доступ.
2. Установить нужное приложение и добавить пользователя в группу Remote Desktop Users или дать право через политику безопасности.
3. Разрешить запуск неопубликованных программ как RemoteApp: либо через групповые политики, либо через реестр:


reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services" /v fAllowUnlistedRemotePrograms /t REG_DWORD /d 1


Перезагрузить компьютер.

Если хотите ограничить список доступных приложений, то создайте запись в реестре:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Terminal Server\TSAppAllowList\Applications\<AppName> с указанием пути, иконки и имени.

▪️ Как пользователь подключается

Открываете стандартный RDP-клиент (mstsc.exe) и настраиваете подключение, затем сохраняете его как файл .RDP.

Открываете .RDP в текстовом редакторе и добавляете в конец:


remoteapplicationmode:i:1
RemoteApplicationName:s:Имя_окна
RemoteApplicationProgram:s:"C:\path\to\app.exe"
DisableRemoteAppCheck:i:1
PromptForCredentials:i:0
alternate shell:s:rdpinit.exe


При запуске этого файла на клиенте откроется только окно указанного приложения так, словно оно запускается локально.

Если нужно передать аргументы запуска, можно добавить строку RemoteApplicationCmdLine:s:....

▪️ Что важно

Хотя RemoteApp официально поддерживается на серверах с ролью RDS, этот способ работает и на win 10/11.

При работе через RemoteApp запускается только окно приложения, рабочий стол пользователя остается недоступен. Это удобно, если нужно предоставить доступ к одной программе, не раскрывая систему целиком.

Для работы может потребоваться RDP Wrapper или другие обходы, если Windows пытается ограничить одновременные сеансы.

#windows #remoteapp

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

🔓 Ansible Vault: хранение секретов и паролей

Если вы работаете с Ansible, рано или поздно возникает вопрос: куда девать пароли, ключи, токены и прочее? Хранить их в открытом виде в репозитории - явно плохая идея. Для этого существует Ansible Vault - встроенный механизм шифрования файлов и переменных.

Vault позволяет безопасно хранить секреты прямо в плейбуках или отдельных файлах, а ansible будет расшифровывать их при выполнении. Все просто, удобно и без лишних зависимостей.

▪️ Шифруем файл. Создадим защищенный файл с переменными:


ansible-vault create secrets.yml


Откроется редактор, куда можно вписать переменные, например:


db_user: admin
db_pass: S3cretP@ss


Файл автоматически сохранится в зашифрованном виде.

▪️ Редактируем зашифрованный файл


ansible-vault edit secrets.yml


▪️ Расшифровка при необходимости. Если нужно временно получить обычный текст:


ansible-vault decrypt secrets.yml


И обратно:


ansible-vault encrypt secrets.yml


▪️ Использование в плейбуках. Зашифрованный файл подключается как обычно:


vars_files:
- secrets.yml


А запуск плейбука выглядит так:


ansible-playbook site.yml --ask-vault-pass


▪️ Частичное шифрование (опционально). Можно зашифровать только нужные переменные:


ansible-vault encrypt_string 'P@ssw0rd!' --name 'db_pass'


#ansible

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

🧑‍💻 Docker шпаргалка для ежедневной работы

▪️ Установка Docker


curl -o - https://get.docker.com | bash -


▪️ Работа с контейнерами

Запустить контейнер как службу (автостарт, проброс порта)


docker run -d -p 80:80 --restart always --name nginx-proxy nginx


Список контейнеров


docker ps # только запущенные
docker ps -a # все


Удаление контейнера


docker rm nginx-proxy # остановленного
docker rm -f nginx-proxy # принудительно


Остановить и удалить все контейнеры


docker stop $(docker ps -aq)
docker rm $(docker ps -aq)


▪️ Работа с образами

Просмотр и удаление


docker images
docker rmi nginx # удалить один
docker rmi $(docker images -aq) # удалить все


▪️ Внутри контейнера

Вход в bash


docker exec -it nginx-proxy bash


Логи


docker logs nginx-proxy
docker logs -n 100 nginx-proxy
docker logs -f nginx-proxy


Запущенные процессы


docker top nginx-proxy


▪️ Диагностика и мониторинг

Статистика ресурсов


docker stats nginx-proxy
docker stats prometheus exporter
docker stats prometheus --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"


Информация о контейнере


docker inspect nginx-proxy
docker inspect -f '{{ .NetworkSettings.Networks.bridge.IPAddress }}' nginx-proxy
docker inspect --format '{{json .Mounts}}' grafana | jq .


Проверить занимаемое место


docker system df


Очистить мусор


docker system prune


▪️ Работа с файлами

Копирование файлов


docker cp nginx-proxy:/etc/nginx/nginx.conf ~/nginx
docker cp ~/nginx/nginx.conf nginx-proxy:/etc/nginx


Экспорт файловой системы контейнера


docker export nginx-proxy -o ~/nginx-proxy.tar.gz


#docker

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

Дедлайн Новый год стучится в дверь! 😊

Я думаю, что все устали и всем пора отдыхать, набираться сил. Все дедлайны позади, а о будущих думать пока не стоит! 😊

Я пожелаю Вам хороших каникул, счастья, здоровья, поменьше выгорания и успехов в новом году! 😊

С наступающим, 2026! 😊

Читать полностью…

NetworkAdmin.ru

👀 Шпаргалка: куда делось свободное место

Полезное напоминание в преддверии новогодних праздников - проверить бэкапы и свободное место 🤔 Я лишь поделюсь небольшой шпаргалкой, по которой можно определить куда делось свободное место, если в какой-то момент оно вдруг исчезло.

▪️ Проверяем общий объём занятых данных


df -h


▪️ Выясняем, какие директории занимают больше всего. Самый простой вариант:


du -h -d 1 / | sort -hr
du -hs /* | sort -hr


Ограничиваем вывод:


du -h -d 1 / | sort -hr | head -10


Топ 20 самых объемных директорий:


du -hcx --max-depth=6 / | sort -rh | head -n 20


Топ 20 самых больших файлов:


find / -mount -ignore_readdir_race -type f -exec du -h "{}" + 2>&1 \
| sort -rh | head -n 20


▪️ Проверяем inodes (иногда забиваются они)


df -ih


▪️ Ищем удаленные, но все еще открытые файлы. Если du показывает меньше, чем df, виноваты могут быть процессы, держащие удалённые файлы:


lsof | grep '(deleted)'
lsof +L1


Если видите большие файлы - перезапустите сервис или убейте зависший процесс:


kill -9 <pid>


▪️ Проверяем точки монтирования

Классическая ловушка: данные пишутся в /mnt/backup, но диск в момент копирования не смонтирован. Файлы падают на корневую ФС, а после монтирования становятся невидимыми, но место продолжают занимать.

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

#linux #storage

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

⚙️ Восстановление GRUB и загрузки после сбоя

Если после обновления, кривой установки windows или повреждения разделов linux перестал загружаться, то почти всегда можно вернуть систему к жизни, просто восстановив GRUB.

1️⃣ Загружаемся с LiveCD. Любой дистрибутив подходит (Ubuntu, Debian, Fedora). Открываем терминал.

2️⃣ Находим Linux-раздел


lsblk


Ищем раздел, где стоит linux, например /dev/sda2.
Если отдельный /boot существует, то запомните и его.

3️⃣Монтируем систему


sudo mount /dev/sda2 /mnt


Если есть отдельный /boot:


sudo mount /dev/sda1 /mnt/boot


И обязательно системные каталоги:


for i in /dev /proc /sys /run; do sudo mount --bind $i /mnt$i; done


4️⃣ chroot внутрь системы


sudo chroot /mnt


Теперь вы внутри установленной системы, как будто загрузились в нее.

5️⃣ Восстанавливаем GRUB

BIOS/Legacy


grub-install /dev/sda
update-grub


UEFI


grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB
update-grub


Если каталог /boot/efi не смонтирован, то смонтируйте нужный EFI-раздел (lsblk -f покажет FAT32):


mount /dev/sda1 /boot/efi


6️⃣ Выходим и перезагружаемся


exit
sudo reboot


Если все сделано правильно система загрузится снова.

⚠️ Полезные советы

Если после восстановления GRUB старая windows не отображается, выполните:


os-prober && update-grub


Если GRUB ставится, но меню не появляется, включите отображение:


GRUB_TIMEOUT_STYLE=menu


При поврежденном ядре можно вручную выбрать старое в меню Advanced options.

#linux #grub

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

🖥 Навигация по файловой системе в виде дерева

Многие знают про tree, но мало кто знает про broot. Это консольный инструмент для навигации по файловой системе, который сочетает просмотр дерева, поиск, переходы и фильтры в одном интерфейсе.

▪️ Установка. На большинстве дистрибутивов достаточно:


curl -fsSL https://dystroy.org/broot/install.sh | bash


После установки появится командный алиас br, запускающий интерактивный браузер.

▪️ Что делает broot таким удобным?

1️⃣ Дерево каталогов без лишнего мусора. Показывает только важные директории и файлы, сворачивает вложенности и динамически подгружает структуру по мере просмотра.

2️⃣ Интерактивный поиск прямо в дереве. Начинаете печатать, а broot фильтрует дерево. Например, поиск всех файлов, связанных с nginx:


nginx


3️⃣ Быстрые переходы. Нужно перейти в каталог? Просто выделите его и нажмите enter. Никаких cd ../../../../../.

4️⃣ Быстрые действия. На выбранных файлах можно выполнять операции:

открыть в редакторе (e)
удалить (:rm)
показать подробности (:p)
копировать путь (:pp)

5️⃣ Работа с правами, git и скрытыми файлами. Broot умеет показывать статусы git, размеры, даты и многое другое.

▪️ Полезные ключи

- Показать размеры каталогов: br -s
- Открывать сразу в режиме изменения (как F2 в файловых менеджерах): br -c :focus
- Фильтровать только директории: type:d

#linux #tools

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

Заземление заказывали?

#юмор

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

SMB-сервер на Python

impacket - идеален для одноразовых задач: поднимаешь за пару команд, кидаешь файлы и завершаешь процесс.

▪️ Установка на Debian/Ubuntu:


apt install python3-impacket


▪️ Пример запуска (встроенный примерный скрипт):


cd /usr/share/doc/python3-impacket/examples/
python3 smbserver.py share /mnt/share -smb2support


Пояснения:

share - имя шары;
/mnt/share - директория, которую расшариваем (не забудьте права, для анонимного доступа удобно chmod 777 /mnt/share);
-smb2support - включить SMB2 (без этого Windows 10/11 иногда не подключаются).


Если нужна простая авторизация, можно указать логин/пароль:


python3 smbserver.py share /mnt/share -smb2support -username demo -password pass


⚠️ Важно: windows иногда пытается автоматически подключиться под текущей учеткой и не показывает диалог ввода пароля, в таких случаях полезно явно указать в проводнике «Connect using different credentials» или подключаться по IP с параметром учётных данных. С linux таких проблем нет, smbclient прекрасно работает:


smbclient -L 192.168.55.15 --user demo%pass
smbclient //192.168.55.15/share --user demo%pass


➕ Плюсы:

супер быстрый старт (одна команда);
нет необходимости править конфиги и заводить службу;
удобен для тестов и одноразовой передачи файлов.

➖ Минусы:

пакет impacket - большой и ориентирован в основном на сетевые инструменты (pentest/ssc), так что для постоянной работы лучше все же samba или ksmbd;
не для продакшена: минимальная безопасность, упрощенные механизмы аутентификации.

Для быстрых переносов файлов или тестов - это будет шикарный инструмент.

#SMB

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

🔠 Монтирование файловых систем через systemd

Хотя многие админы по привычке используют /etc/fstab, у systemd есть собственный механизм монтирования, который во многом удобнее и современнее.

📍 Почему systemd лучше, чем fstab?

1️⃣Автомонтирование при обращении - устройство подключается только тогда, когда к нему обращаются, и может автоматически отключаться по заданному таймауту.
2️⃣Автосоздание точек монтирования - systemd сам создает нужные директории, администратору не нужно следить за их наличием.
3️⃣Гибкая работа с таймаутами - если устройство недоступно, загрузка системы не повиснет, как это иногда бывает с fstab.
4️⃣Зависимости от сервисов - можно задать, что монтирование произойдёт только после старта VPN или другого сервиса, который необходим для доступа к диску.


▪️ Пример: локальный диск в /mnt/backup

1️⃣ Создаем юнит /etc/systemd/system/mnt-backup.mount:


[Unit]
Description=Disk for backups

[Mount]
What=/dev/disk/by-uuid/f774fad3-2ba0-47d1-a20b-0b1c2ae1b7d6
Where=/mnt/backup
Type=ext4
Options=defaults

[Install]
WantedBy=multi-user.target


2️⃣ Подготовка диска:


cfdisk /dev/sdb #создаем раздел
mkfs -t ext4 /dev/sdb1 #форматируем
blkid #смотрим UUID


3️⃣ Запуск и включение автозагрузки:


systemctl daemon-reload
systemctl start mnt-backup.mount
systemctl enable mnt-backup.mount


▪️ Пример: автомонтирование NFS через VPN. Для сетевых дисков будет удобнее использовать .automount. Он подключает ресурс по требованию и может отмонтировать при простое.

/etc/systemd/system/mnt-backup.mount:


[Unit]
Description=NFS share

[Mount]
What=srv.example.com:/backup/nfs_share
Where=/mnt/backup
Type=nfs4
Options=rw
TimeoutSec=15


/etc/systemd/system/mnt-backup.automount:


[Unit]
Description=NFS share
Requires=network-online.target
BindsTo=openvpn@client.service
After=openvpn@client.service

[Automount]
Where=/mnt/backup
TimeoutIdleSec=60

[Install]
WantedBy=graphical.target


Включаем:


systemctl daemon-reload
systemctl enable --now mnt-backup.automount


Теперь:

при старте системы диск не монтируется сразу;
при первом обращении к /mnt/backup - идет подключение NFS через VPN;
при остановке openvpn@client.service диск автоматически отмонтируется.

#systemd #fstab

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

📱 Windows в контейнере

На GitHub есть готовый способ запустить windows прямо в контейнере docker, без ручной настройки виртуалок. Все автоматизировано и работает поверх KVM. Ссылка: https://github.com/dockur/windows

▪️ Первые шаги

Разворачивать все на виртуальной машине с включенной вложенной виртуализацией. Выставляется тип процессора в host и на этом все. Дальше - стандартный старт:


git clone https://github.com/dockur/windows
cd windows
docker compose up


Контейнер создался и попытался загрузить образ windows 11. Но тут ошибка: microsoft заблокировала скачивание ISO с моего IP. Выход есть - можно скачать ISO вручную и передать контейнеру, но можно и проще: переключить версию на windows 10.

▪️ Настройка версии Windows. В файле docker-compose.yml достаточно задать переменную окружения:


version: "3"
services:
windows:
environment:
VERSION: "win10"


После этого запускаем снова:


docker compose up


Контейнер скачивает ISO Windows 10, разворачивает его и устанавливает систему в автоматическом режиме. Через 30 минут будет готовая, неактивированная, но полностью легальная Windows.

▪️ Доступ и управление. За установкой можно наблюдать через веб-интерфейс (порт 8006):


http://<ip_сервера>:8006


После установки доступ к системе:

через браузер (встроенный VNC),
или по RDP (пользователь docker, пароль — пустой).

▪️ Ресурсы по умолчанию. Контейнеру выделяется:

2 CPU
4 GB RAM
64 GB диска

Все параметры можно менять в environment. Важно следить за свободным местом!

▪️ Итог

Не нужно вручную поднимать виртуалки, скачивать ISO или прописывать драйверы. Просто запускаете контейнер и получаете готовую Windows, работающую поверх KVM. Docker тут используется не ради контейнеризации, а ради автоматизации всего процесса.

#docker #windows

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

И не говори, что не захотел

#юмор

🧑‍💻 NetworkAdmin

Читать полностью…

NetworkAdmin.ru

🖥 Курсы по PostgreSQL

Если вы работаете с PostgreSQL или только планируете - обратите внимание бесплатные курсы от компании Postgres Professional. Это один из немногих примеров, когда коммерческая компания делится полноценной учебной программой без ограничений.

Ссылка: https://postgrespro.ru/education/courses

▪️ Доступные курсы для администраторов PostgreSQL

DBA1 - базовое администрирование PostgreSQL
DBA2 - настройка и мониторинг
DBA3 - резервное копирование и репликация
QPT - оптимизация запросов
PGPRO - возможности Postgres Pro Enterprise

Каждый курс - это набор подробных презентаций и видео, охватывающих реальные задачи администрирования. Проходить можете в любом порядке, если нужно что-то точечно узнать - добро пожаловать.

▪️ Пример

Хотите разобраться с резервным копированием и репликацией?

Перейдите в DBA3, тема 2. Базовая резервная копия. Вы узнаете про холодные и горячие бэкапы, различия подходов, используемые инструменты и проверку восстановления.

(не реклама)

#postgresql #database

🧑‍💻 NetworkAdmin

Читать полностью…
Subscribe to a channel