NetworkAdmin.ru
الذهاب إلى القناة على Telegram
Авторский блог про сетевое и системное администрирование. Сайт: networkadmin.ru Реклама: @dad_admin Биржа: https://telega.in/c/networkadminru
إظهار المزيد4 715
المشتركون
-124 ساعات
-37 أيام
+1230 أيام
أرشيف المشاركات
4 715
👀 stat: что можно узнать о файле кроме ls -l
Для быстрой проверки файла обычно используют:
ls -l file.log
Но ls показывает далеко не все. Если нужно понять, что именно происходит с файлом, полезнее команда stat.
▪️ Пример:
stat /var/log/syslog
В выводе можно увидеть: • размер файла • количество занятых блоков • inode • права доступа • UID/GID владельца • файловую систему • время последнего чтения • время изменения содержимого • время изменения метаданныхОсобенно полезны три временные метки:
Access: последнее чтение файла
Modify: изменение содержимого
Change: изменение метаданных
Например, если файл не менялся, но у него обновился Change, значит могли изменить права, владельца или другие метаданные.
▪️ Посмотреть inode:
stat -c '%i' file.log
▪️ Размер:
stat -c '%s bytes' file.log
▪️ Права в числовом виде:
stat -c '%a' file.log
▪️ Владелец и группа:
stat -c '%U:%G' file.log
▪️ Удобно собрать все в одну строку:
stat -c 'file=%n inode=%i size=%s owner=%U:%G mode=%a' file.log
Например:
file=file.log inode=131089 size=2048 owner=root:adm mode=640
#linux #stat
🧑💻 NetworkAdmin4 715
👂 Zabbix: как убрать мигающие PROBLEM/OK события
Одна из типичных проблем мониторинга - триггер постоянно переключается:
PROBLEM → OK → PROBLEM → OK
Например, CPU Load скачет около порога 5. Если условие выглядит так:
last(/Linux server/system.cpu.load[all,avg1])>5
то при значениях:
5.1 - PROBLEM
4.9 - OK
5.2 - PROBLEM
Zabbix начинает генерировать лишние события и уведомления.
▪️ Для этого и нужна гистерезисная логика: порог входа в проблему и порог выхода из нее должны отличаться. Problem expression:
avg(/Linux server/system.cpu.load[all,avg1],5m)>5
Проблема создается, если средняя нагрузка за 5 минут выше 5. А для восстановления задаем отдельное Recovery expression:
avg(/Linux server/system.cpu.load[all,avg1],5m)<4
Получается:
Load > 5 - PROBLEM
Load 4–5 - состояние не меняется
Load < 4 - OK
То есть небольшие колебания возле порога больше не заставляют триггер постоянно открываться и закрываться.
▪️ Еще лучше не использовать одиночное last(), если метрика сама по себе шумная. Например:
min(/Linux server/system.cpu.util[,user],5m)>90
означает, что CPU должен оставаться выше 90% весь рассматриваемый интервал, а не просто один раз прыгнуть до 95%.
Так Zabbix начинает реагировать на устойчивое изменение состояния, а не на каждый скачок графика.
#zabbix #monitoring
🧑💻 NetworkAdmin4 715
🤩 Linux network namespaces: маленькая отдельная сеть внутри одного сервера
В Linux можно создать отдельное сетевое пространство прямо внутри одного хоста. Для этого используются network namespaces. У каждого namespace могут быть свои:
• сетевые интерфейсы • IP-адреса • маршруты • ARP-таблица • firewall-правила • loopback-интерфейс▪️ Создадим два namespace:
ip netns add ns1
ip netns add ns2
▪️ Теперь соединим их виртуальным Ethernet-кабелем - veth:
ip link add veth1 type veth peer name veth2
ip link set veth1 netns ns1
ip link set veth2 netns ns2
▪️ Назначим адреса:
ip netns exec ns1 ip addr add 10.10.10.1/24 dev veth1
ip netns exec ns2 ip addr add 10.10.10.2/24 dev veth2
▪️ Поднимем интерфейсы:
ip netns exec ns1 ip link set veth1 up
ip netns exec ns2 ip link set veth2 up
ip netns exec ns1 ip link set lo up
ip netns exec ns2 ip link set lo up
▪️ Проверяем:
ip netns exec ns1 ping 10.10.10.2
Получается небольшая изолированная сеть:
ns1 ns2
10.10.10.1 <--- veth ---> 10.10.10.2
Посмотреть namespaces:
ip netns list
Выполнить команду внутри конкретного namespace:
ip netns exec ns1 ip route
ip netns exec ns1 ss -lnt
#linux #networking
🧑💻 NetworkAdmin4 715
✍️ printf вместо echo: почему в скриптах это иногда принципиально
echo кажется самым простым способом вывести текст в bash:
echo "backup completed"
И для обычных сообщений этого часто достаточно. Проблемы начинаются, когда в строке появляются \n, \t, -n, обратные слеши или данные из переменных. Например:
text="-n test"
echo "$text"
Поведение echo в разных shell и реализациях может отличаться: где-то -n будет воспринят как опция, где-то escape-последовательности будут обработаны иначе.
С printf результат предсказуемее:
printf '%s\n' "$text"
То же самое касается форматированного вывода:
name="db01"
status="OK"
printf 'Server: %-10s Status: %s\n' "$name" "$status"
Получим:
Server: db01 Status: OK
Еще один момент - не стоит передавать переменную как format string:
printf "$message"
Если внутри $message окажется %s, %d или другая последовательность форматирования, результат может быть неожиданным. Правильнее:
printf '%s\n' "$message"
Если нужен перенос строки:
printf 'First line\nSecond line\n'
Если перенос не нужен:
printf '%s' "Processing..."
#linux #bash
🧑💻 NetworkAdmin4 715
⭐️ Invoke-Command: удаленное управление Windows без RDP
Если нужно выполнить одну и ту же команду сразу на нескольких windows-серверах, подключаться к каждому по RDP совсем не обязательно. В PowerShell для этого есть
Invoke-Command. Командлет работает через PowerShell Remoting на базе WinRM/WS-Management и позволяет выполнять команды или целые скрипты на удаленных машинах.
▪️ Что умеет:
• Выполнять команды сразу на нескольких компьютерах • Запускать задачи в фоне через `-AsJob` • Работать с постоянными PowerShell-сессиями • В PowerShell 6+ подключаться к удалённым системам через SSH▪️ Например, проверим Windows Update сразу на двух серверах:
Invoke-Command -ComputerName Server01,Server02 -ScriptBlock {
Get-Service wuauserv
}
А если нужно выполнить более сложную проверку:
Invoke-Command -ComputerName Server01,Server02 -ScriptBlock {
Get-CimInstance Win32_OperatingSystem |
Select-Object CSName,LastBootUpTime
}
▪️ Для длительной операции можно не блокировать текущую консоль:
$job = Invoke-Command -ComputerName Server01,Server02 `
-ScriptBlock { Get-WindowsUpdateLog } -AsJob
Get-Job
Receive-Job $job
#powershell #windows
🧑💻 NetworkAdmin4 715
🧐 Как запустить отдельную linux-систему внутри работающего сервера
В debian есть небольшая, но полезная утилита
debootstrap. Она позволяет развернуть минимальную работающую систему прямо в обычном каталоге уже запущенного linux. На практике это дает довольно интересные возможности. Можно:
• быстро получить чистую debian-среду для тестов
• зайти в нее через chroot
• подготовить rescue-окружение
• запустить SSH и подключаться к этой системе отдельно
• использовать ее для восстановления основной ОС
• работать с дисками основной системы из независимого окружения
▪️ Простой пример. Устанавливаем debootstrap и разворачиваем Debian 12:
apt install debootstrap
mkdir /mnt/debootstrap
debootstrap bookworm \
/mnt/debootstrap \
http://deb.debian.org/debian
Теперь подключаем системные псевдофайловые системы:
mount --bind /dev /mnt/debootstrap/dev
mount --bind /dev/pts /mnt/debootstrap/dev/pts
mount --bind /proc /mnt/debootstrap/proc
mount --bind /sys /mnt/debootstrap/sys
И заходим внутрь:
chroot /mnt/debootstrap
Все - мы уже находимся в отдельной минимальной Debian 12.
▪️ Можно установить нужные инструменты:
passwd
apt update
apt install tmux openssh-server
▪️ При необходимости можно настроить SSH и запустить его внутри chroot. Например, изменить порт:
Port 222
PermitRootLogin yes
После запуска SSH выйти из chroot:
exit
И подключиться к новой системе:
ssh -p 222 root@10.50.20.14
Получается довольно необычная конструкция:
┌──────────────────────────────┐
│ Основная Linux-система │
│ │
│ /mnt/debootstrap │
│ │ │
│ └── Debian 12 │
│ └── chroot │
│ └── sshd │
└──────────────────────────────┘
▪️ А теперь самое интересное. chroot не является полноценной виртуализацией. Новая система использует ядро основной ОС и имеет доступ к тем ресурсам, которые ей предоставили. Поэтому такое окружение можно использовать как своеобразную аварийную систему, запущенную поверх работающего сервера. Например, можно разместить минимальную систему в tmpfs:
mkdir /mnt/rescue
mount -t tmpfs -o size=2G tmpfs /mnt/rescue
Скопировать туда подготовленное окружение, примонтировать /dev, /proc, /sys, выполнить chroot - и получить независимый userspace, который продолжает работать даже при серьезных проблемах с основной системой. Это особенно интересно для VPS и удаленных серверов, где нет нормальной KVM/IPMI-консоли и нельзя просто загрузиться с rescue ISO.
#debian #debootstrap
🧑💻 NetworkAdmin4 715
🤩 Как грепнуть вывод, который "не грепается"
Иногда команда что-то выводит в терминал, но обычный
grep внезапно ничего не находит.
Хороший пример - проверка модулей Nginx:
nginx -V
На экране получаем длинную строку с параметрами сборки. Пробуем найти нужный модуль:
nginx -V | grep http_realip_module
И получаем пустой результат.
Причина в том, что nginx -V пишет вывод не в stdout, а в stderr. А пайп | по умолчанию передает дальше только stdout. Решение:
nginx -V 2>&1 | grep http_realip_module
Конструкция:
2>&1
перенаправляет stderr в stdout, после чего вывод уже можно нормально передавать в grep, awk, sed и другие утилиты.
Но есть еще один нюанс: параметры nginx -V обычно идут одной длинной строкой. Чтобы сделать вывод более читаемым, можно разбить его по пробелам:
nginx -V 2>&1 | tr ' ' '\n' | grep http_realip_module
Получим:
--with-http_realip_module
2>&1 - объединяем stderr и stdout
tr ' ' '\n' - заменяем пробелы переносами строк
grep - ищем нужный параметр
Тот же прием полезен не только с Nginx. Например:
command 2>&1 | grep error
Если не уверены, куда именно программа пишет данные, это хороший первый тест.
Посмотреть потоки отдельно тоже можно:
command >stdout.log 2>stderr.log
#bash #grep
🧑💻 NetworkAdmin4 715
💚 Test-NetConnection: удобная диагностика сети в Windows без telnet
В PowerShell есть встроенная команда
Test-NetConnection, которую удобно использовать для быстрой сетевой диагностики. У нее есть короткий alias:
tnc
1️⃣ Быстрая проверка сетевого подключения. Можно запустить просто:
tnc
PowerShell выполнит стандартную сетевую проверку и покажет полезную информацию:
ComputerName : internetbeacon.msedge.net
RemoteAddress : 13.107.4.52
InterfaceAlias : Ethernet
SourceAddress : 192.168.50.24
PingSucceeded : True
PingReplyDetails (RTT) : 28 ms
Сразу видно:
• какой интерфейс используется • локальный IP • удаленный IP • проходит ли ICMP • RTTЭто особенно удобно на ноутбуках и рабочих станциях, где одновременно могут быть активны Ethernet, Wi-Fi, VPN и несколько виртуальных адаптеров. 2️⃣ Проверка TCP-порта. Один из самых полезных сценариев:
tnc app01.pc_02.local -Port 443
Пример результата:
ComputerName : app01.pc_02.local
RemoteAddress : 10.30.10.15
RemotePort : 443
InterfaceAlias : Ethernet
SourceAddress : 192.168.50.24
TcpTestSucceeded : True
Если:
TcpTestSucceeded : True
TCP-соединение до указанного порта устанавливается. Если False - дальше уже проверяем firewall, маршрут, NAT и слушает ли сервис порт.
По сути, для обычной проверки доступности TCP это удобная замена telnet. Не нужно отдельно устанавливать Telnet Client и потом выходить из открытого соединения.
3️⃣ Трассировка маршрута
tnc 8.8.8.8 -TraceRoute
Полезно, когда нужно быстро посмотреть путь до узла без отдельного tracert. Есть и подробный режим:
tnc db01.networkadmin.local -Port 5432 -InformationLevel Detailed
А если нужен только результат проверки:
tnc db01.networkadmin.local -Port 5432 -InformationLevel Quiet
Получим просто: True
Это удобно и в скриптах:
if (tnc db01.networkadmin.local -Port 5432 -InformationLevel Quiet) {
"PostgreSQL доступен"
}
#windows #network
🧑💻 NetworkAdmin4 715
❌ UAC в Windows Server: почему админ не всегда "полный админ"
В Windows Server можно войти под учеткой из группы Administrators и все равно получить:
Access denied. Это не баг. Чаще всего причина - UAC.
После входа администратор обычно получает два security token:
• обычный, с урезанными правами
• elevated, с полными административными правами
Поэтому PowerShell или CMD, запущенные обычным способом, могут работать не так, как ожидается.
▪️ Проверить, входит ли пользователь в локальные администраторы:
whoami /groups
Но наличие группы Administrators еще не означает, что текущий процесс уже elevated.
▪️ Быстрая проверка PowerShell:
$principal = New-Object Security.Principal.WindowsPrincipal(
[Security.Principal.WindowsIdentity]::GetCurrent()
)
$principal.IsInRole(
[Security.Principal.WindowsBuiltInRole]::Administrator
)
Если вернулось:
False
текущий PowerShell работает без elevation.
▪️ Запустить elevated-консоль можно через:
Start-Process powershell.exe -Verb RunAs
После подтверждения UAC откроется новый процесс уже с повышенными правами.
▪️ Еще одна типичная ситуация - удаленное администрирование. Локальная админская учетная запись при подключении по сети может получить отфильтрованный token из-за Remote UAC. Поэтому команда локально работает, а через удаленный вызов — Access denied.
#windowsserver #uac
🧑💻 NetworkAdmin4 715
🦖 GNU parallel: когда xargs уже мало для массовых задач
Для простого параллельного запуска часто хватает xargs:
cat hosts.txt | xargs -n1 -P4 ping -c 1
Но когда задача становится сложнее - несколько аргументов, логирование, сохранение порядка вывода, запуск на удаленных хостах - удобнее использовать GNU parallel.
▪️ Установка:
apt install parallel
▪️ Базовый пример:
parallel -j 4 ping -c 1 ::: 10.20.0.11 10.20.0.12 10.20.0.13
-j 4 означает, что одновременно выполнять максимум 4 задания.
Если список лежит в файле:
parallel -j 8 'curl -fsS http://{}/health' :::: hosts.txt
Здесь {} заменяется текущей строкой из входных данных.
Можно удобно работать с именами файлов:
find /var/log -name '*.gz' -print0 |
parallel -0 -j 4 'gzip -t {}'
Или обрабатывать изображения, архивы, бэкапы и любые другие массовые задачи.
▪️ Одна из полезных возможностей - сохранить порядок вывода:
parallel -k -j 4 'echo START {}; sleep 2; echo DONE {}' ::: srv1 srv2 srv3
Без -k результаты будут появляться по мере завершения задач.
▪️ Для контроля ошибок:
parallel --halt soon,fail=1 -j 4 './deploy.sh {}' :::: hosts.txt
Если одна задача завершится с ошибкой, новые задания перестанут запускаться.
▪️ Можно даже запускать команды по SSH:
parallel -S server1,server2 'hostname; uptime' ::: 1
▪️ Когда использовать что
xargs -P отлично подходит, если нужно:
быстро распараллелить одну простую команду минимум синтаксиса не нужен сложный контроль выполнения
parallel удобнее, когда нужны:
несколько источников аргументов управление количеством джобов сохранение порядка вывода остановка при ошибках удаленный запуск более сложные шаблоны командНапример:
parallel -j 6 './backup.sh {} > logs/{}.log 2>&1' :::: databases.txt
Шесть баз обрабатываются одновременно, а каждая пишет в свой лог.
#bash #parallel #xargs
🧑💻 NetworkAdmin4 715
🔍 Как посмотреть environment-переменные запущенного процесса
Иногда во время диагностики нужно понять, в каком окружении реально запущено приложение. Например:
• какой PATH оно видит • какой HOME используется • под каким пользователем работает • какие переменные передал systemd • какой config-файл или endpoint попал в environment▪️ Почти вся информация о процессе в linux доступна через:
/proc/<PID>/
▪️ Окружение процесса хранится здесь:
/proc/<PID>/environ
Например:
cat /proc/1427/environ
Но вывод выглядит примерно так:
LANG=en_US.UTF-8PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/binHOME=/var/lib/prometheusUSER=prometheus...
Причина в том, что переменные в /proc/<PID>/environ разделены не переносами строк, а символом NUL. Поэтому читать такой вывод неудобно.
▪️ Один из простых вариантов - использовать xargs:
xargs -0 -n1 < /proc/1427/environ
Получим уже нормальный список:
LANG=en_US.UTF-8
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
HOME=/var/lib/prometheus
USER=prometheus
LOGNAME=prometheus
SHELL=/usr/sbin/nologin
То же самое можно сделать через tr:
tr '\0' '\n' < /proc/1427/environ
Если нужен конкретный параметр:
tr '\0' '\n' < /proc/1427/environ | grep '^PATH='
▪️ PID процесса можно быстро найти так:
pgrep -a prometheus
или:
systemctl show prometheus -p MainPID
Еще один вариант:
ps eww -p 1427
Он тоже покажет environment, но для большого количества переменных вывод обычно получается менее читаемым.
#proc #environment
🧑💻 NetworkAdmin4 715
🔐 PASSWD_NOTREQD в Active Directory: почему этот флаг нужно контролировать
При стандартной парольной политике Active Directory пользователь не может иметь пустой пароль, если в домене настроены минимальная длина и требования к сложности. Но есть исключение - флаг:
PASSWD_NOTREQD
В PowerShell он отображается как:
PasswordNotRequired
Если этот атрибут включен у учетной записи, AD допускает сценарий, при котором для пользователя пароль может не требоваться. Сам по себе флаг не означает, что пароль обязательно пустой. Но его наличие уже повод проверить учетную запись внимательнее.
▪️ Найти всех пользователей с включенным PasswordNotRequired:
Get-ADUser -Filter {PasswordNotRequired -eq $true} `
-Properties PasswordNotRequired |
Select-Object SamAccountName,Enabled,PasswordNotRequired
Особенно важно проверить: • привилегированные учетные записи • сервисные аккаунты • старые или забытые учетные записи • пользователей, созданных через автоматизацию • тестовые аккаунты, которые случайно остались в проде▪️ Дополнительно можно вывести больше информации:
Get-ADUser -Filter {PasswordNotRequired -eq $true} `
-Properties PasswordNotRequired,LastLogonDate,Description |
Select-Object SamAccountName,Enabled,LastLogonDate,Description
▪️ Если флаг не нужен, его можно отключить:
Set-ADUser -Identity "test-user" -PasswordNotRequired $false
После этого стоит убедиться, что у учетной записи установлен нормальный пароль и на нее распространяется актуальная парольная политика.
#activeDirectory #security
🧑💻 NetworkAdmin4 715
🪄 Почему просто пробросить порт иногда не работает
Классическая задача: есть сервер за NAT, нужно открыть наружу его сервис. Делаем DNAT:
iptables -t nat -A PREROUTING \
-p tcp --dport 8443 \
-j DNAT --to-destination 10.20.0.15:443
И кажется, что все готово. Но клиент подключиться не может. Проблема в том, что NAT в linux тесно связан с conntrack - механизмом отслеживания состояний соединений.
Ядро запоминает:
клиент → внешний IP:8443
↓ DNAT
10.20.0.15:443
И ожидает, что обратный трафик пройдет через тот же NAT-хост.
Если бэкенд отвечает клиенту через другой gateway, получаем асимметричную маршрутизацию:
Client → NAT → Backend
Client ←────── Backend
Клиент отправлял запрос одному адресу, а ответ пришел другим путем. TCP-сессия ломается.
Поэтому вместе с DNAT часто требуется SNAT/MASQUERADE:
iptables -t nat -A POSTROUTING \
-d 10.20.0.15 \
-p tcp --dport 443 \
-j MASQUERADE
Теперь бэкенд отвечает NAT-серверу, а тот корректно выполняет обратную трансляцию.
▪️ Посмотреть состояния conntrack:
conntrack -L
▪️ Отфильтровать нужный порт:
conntrack -L -p tcp --dport 443
▪️ Статистика:
conntrack -S
▪️ Еще одна распространенная проблема - таблица conntrack переполнена. Проверяем:
sysctl net.netfilter.nf_conntrack_max
cat /proc/sys/net/netfilter/nf_conntrack_count
Если значения почти одинаковые, новые соединения могут начать отбрасываться. В логах при этом можно увидеть:
nf_conntrack: table full, dropping packet
Диагностику проброса порта удобно начинать с tcpdump:
tcpdump -i any -nn port 8443 or port 443
Если SYN приходит на внешний интерфейс, но не уходит к бэкенду - смотрим NAT/firewall. Если уходит, но ответа нет - проверяем бэкенд и его маршрутизацию. Если SYN-ACK возвращается, но клиент его не получает - смотрим обратный NAT и conntrack.
#network #conntrack
🧑💻 NetworkAdmin4 715
✍️ DNS-диагностика без гадания и браузера
Когда сайт не открывается, очень легко сразу обвинить nginx, firewall или приложение. Но проблема может быть банально в DNS. Для нормальной диагностики удобнее всего использовать
dig.
▪️ Базовый запрос:
dig networkadmin.ru
В ответе нас обычно интересует секция:
ANSWER SECTION
Именно там видно, в какой IP резолвится имя.
▪️ Посмотреть только результат без лишнего вывода:
dig +short networkadmin.ru
▪️ Проверить конкретный DNS-сервер:
dig @8.8.8.8 networkadmin.ru
Например, можно сравнить внутренний и публичный DNS:
dig @10.20.0.10 app.networkadmin.ru
dig @1.1.1.1 app.networkadmin.ru
Если ответы разные - возможно, используется split DNS.
▪️ Проверить конкретный тип записи:
dig A networkadmin.ru
dig AAAA networkadmin.ru
dig MX networkadmin.ru
dig TXT networkadmin.ru
dig NS networkadmin.ru
Полезно при диагностике почты, IPv6, SPF/DKIM и делегирования домена.
▪️ Посмотреть цепочку DNS-разрешения от корневых серверов:
dig +trace networkadmin.ru
Это помогает понять, на каком уровне ломается делегирование.
▪️ Еще один важный параметр - TTL:
dig networkadmin.ru
Число перед типом записи в ANSWER SECTION- показывает, сколько секунд ответ еще может храниться в кеше.
Для reverse DNS:
dig -x 203.0.113.15
▪️ Проверить, какой DNS реально использует linux:
cat /etc/resolv.conf
А при systemd-resolved:
resolvectl status
#dns #dig
🧑💻 NetworkAdmin4 715
✨ Systemd-команды, которые быстро дают информацию о системе
У systemd есть несколько команд, которыми удобно пользоваться почти на любом современном linux-дистрибутиве. Плюс в том, что интерфейс везде примерно одинаковый: ubuntu, debian, rocky и другие системы.
1️⃣ hostnamectl - что это вообще за сервер
Одна из самых полезных команд:
hostnamectl
Например, на ubuntu server вывод может выглядеть так:
Static hostname: app-prod-02
Icon name: computer-vm
Chassis: vm
Machine ID: 97e42f42c9da49e39a8c0fcb45a2d772
Boot ID: 8aa12e8be6874464a2ec83c070bdcc76
Virtualization: kvm
Operating System: Ubuntu 24.04.2 LTS
Kernel: Linux 6.8.0-60-generic
Architecture: x86-64
Hardware Vendor: QEMU
Hardware Model: Standard PC
Сразу видно: hostname дистрибутив версию ядра архитектуру виртуализацию производителя виртуального железаТо есть одной командой можно быстро понять, куда вообще подключился: VM это, железо или другая среда. Во многих случаях hostnamectl заменяет несколько отдельных команд:
uname -a
cat /etc/os-release
lsb_release -a
2️⃣ timedatectl - время, timezone и синхронизация
timedatectl
Пример:
Local time: Mon 2026-09-17 11:38:42 CEST
Universal time: Mon 2026-09-17 09:38:42 UTC
RTC time: Mon 2026-09-17 09:38:42
Time zone: Europe/Berlin (CEST, +0200)
System clock synchronized: yes
NTP service: active
RTC in local TZ: no
Полезно, когда нужно сразу проверить: локальное время UTC timezone работает ли синхронизация в каком режиме RTCЕсли нужно просто посмотреть текущую дату и время:
date
Но для диагностики NTP удобнее именно timedatectl.
3️⃣ loginctl - кто подключен и что делает
Без параметров:
loginctl
показывает активные пользовательские сессии.
Например:
SESSION UID USER SEAT LEADER CLASS TTY IDLE
3 1001 admin - 1842 user pts/0 no
А подробности можно получить так:
loginctl session-status 3
Пример:
3 - admin (1001)
Since: Mon 2026-09-17 11:20:15 CEST; 18min ago
Leader: 1842 (sshd)
Remote: 10.40.12.27
Service: sshd; type tty; class user
State: active
Unit: session-3.scope
├─1842 "sshd: admin@pts/0"
├─1850 -bash
└─2141 loginctl session-status 3
Здесь уже видно: когда подключился пользователь откуда пришел SSH PID сессии какие процессы внутри нее запущеныДля быстрой проверки пользователей я чаще использовал бы:
w
who
id
Но loginctl полезен, когда нужны именно детали systemd-сессии.
4️⃣ journalctl - системные логи
Одна из основных команд:
journalctl
Чаще всего полезны варианты:
journalctl -b
journalctl -u nginx
journalctl -p err
journalctl -f
То есть: логи текущей загрузки логи конкретного сервиса только ошибки просмотр в реальном времени5️⃣ localectl - locale и раскладка
localectl
Покажет системную locale и настройки клавиатуры.
Например:
System Locale: LANG=en_US.UTF-8
VC Keymap: (unset)
X11 Layout: us
Для обычной проверки переменных окружения часто достаточно:
locale
Но localectl удобен именно как systemd-интерфейс для системных настроек locale.
#linux #systemd
🧑💻 NetworkAdmin4 715
CENTI CONF: DevOps Day — митап по разработке и инженерным решениям ⚡️
6 ноября Centicore Group собирает инженеров и технических специалистов, чтобы поговорить о том, что реально болит в инфраструктуре: от Kubernetes и AI-инструментов до архитектурного контроля.
🗓 Когда: 6 ноября 2026, начало в 18:00 (мск)
📍 Где: Москва, Хлебозавод, Гостиная №9 + онлайн-формат
Что будет:
🧑💻 Разбор реальных задач
Инженерные кейсы, рабочие подходы и решения для своих проектов.
☸️ Kubernetes
Как организовать тестирование на k8s, где чаще ошибаются и каких антипаттернов избегать.
🤖 AI и LLM
Где coding agents ускоряют разработку, как не утонуть в техдолге и что нужно для локального запуска LLM.
🏗 Архитектура
Как сделать так, чтобы архитектурные правила работали не только в документации, но и проверялись автоматически.
👥 Нетворкинг и доступ к записям выступлений после митапа.
Регистрация на митап тут: https://tglink.io/4d4a3d99ef4800?erid=2W5zFH68SEd, увидимся 🤝
4 715
🖥 Get-ADUser: полезные примеры для работы с пользователями Active Directory
Get-ADUser - один из самых часто используемых PowerShell-командлетов при работе с active directory. С его помощью можно получать информацию о пользователях:
логин и имя email отдел и должность компанию состояние учетной записи дату истечения пароля дополнительные AD-атрибутыДля работы нужен модуль:
ActiveDirectory
На контроллерах домена он обычно уже установлен. На рабочих станциях и рядовых серверах его можно добавить через RSAT.
▪️ Проверить наличие модуля:
Get-Module -ListAvailable ActiveDirectory
▪️ Вывести всех пользователей домена:
Get-ADUser -Filter *
Но по умолчанию Get-ADUser возвращает только базовый набор свойств.
▪️ Если нужны дополнительные атрибуты, используем -Properties. Например, посмотреть все свойства пользователя:
Get-ADUser -Identity "petrov" -Properties *
Вывести только нужные поля:
Get-ADUser -Identity "petrov" `
-Properties Company,Department,Title,Mail |
Select-Object Name,Company,Department,Title,Mail
▪️ Один из самых полезных вариантов - фильтрация пользователей. Например, найти активные учетные записи без заполненного email:
Get-ADUser -Filter {
Enabled -eq $true -and Mail -notlike "*"
} -Properties Mail |
Select-Object Name,SamAccountName,Mail
Найти пользователей с истекшим паролем:
Get-ADUser -Filter {
Enabled -eq $true
} -Properties PasswordExpired |
Where-Object PasswordExpired |
Select-Object Name,SamAccountName,PasswordExpired
Найти пользователей определенного отдела:
Get-ADUser -Filter {
Department -eq "IT"
} -Properties Department,Title |
Select-Object Name,Department,Title
▪️ Можно сразу выгрузить результат в CSV:
Get-ADUser -Filter * `
-Properties Mail,Department,Title |
Select-Object Name,SamAccountName,Mail,Department,Title |
Export-Csv C:\Temp\ad-users.csv -NoTypeInformation -Encoding UTF8
#powershell #activedirectory
🧑💻 NetworkAdmin4 715
👁🗨 Хочешь разбираться в информационной безопасности, а не просто копировать чужие команды?
• netskings — авторский канал про кибербезопасность, компьютерные сети и OSINT.
• Разборы TCP/IP, VLAN и STP, антивирусов, криптографии, инструментов разведки и пентеста с основ, понятным языком и без лишней воды.
👉 Подписаться на netskings
4 715
🥱
Как быстро разобраться с дисками и маунтами
Когда на сервере несколько дисков, LVM, отдельные разделы и сетевые маунты, быстро понять "что куда примонтировано" бывает не так просто. Для базовой диагностики хватает трех команд:
1️⃣ lsblk - структура дисков
lsblk
Покажет диски, разделы, LVM и точки монтирования.
Более полезный вариант:
lsblk -f
Здесь дополнительно видны:
файловая система;
UUID;
label;
mount point
Например:
sda
├─sda1 ext4 /boot
└─sda2 LVM2_member
├─vg-root ext4 /
└─vg-data xfs /data
Если нужно увидеть размеры и тип устройств:
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
2️⃣ blkid - UUID и тип файловой системы
blkid
Полезно, когда нужно проверить запись в /etc/fstab.
Например:
/dev/sdb1: UUID="a1b2-c3d4" TYPE="ext4"
После этого можно использовать UUID вместо /dev/sdb1:
UUID=a1b2-c3d4 /backup ext4 defaults 0 2
Это надежнее, потому что имя устройства после перезагрузки теоретически может измениться.
3️⃣ findmnt - что реально примонтировано
findmnt
Показывает дерево текущих маунтов.
Для конкретного каталога:
findmnt /data
Очень удобно, когда непонятно, на какой файловой системе лежит путь:
findmnt -T /var/lib/myapp/data/file.db
Команда покажет mount point, устройство и тип файловой системы, которые реально обслуживают этот файл.
Посмотреть только ext4:
findmnt -t ext4
Проверить /etc/fstab:
findmnt --verify
У каждой команды своя задача:
lsblk - какие блочные устройства есть и как они связаны
blkid - UUID, LABEL и тип файловой системы
findmnt - что и куда реально примонтировано
#storage #filesystem
🧑💻 NetworkAdmin4 715
🔎 TCP keepalive: как находить мертвые соединения до того, как они создадут проблему
Иногда TCP-соединение выглядит живым, хотя в реальности удаленная сторона уже давно недоступна.
Например: клиент выключился; оборвался VPN; пропал маршрут; firewall удалил state; NAT-сессия протухла; сервер завис без корректного закрытия соединения.Если по соединению нет трафика, приложение может еще долго считать его активным. Для таких случаев в TCP есть механизм keepalive. ▪️ Проверить текущие настройки linux:
sysctl net.ipv4.tcp_keepalive_time
sysctl net.ipv4.tcp_keepalive_intvl
sysctl net.ipv4.tcp_keepalive_probes
Типичная логика такая:
tcp_keepalive_time - сколько ждать простоя до первой проверки
tcp_keepalive_intvl - интервал между проверками
tcp_keepalive_probes - сколько неудачных попыток сделать
Например:
sysctl -w net.ipv4.tcp_keepalive_time=300
sysctl -w net.ipv4.tcp_keepalive_intvl=30
sysctl -w net.ipv4.tcp_keepalive_probes=5
В этом случае после 5 минут простоя ядро начнет проверять соединение, а при отсутствии ответа будет делать повторные попытки.
▪️ Для постоянной настройки:
cat > /etc/sysctl.d/99-tcp-keepalive.conf <<'EOF'
net.ipv4.tcp_keepalive_time=300
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_keepalive_probes=5
EOF
sysctl --system
▪️ Посмотреть активные TCP-соединения:
ss -nto
▪️ Подробнее по конкретному соединению:
ss -ti
Но есть важный нюанс: системные значения работают только для сокетов, где приложение вообще включило SO_KEEPALIVE. То есть одной настройки sysctl иногда недостаточно. Например, nginx, PostgreSQL, HAProxy, SSH и различные runtime могут иметь собственные keepalive-параметры.
▪️ У SSH есть похожий механизм на уровне приложения:
ServerAliveInterval 30
ServerAliveCountMax 3
Это уже не TCP keepalive, но задача похожая - быстрее понять, что удаленная сторона больше не отвечает.
#tcp #keepalive
🧑💻 NetworkAdmin