journalctl - это инструмент работы с логами systemd.
journalctl -u ssh
journalctl -u nginx -u php-fpm
Последние записи сервиса в реальном времени (аналог tail -f):
journalctl -u nginx -f
journalctl --since "2025-10-01" --until "2025-10-15"
journalctl --since "1 hour ago"
journalctl --since yesterday
journalctl -u ssh | grep "Failed password"
Или встроенный фильтр по приоритету (severity):
journalctl -p err -u ssh
(-p принимает диапазон: -p warning..crit)
journalctl -b # текущая загрузка
journalctl -b -1 # предыдущая загрузка
journalctl -b -2 # еще раньше
Сохранить в файл:
journalctl -u nginx --since today > nginx.log
Экспорт в бинарный лог и перенос на другой сервер:
journalctl --vacuum-time=7d # удалить старше 7 дней
journalctl --vacuum-size=1G # ограничить объем
#systemd #journalctl
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
Please open Telegram to view this post
VIEW IN TELEGRAM
😁21❤4👌3
Когда разворачиваешь кластер или нужно повторить одинаковые действия на нескольких серверах, очень помогает режим синхронизации панелей в tmux. С ним одна команда сразу выполняется во всех открытых панелях.
apt install tmux
Ctrl+B % - вертикальное разделениеCtrl+B " - горизонтальное разделениеCtrl+B :) вводим:
:setw synchronize-panes
Теперь все, что вводите в активной панели, автоматически дублируется во все остальные.
Отключение производится той же командой.
Если работаете с одним и тем же стендом регулярно, то можно написать конфиг для tmux или скрипт, который сразу запускает сессию и подключает нужные SSH-сессии.
#linux #terminal
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12
Иногда необходимо жестко контролировать, какие ядра процесс может занимать, например, чтобы тяжелые задачи не забивали сервер или чтобы критичные сервисы не конкурировали за ресурсы. В linux это решается утилитой
taskset, которая позволяет как изменять affinity уже работающих процессов, так и запускать новые с заданными ограничениями.
ps aux | grep myapp
pidof myapp
pgrep -f myapp
Посмотрим CPU в системе:
lscpu | grep -E 'CPU\(s\)|NUMA'
Пример вывода:
CPU(s): 8
NUMA node0 CPU(s): 0-7
Допустим, нам нужно посадить процесс на ядра 0–2. Для этого:
taskset -pc 0-2 1574
Пример результата:
pid 1574's current affinity list: 0-7
pid 1574's new affinity list: 0,1,2
Теперь процесс гарантированно не займет остальные ядра.
Как работает маска?
Каждое ядро - это один бит:
Ядро Маска
0 1
1 2
2 4
3 8
… …
Например:
ядра 1 и 2 = 2 + 4 = 6 → маска 0x06
Пример запуска с ограничением на одно ядро. Запустить программу только на ядре 0:
taskset 1 gzip hugefile
(маска 1 = ядро 0)
Пример: запуск на ядрах 2 и 3
Маска: 4 + 8 = 12 = c
taskset c gzip hugefile
taskset -pc 4-5 $(pidof systemd-journald)
А теперь смотрим его маску:
taskset -p $(pidof systemd-journald)
Пример:
pid 412's current affinity mask: 30
Вот и маска.
dd if=/dev/urandom of=/tmp/testfile bs=1M count=200
Запускаем xz только на ядрах 0 и 1 (маска 3):
taskset 3 xz -T2 /tmp/testfile
Смотрим в htop и процесс будет занимать строго эти два ядра.
#linux #taskset
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1
Nmap - это не только сканер портов, но и инструмент для быстрой диагностики сети. Небольшая подборка команд, которые часто выручали меня в работе.
nmap -Pn -sS -T4 10.20.1.5
SYN-скан, не пингуем сначала, быстрый тайминг.
nmap -sV --top-ports 100 10.20.1.0/24
Узнаем версии сервисов по 100 самым распространенным портам в подсети.
nmap -p- -T4 10.20.1.5
Сканируем все 65535 TCP-портов.
sudo nmap -sU --top-ports 50 10.20.1.5
UDP требует прав root и больше времени - выбирайте топ-порты.
sudo nmap -A 10.20.1.5
Включает обнаружение ОС, версий, скрипты и traceroute.
nmap --noscript ssl-enum-ciphers,http-noscript -p 443,80 10.20.1.5
Проверяем SSL-шифры и заголовок сайта.
nmap -sV -oA scans/site_scan 10.20.1.0/24
Создаст
site_scan.nmap, .gnmap и .xml - будет удобно для отчетов.
nmap -sn 10.20.1.0/24
Быстрый ping-scan, покажет кто в сети сейчас.
#nmap #network
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19❤3😁1
Иногда нужно выяснить, было ли соединение на SSH-порт сервера (обычно 22) с конкретного адреса. Казалось бы, задача простая, но есть несколько подходов - как для активных соединений, так и для анализа постфактум.
Современный инструмент - ss:
ss -ntu | grep ':22'
Аналог - netstat:
netstat -ntu | grep ':22'
Еще один полезный вариант - lsof:
lsof -ni TCP:22
SSH по умолчанию пишет в системный журнал (
/var/log/auth.log или /var/log/secure), но для других сервисов можно включить логирование через firewall.Пример для iptables:
iptables -N ssh_in
iptables -A INPUT -p tcp --dport 22 -j ssh_in
iptables -A ssh_in -j LOG --log-level info --log-prefix "--IN--SSH-- "
iptables -A ssh_in -j ACCEPT
Теперь все подключения на порт 22 будут попадать в syslog.
Хотите отдельный лог - добавьте правило в rsyslog.
На практике часто используют отдельные цепочки (INPUT, OUTPUT, FORWARD), куда добавляют правила для логирования нужных адресов и портов.
cat /proc/net/nf_conntrack | grep 'dport=22'
По сути, ss и netstat читают данные именно отсюда.
#network
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
Три основных механизма, которые могут использоваться в linux:
Где искать системные задания:
/etc/crontab
/etc/cron.d/
/etc/cron.hourly/
/etc/cron.daily/
/etc/cron.weekly/
/etc/cron.monthly/
Где искать пользовательские задания:
/var/spool/cron/crontabs
или просто:
crontab -u user01 -l
Каждый пользователь имеет свой отдельный список задач.
Они более гибкие: умеют запускать сервисы с зависимостями, работать после событий, логировать в journal и даже поддерживают случайные задержки.
Посмотреть список таймеров:
systemctl list-timers
Все таймеры, включая неактивные:
systemctl list-timers --all
Подробнее о конкретном таймере:
systemctl status logrotate.timer
Примеры стандартных таймеров, установленных по умолчанию:
apt-daily.timer
fstrim.timer
logrotate.timer
anacron.timer
Идеален для задач вроде: выполни через 5 минут и забудь.
В Debian 11+ утилита не устанавливается по умолчанию, но в CentOS/RHEL она ещё есть:
apt install at
Проверить очередь задач:
atq
Добавить разовую задачу:
echo "shutdown -h now" | at -m 10:20
Задачи хранятся в:
/var/spool/cron/atjobs/
или /var/spool/at/
#cron
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2
iperf3 - показывает реальную пропускную способность между двумя хостами, минуя влияние дисков, приложений и прочего. Ранее уже был пост - ссылка. Здесь продолжение, с реальным примером замера и полезными флагами.
iperf3 работает по схеме клиент–сервер.
Один узел запускается в режиме сервера, второй - в режиме клиента.
Сервер принимает входящий трафик, а клиент его генерирует.
iperf3 -s
не забываем, что по умолчанию слушает порт 5201, он должен быть открыт.
iperf3 -c 192.168.1.10
Результат:
[ 5] 0.00-10.00 sec 1.09 GBytes 935 Mbits/sec sender
[ 5] 0.00-10.00 sec 1.09 GBytes 935 Mbits/sec receiver
То есть реальная пропускная способность между хостами - ~935 Мбит/с.
-R - измерение скорости в обратном направлении (reverse).
iperf3 -c 192.168.1.10 -R
iperf3 -c 192.168.1.10 -u -b 500M
-f - единицы измерения (m для Mbits, M для MBytes):
iperf3 -c 192.168.1.10 -f m
iperf3 -s & ssh user@192.168.1.10 'iperf3 -c $(hostname -I | awk "{print \$1}") -P 4'
Скрипт запускает сервер локально и клиент удаленно, автоматически подключая IP.
#network #iperf3
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16❤1
Один из частых вопросов: почему система грузится так долго? Для раскрытия этой тайны можно использовать встроенный инструмент
systemd-analyze, который покажет подробную статистику загрузки и поможет найти узкие места.
systemd-analyze
Пример вывода:
Startup finished in 2.351s (kernel) + 8.512s (userspace) = 10.863s
kernel - время работы ядра до запуска systemd
userspace - запуск сервисов и инициализация systemd
итоговое время загрузки
systemd-analyze blame
Вывод отсортирован по времени запуска. На первых строках будут виновники торжества.
systemd-analyze critical-chain
Она покажет цепочку сервисов, которые напрямую влияют на общее время старта.
Для детального графа в SVG:
systemd-analyze plot > boot.noscript
Файл можно открыть в браузере - это визуализация всех юнитов и их зависимостей.
systemctl disable bluetooth.service
systemctl disable cups.service
Например, если дольше всего грузится NetworkManager-wait-online.service, можно сократить или отключить ожидание сети.
systemctl mask service_name
#systemd #boot
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤3
IPv6 давно перестал быть экзотикой в мире, но в локальной инфраструктуре (особенно в корпоративных и домашних сетях) его почти никто не использует. Причина простая - в локалках адреса не заканчиваются, да и пользы от IPv6 нет, если нет связи с интернетом, где он действительно нужен.
А вот проблем добавить он может:
требует отдельной настройки безопасности,
нужно следить за совместимостью сервисов,
а если забыть про firewall для IPv6, то появится открытая дыра, о которой даже не узнаете.
Если протокол вам не нужен, то его стоит отключить.
Сделать это можно тремя способами, в зависимости от ситуации.
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
Примените изменения:
sysctl -p
Откройте
/etc/default/grub и добавьте в строку:
GRUB_CMDLINE_LINUX="... ipv6.disable=1"
(оставшиеся параметры не удаляйте, просто добавьте через пробел)
Обновите конфигурацию загрузчика:
update-grub # Debian/Ubuntu
dpkg-reconfigure grub-pc
grub-mkconfig -o /boot/grub/grub.cfg
grub2-mkconfig -o /boot/grub2/grub.cfg # RHEL/CentOS
После этого - перезагрузка и проверка:
ip a
ss -tulnp
Если IPv6 отключен - адресов вида ::1 или fe80:: вы больше не увидите.
Добавьте в
/etc/sysctl.conf:
net.ipv6.conf.eth0.disable_ipv6 = 1
или примените временно:
sysctl -w net.ipv6.conf.eth0.disable_ipv6=1
На windows лучше IPv6 не отключать. По словам microsoft, это может вызвать проблемы с внутренними сервисами и сетевыми компонентами системы.
#IPv6 #network
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤3
Если нужно показать работу скрипта, но не отдавать исходники - можно скомпилировать его в бинарник через shc. Инструмент преобразует .sh в C-код и собирает исполняемый файл, на выходе пользователь получит работающий бинарник, но не читаемый скрипт.
apt install shc gcc
noscript.sh:#!/bin/bash
v=$1
echo "Simple BASH noscript. Entered VARIABLE: $v"
Компилируем:
shc -f -r noscript.sh
Появятся
noscript.sh.x (бинарник) и noscript.sh.x.c (сгенерированный C). Запуск:./noscript.sh.x 123
# Simple BASH noscript. Entered VARIABLE: 123
-e DD/MM/YYYY - срок годности; после даты бинарник не запустится.
-m "msg" - сообщение при истечении срока.
Пример с истечением:
shc -e 31/12/2025 -m "Срок истек" -f -r noscript.sh
./noscript.sh.x # Выдаст сообщение о просрочке
📌 Важное замечание по безопасности
shc - это обфускация, а не криптография. В конечном бинарнике содержимое может быть восстановлено (есть утилиты вроде UnSHc). Также секреты, записанные в скрипт, при выполнении будут лежать в памяти и их можно попытаться снять дампом. Это защита от случайного копирования, но не от целенаправленного анализа.
#noscript #security
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍8❤4🤡1
Если вы хотите получить максимально легкий и чистый образ windows 11 - без мусора, предустановленных приложений и ненужных сервисов, то обратите внимание на nano11.
Это PowerShell-скрипт, который автоматизирует процесс сборки сильно урезанной версии Windows 11. Он использует встроенные средства DISM и oscdimg.exe, не требуя никаких внешних утилит. В результате получается компактный ISO-образ, идеально подходящий для тестирования, отладки или развертывания на виртуальных машинах.
Создает минимальный ISO-образ Windows 11
Удаляет все предустановленные приложения и лишние компоненты
Не поддерживает обновления и добавление языков (только базовая сборка)
Подходит для VM и изолированных окружений
Полностью открытый исходный код, можно модифицировать под свои задачи
Репозиторий проекта
#windows #powershell
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤7🔥3
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14🫡3💩1
Бывает такое, что сервер уже настроен и работает, но не покидает ощущение - вдруг что-то упустил, оставил какую-то уязвимость - незащищенные параметры SSH, лишние службы, слабые настройки sysctl. Чтобы быстро проверить систему, удобно использовать Lynis, инструмент для аудита безопасности и оценки соответствия стандартам.
Lynis - это утилита с открытым исходным кодом, которая выполняет анализ конфигурации linux и unix подобных систем и выдает рекомендации по усилению безопасности. Она проверяет десятки аспектов системы:
настройки ядра и PAM,
файрвол и службы,
права на файлы,
SSH, cron, логирование,
пакеты и обновления.
apt install lynis #debian или ubuntu
yum install lynis #CentOS
lynis audit system
После выполнения вы получите подробный отчет с результатами и рекомендациями.
Файл отчета по умолчанию сохраняется в:
/var/log/lynis.logа краткий отчет в:
/var/log/lynis-report.datВ конце проверки Lynis показывает оценку безопасности - чем она выше, тем лучше.
Также будут даны рекомендации, например:
[WARNING] SSH root login is enabled
[SUGGESTION] Install a firewall management tool (ufw/firewalld)
Просто проходите по списку и исправляйте. После доработок можно снова запустить аудит и посмотреть, насколько улучшился индекс.
Официальный сайт
#linux #security
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍16❤1
Иногда нужно быстро поделиться файлами между машинами - без nginx, apache и прочих решений. Для этого можно использовать встроенный веб-сервер python:
python3 -m http.server 8000
Он идеально подходит, когда нужно просто раздать файлы по HTTP: перешел в нужную директорию, запустил сервер, скачал - готово.
Но недавно понадобился HTTPS-сервер, так как приложение отказывалось работать по обычному HTTP. Настраивать nginx для этого не хотелось, и, как оказалось, все можно сделать тем же питоном, буквально в несколько строк.
openssl req -new -x509 -keyout localhost.pem -out localhost.pem -days 365 -nodes
webserver.py:
import http.server, ssl
server_address = ('172.20.0.210', 8000)
httpd = http.server.HTTPServer(server_address, http.server.SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(
httpd.socket,
server_side=True,
certfile='localhost.pem',
ssl_version=ssl.PROTOCOL_TLSv1_2
)
httpd.serve_forever()
Запуск:
python3 webserver.py
После этого открываем в браузере:
https://172.20.0.210:8000
и видим содержимое директории (или сайт, если там есть index.html).
#python #https
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12🔥3❤1
Решил посмотреть, как на практике сбрасывается пароль root, и заодно поделиться с вами. Это классическая задача, которую часто дают на собеседованиях.
Цель - получить доступ к системе с правами root, даже если пароль неизвестен. Сделать это можно, изменив параметры загрузки ядра в GRUB.
1. Включаем сервер и ждем появления меню загрузки GRUB.
2. Выбираем нужный пункт и нажимаем
e (латинскую).3. В открывшемся редакторе ищем строку, начинающуюся с linux или linux16.
4. В самый конец этой строки добавляем:
rw init=/bin/bash
Это позволит запустить оболочку bash вместо стандартного systemd.
5. Нажимаем
Ctrl+X или F10 для загрузки. После старта вы сразу окажетесь в консоли под пользователем root без пароля. Теперь можно просто задать новый пароль:
passwd
и перезагрузить систему:
exec /sbin/init
или
reboot -f
Параметр
init= сообщает ядру, какой процесс нужно запустить первым.Обычно это
/sbin/init (или systemd), который отвечает за загрузку системы.Когда мы подменяем его на
/bin/bash, система вместо полноценной инициализации попадает прямо в консоль.Фактически, вы оказываетесь в самой ранней стадии загрузки с полными правами root.
В системах вроде RHEL, CentOS, AlmaLinux, RockyLinux используется немного другой вариант:
rw rd.break enforcing=0
После загрузки окажетесь в emergency shell, где также сможете сбросить пароль через passwd.
#linux #security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23
GnuPG (GNU Privacy Guard) - это открытая реализация стандарта OpenPGP (RFC 4880). Она позволяет:
шифровать и расшифровывать данные;
подписывать файлы и сообщения;
проверять подлинность данных;
управлять ключами (создавать, экспортировать, отзывать и т.д.).
Работает на всех системах - linux, macOS, windows, и не требует никаких внешних сервисов.
gpg --full-generate-key
Тут нужно указать тип ключа (обычно RSA), длину (2048–4096), срок действия и e-mail для идентификации. После этого ключ сохраняется в
~/.gnupg/.
gpg --list-keys
gpg --export -a user@networkadmin.ru > public.key
gpg --export-secret-keys -a user@networkadmin.ru > private.key
gpg --import public.key
Шифрование файла:
gpg -e -r user@networkadmin.ru secret.txt
Создается файл secret.txt.gpg, который можно расшифровать только соответствующим приватным ключом.
Расшифровка:
gpg -d secret.txt.gpg > secret.txt
Подпись файла:
gpg -s file.txt
Проверка подписи:
gpg --verify file.txt.sig file.txt
Проверить, какой ключ используется по умолчанию:
gpg --list-secret-keys --keyid-format LONG
Удалить ключ:
gpg --delete-key user@networkadmin.ru
Создать зашифрованный архив с tar:
tar cz folder | gpg -c > archive.tar.gz.gpg
#gpg #security
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Современные серверы и маршрутизаторы давно умеют не только работать с iptables и NAT, они вполне способны участвовать в динамической маршрутизации на уровне провайдерского оборудования. Два наиболее популярных решения для этого: BIRD и FRRouting (FRR).
Если вы используете статические маршруты (ip route add ...), то при изменении топологии сети приходится вручную обновлять таблицы маршрутов.
Динамические протоколы решают это автоматически: маршрутизаторы обмениваются маршрутами между собой, выбирают оптимальные пути и обновляют таблицы без участия администратора.
Основные протоколы:
OSPF (Open Shortest Path First) - для внутренних сетей (IGP)
BGP (Border Gateway Protocol) - для внешних соединений (межсетевые маршруты между организациями)
BIRD - это компактное и производительное решение, часто используемое в инфраструктуре провайдеров. Поддерживает IPv4, IPv6, OSPF, BGP, RIP и static.
Установка:
apt install bird # debian или ubuntu
Пример конфигурации OSPF:
protocol ospf {
area 0 {
interface "eth0" {
cost 10;
};
};
}
Пример простого BGP сессии:
protocol bgp mypeer {
local as 65001;
neighbor 192.168.1.2 as 65002;
import all;
export all;
}
Файлы конфигурации находятся в
/etc/bird/.После изменения конфигурации не обязательно перезапускать демон, можно использовать:
birdc configure
Установка:
apt install frr frr-pythontools # debian или ubuntu
Конфигурация BGP (пример):
router bgp 65001
bgp router-id 192.168.1.1
neighbor 192.168.1.2 remote-as 65002
network 10.0.0.0/24
Запуск FRR:
systemctl enable frr
systemctl start frr
Конфигурация хранится в
/etc/frr/frr.conf. Для управления используется утилита vtysh, она похожа на CLI сетевых устройств cisco или mikrotik.#linux #networking
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8