4722
Авторский блог про сетевое и системное администрирование. Сайт: networkadmin.ru Реклама: @dad_admin Биржа: https://telega.in/c/networkadminru
🔒 Защита DNS-запросов на практике
DNS - это всегда один из самых уязвимых элементов сети. Каждый раз, когда вы вводите сайт в браузере, ваш компьютер отправляет незашифрованный запрос к DNS-серверу, спрашивая: какой IP-адрес у этого домена? Эти запросы можно перехватить, подменить или использовать для слежки. Чтобы защитить пользователей и инфраструктуру, появились две технологии: DNSSEC и DNS over HTTPS (DoH).
▪️ DNSSEC - подписи и верификация ответов. DNSSEC - это расширение классического DNS, добавляющее цифровую подпись к каждому ответу.
Задача DNSSEC гарантировать целостность и подлинность данных, а не шифровать трафик.
Принцип работы:
Каждый домен имеет криптографическую пару ключей (DNSKEY).
Ответ DNS подписывается приватным ключом.
Клиент или DNS-сервер-посредник проверяет подпись с помощью публичного ключа, опубликованного в зоне.
Если подпись не сходится - ответ считается поддельным.
Пример проверки DNSSEC с помощью dig:
dig linux.org +dnssec
/etc/systemd/resolved.conf:
[Resolve]
DNS=1.1.1.1#cloudflare-dns.com
DNSOverTLS=yes
dnscrypt-proxy, который поддерживает и DoH, и DoT (DNS over TLS).Cloudflare (1.1.1.1) - поддерживает DNSSEC и DoH;Google Public DNS (8.8.8.8) - поддерживает DNSSEC;Quad9 (9.9.9.9) - DoH + фильтрация вредоносных доменов.
curl -s https://cloudflare-dns.com/dns-query?name=example.com -H 'accept: application/dns-json'
Фигня все эти ваши криптовалюты 😎
#юмор
🧑💻 NetworkAdmin
🧑💻 Отладка контейнеров без инструментов
Иногда нужно что-то быстро продебажить внутри контейнера: посмотреть процессы, сделать ping, проверить DNS или снять tcpdump. Но чаще всего внутри контейнера нет вообще ничего, кроме самого приложения.
В таких случаях идеально подходит специальный контейнер: Network-Multitool
Его также часто используют и в кубере - для отладки сетей, проверки маршрутов и соединений между подами.
▪️ Пример использования. Создадим контейнер с Nginx, где нет даже ps:
docker run --name nginx -d -p 8080:80 nginx
docker exec -it nginx bash
ps axf
bash: ps: command not found
docker run --rm -it \
--network=container:nginx \
--pid container:nginx \
wbitt/network-multitool:alpine-extra bash
ps axf
PID TTY STAT TIME COMMAND
47 pts/0 Ss 0:00 bash
60 pts/0 R+ 0:00 \_ ps axf
1 ? Ss 0:00 nginx: master process nginx -g daemon off;
29 ? S 0:00 nginx: worker process
30 ? S 0:00 nginx: worker process
🖥 Динамическая маршрутизация (OSPF/BGP)
Современные серверы и маршрутизаторы давно умеют не только работать с iptables и NAT, они вполне способны участвовать в динамической маршрутизации на уровне провайдерского оборудования. Два наиболее популярных решения для этого: BIRD и FRRouting (FRR).
Если вы используете статические маршруты (ip route add ...), то при изменении топологии сети приходится вручную обновлять таблицы маршрутов.
Динамические протоколы решают это автоматически: маршрутизаторы обмениваются маршрутами между собой, выбирают оптимальные пути и обновляют таблицы без участия администратора.
Основные протоколы:
OSPF (Open Shortest Path First) - для внутренних сетей (IGP)
BGP (Border Gateway Protocol) - для внешних соединений (межсетевые маршруты между организациями)
apt install bird # debian или ubuntu
protocol ospf {
area 0 {
interface "eth0" {
cost 10;
};
};
}
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
router bgp 65001
bgp router-id 192.168.1.1
neighbor 192.168.1.2 remote-as 65002
network 10.0.0.0/24
systemctl enable frr
systemctl start frr
/etc/frr/frr.conf. Для управления используется утилита vtysh, она похожа на CLI сетевых устройств cisco или mikrotik.
🏃♂️ Сброс пароля root в linux через GRUB
Решил посмотреть, как на практике сбрасывается пароль root, и заодно поделиться с вами. Это классическая задача, которую часто дают на собеседованиях.
Цель - получить доступ к системе с правами root, даже если пароль неизвестен. Сделать это можно, изменив параметры загрузки ядра в GRUB.
e (латинскую).
rw init=/bin/bash
Ctrl+X или F10 для загрузки. После старта вы сразу окажетесь в консоли под пользователем root без пароля. Теперь можно просто задать новый пароль:
passwd
exec /sbin/init
reboot -f
init= сообщает ядру, какой процесс нужно запустить первым./sbin/init (или systemd), который отвечает за загрузку системы./bin/bash, система вместо полноценной инициализации попадает прямо в консоль.
rw rd.break enforcing=0
🤠 Быстрый аудит безопасности
Бывает такое, что сервер уже настроен и работает, но не покидает ощущение - вдруг что-то упустил, оставил какую-то уязвимость - незащищенные параметры 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
[WARNING] SSH root login is enabled
[SUGGESTION] Install a firewall management tool (ufw/firewalld)
🏠 Создание минималистичного образа Windows 11
Если вы хотите получить максимально легкий и чистый образ windows 11 - без мусора, предустановленных приложений и ненужных сервисов, то обратите внимание на nano11.
Это PowerShell-скрипт, который автоматизирует процесс сборки сильно урезанной версии Windows 11. Он использует встроенные средства DISM и oscdimg.exe, не требуя никаких внешних утилит. В результате получается компактный ISO-образ, идеально подходящий для тестирования, отладки или развертывания на виртуальных машинах.
Никто не обещал, что в жизни все будет легко
#юмор
🧑💻 NetworkAdmin
🕘 Оптимизация загрузки системы
Один из частых вопросов: почему система грузится так долго? Для раскрытия этой тайны можно использовать встроенный инструмент systemd-analyze, который покажет подробную статистику загрузки и поможет найти узкие места.
▪️ Базовый анализ времени загрузки. Простейшая команда:
systemd-analyze
Startup finished in 2.351s (kernel) + 8.512s (userspace) = 10.863s
systemd-analyze blame
systemd-analyze critical-chain
systemd-analyze plot > boot.svg
systemctl disable bluetooth.service
systemctl disable cups.service
systemctl mask service_name
Тикет: ЭЦП не работает
#юмор
🧑💻 NetworkAdmin
☁️ Как проверить обращения на TCP-порт 22 от клиента с нужного IP
Иногда нужно выяснить, было ли соединение на SSH-порт сервера (обычно 22) с конкретного адреса. Казалось бы, задача простая, но есть несколько подходов - как для активных соединений, так и для анализа постфактум.
▪️ Активные подключения. Если соединение активно прямо сейчас, смотрим его в списке сетевых сокетов.
Современный инструмент - ss:
ss -ntu | grep ':22'
netstat -ntu | grep ':22'
lsof -ni TCP:22
/var/log/auth.log или /var/log/secure), но для других сервисов можно включить логирование через firewall.
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
cat /proc/net/nf_conntrack | grep 'dport=22'
🖥 Nmap - полезные сценарии
Nmap - это не только сканер портов, но и инструмент для быстрой диагностики сети. Небольшая подборка команд, которые часто выручали меня в работе.
▪️ Быстрый обзор хоста
nmap -Pn -sS -T4 10.20.1.5
nmap -sV --top-ports 100 10.20.1.0/24
nmap -p- -T4 10.20.1.5
sudo nmap -sU --top-ports 50 10.20.1.5
sudo nmap -A 10.20.1.5
nmap --script ssl-enum-ciphers,http-title -p 443,80 10.20.1.5
nmap -sV -oA scans/site_scan 10.20.1.0/24
site_scan.nmap, .gnmap и .xml - будет удобно для отчетов.
nmap -sn 10.20.1.0/24
🎤 Один ввод, а команды на всех хостах
Когда разворачиваешь кластер или нужно повторить одинаковые действия на нескольких серверах, очень помогает режим синхронизации панелей в tmux. С ним одна команда сразу выполняется во всех открытых панелях.
▪️ Установка
apt install tmux
Ctrl+B % - вертикальное разделениеCtrl+B " - горизонтальное разделениеCtrl+B :) вводим:
:setw synchronize-panes
✏️ Шпаргалка по journalctl
journalctl - это инструмент работы с логами systemd.
▪️ Фильтрация по сервисам и юнитам. Посмотреть логи конкретной службы:
journalctl -u ssh
journalctl -u nginx -u php-fpm
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"
journalctl -p err -u ssh
journalctl -b # текущая загрузка
journalctl -b -1 # предыдущая загрузка
journalctl -b -2 # еще раньше
journalctl -u nginx --since today > nginx.log
journalctl --vacuum-time=7d # удалить старше 7 дней
journalctl --vacuum-size=1G # ограничить объем
♥️ Что такое blackhole в сети
Часто говорят, что при DDoS провайдер отправляет трафик в blackhole. Это не метафора - blackhole (или nullroute) - реальная запись в таблице маршрутизации, которая заставляет ядро молчаливо отбрасывать пакеты к указанному адресу/сети.
▪️ Создание черной дыры для одного IP:
ip route add blackhole 10.20.30.40
ip route show | grep blackhole
ip route add blackhole 203.0.113.0/24
ip -6 route add blackhole 2001:db8::/32
ip route del blackhole 203.0.113.0/24
ip route add prohibit 10.0.0.0/8
ip route add unreachable 10.0.0.0/8
🏠 Управление windows серверами как по SSH
PowerShell - это не просто консоль, а полноценная среда для удаленного администрирования. Один из ее инструментов - PowerShell Remoting, позволяющий выполнять команды и скрипты на других windows серверах (и даже на linux) почти так же, как по SSH.
PowerShell Remoting - это механизм, основанный на WinRM (Windows Remote Management), который реализует стандарт WS-Management.
Он позволяет запускать команды, выполнять скрипты и даже открывать интерактивную сессию на удаленной машине.
По сути, это SSH для windows, встроенный в систему начиная с windows 7 / server 2008 R2.
Enable-PSRemoting -Force
Get-Service WinRM
Invoke-Command -ComputerName server01 -ScriptBlock { Get-Service }
Enter-PSSession -ComputerName server01
$session = New-PSSession -ComputerName server01
Invoke-Command -Session $session -ScriptBlock { Get-Process }
Remove-PSSession $session
Enter-PSSession -HostName server01 -UserName admin
Invoke-Command -ComputerName (Get-Content servers.txt) -ScriptBlock { Restart-Service spooler }
Invoke-Command -ComputerName * -ScriptBlock { Get-HotFix }
📱 Генератор конфигураций Nginx
Хочу напомнить о полезном сервисе для генерации конфигов nginx - https://nginxconfig.io/
▪️ Как работает
Вы просто заполняете форму: указываете домен, корневую директорию, нужные параметры HTTPS, настройки для WordPress, PHP-FPM, Node.js или Python. На выходе получаете полный набор конфигов, аккуратно разделённых на смысловые части:
основной конфиг Nginx;
настройки SSL и безопасности;
параметры для CMS (WordPress, Drupal и др.);
шаблон для Let’s Encrypt;
инструкции по установке и активации.
Сервис даже показывает пошаговую инструкцию, включая:
генерацию dhparam.pem для ssl_dhparam;
создание каталога /.well-known/acme-challenge для валидации сертификатов;
команду для настройки certbot.
▪️ Что полезного я подсмотрел
1️⃣ error_page 404 /custom_404.html;
Раньше я не всегда добавлял собственную страницу ошибок, а сервис по умолчанию предлагает аккуратную структуру с отдельным location для обработки 404 и 50x ошибок. Решил внедрить у себя - теперь логи чище, а пользователю отображается внятная страница.
2️⃣ add_header X-Frame-Options "SAMEORIGIN";
Мелочь, но важная - защита от clickjacking. Я добавил этот заголовок в общий конфиг, чтобы не прописывать вручную в каждом сайте.
3️⃣ ssl_protocols TLSv1.2 TLSv1.3;
Сервис сразу предлагает только современные протоколы.
4️⃣ location ~ /.(?!well-known)
Глобальная блокировка скрытых директорий, кроме .well-known для Let’s Encrypt - отличная идея.
Раньше я прописывал исключения вручную для каждого виртуального хоста, теперь вынес в общий файл security.conf.
Даже если вы уверенно настраиваете nginx вручную, такие инструменты полезны для проверки себя и актуализации шаблонов.
Сервис генерирует чистые, валидные и безопасные конфиги, которые можно использовать как основу для продакшн-настроек.
#nginx #webserver
🧑💻 NetworkAdmin
Подготовка к выходу стажера
#юмор
🧑💻 NetworkAdmin
🔐 GnuPG: шифрование и управление ключами
GnuPG (GNU Privacy Guard) - это открытая реализация стандарта OpenPGP (RFC 4880). Она позволяет:
шифровать и расшифровывать данные;
подписывать файлы и сообщения;
проверять подлинность данных;
управлять ключами (создавать, экспортировать, отзывать и т.д.).
Работает на всех системах - linux, macOS, windows, и не требует никаких внешних сервисов.
gpg --full-generate-key
~/.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
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 cz folder | gpg -c > archive.tar.gz.gpg
⚡️ Быстрый HTTPS-сервер без сложных настроек
Иногда нужно быстро поделиться файлами между машинами - без nginx, apache и прочих решений. Для этого можно использовать встроенный веб-сервер python:
python3 -m http.server 8000
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
Чтобы наверняка не потерять
#юмор
🧑💻 NetworkAdmin
😢 Скрыть содержимое bash-скрипта с помощью shc
Если нужно показать работу скрипта, но не отдавать исходники - можно скомпилировать его в бинарник через shc. Инструмент преобразует .sh в C-код и собирает исполняемый файл, на выходе пользователь получит работающий бинарник, но не читаемый скрипт.
▪️ Установка (Debian/Ubuntu):
apt install shc gcc
script.sh:#!/bin/bash
v=$1
echo "Simple BASH script. Entered VARIABLE: $v"
shc -f -r script.sh
script.sh.x (бинарник) и script.sh.x.c (сгенерированный C). Запуск:./script.sh.x 123
# Simple BASH script. Entered VARIABLE: 123
shc -e 31/12/2025 -m "Срок истек" -f -r script.sh
./script.sh.x # Выдаст сообщение о просрочке
📌 Важное замечание по безопасности
shc - это обфускация, а не криптография. В конечном бинарнике содержимое может быть восстановлено (есть утилиты вроде UnSHc). Также секреты, записанные в скрипт, при выполнении будут лежать в памяти и их можно попытаться снять дампом. Это защита от случайного копирования, но не от целенаправленного анализа.
⁉️ IPv6 в локальной сети: нужен ли он вообще
IPv6 давно перестал быть экзотикой в мире, но в локальной инфраструктуре (особенно в корпоративных и домашних сетях) его почти никто не использует. Причина простая - в локалках адреса не заканчиваются, да и пользы от IPv6 нет, если нет связи с интернетом, где он действительно нужен.
А вот проблем добавить он может:
требует отдельной настройки безопасности,
нужно следить за совместимостью сервисов,
а если забыть про firewall для IPv6, то появится открытая дыра, о которой даже не узнаете.
Если протокол вам не нужен, то его стоит отключить.
▪️ Как отключить IPv6 в linux
Сделать это можно тремя способами, в зависимости от ситуации.
1️⃣ Через sysctl. Добавьте строки в /etc/sysctl.conf:
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
/etc/sysctl.conf:
net.ipv6.conf.eth0.disable_ipv6 = 1
sysctl -w net.ipv6.conf.eth0.disable_ipv6=1
🖥 Замер реальной пропускной способности сети в linux и windows
iperf3 - показывает реальную пропускную способность между двумя хостами, минуя влияние дисков, приложений и прочего. Ранее уже был пост - ссылка. Здесь продолжение, с реальным примером замера и полезными флагами.
▪️ Принцип работы
iperf3 работает по схеме клиент–сервер.
Один узел запускается в режиме сервера, второй - в режиме клиента.
Сервер принимает входящий трафик, а клиент его генерирует.
▪️ Пример замера
1️⃣ На сервере:
iperf3 -s
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
-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'
🗓 Где искать все запланированные задания
Три основных механизма, которые могут использоваться в linux:
1️⃣ Cron - классика планировщика. Cron существует с начала времен UNIX, и до сих пор активно используется.
Где искать системные задания:
/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
systemctl list-timers
systemctl list-timers --all
systemctl status logrotate.timer
apt-daily.timer
fstrim.timer
logrotate.timer
anacron.timer
apt install at
atq
echo "shutdown -h now" | at -m 10:20
/var/spool/cron/atjobs/
или /var/spool/at/
❌ Ограничение процессов по CPU
Иногда необходимо жестко контролировать, какие ядра процесс может занимать, например, чтобы тяжелые задачи не забивали сервер или чтобы критичные сервисы не конкурировали за ресурсы. В linux это решается утилитой taskset, которая позволяет как изменять affinity уже работающих процессов, так и запускать новые с заданными ограничениями.
1️⃣ Привязка уже запущенного процесса к выбранным ядрам. Для начала найдем PID процесса. Выберите любой удобный способ:
ps aux | grep myapp
pidof myapp
pgrep -f myapp
lscpu | grep -E 'CPU\(s\)|NUMA'
CPU(s): 8
NUMA node0 CPU(s): 0-7
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
taskset 1 gzip hugefile
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
taskset 3 xz -T2 /tmp/testfile
Глубоко погрузился в проблему, детально изучил и решил ее
#юмор
🧑💻 NetworkAdmin
🔒 Конфигурации nftables для защиты сервера
nftables - это замена iptables, встроенная в ядро linux. Она объединяет фильтрацию, NAT и маршрутизацию в единую подсистему и считается более быстрой и удобной. Разберемся, как можно построить базовую защиту сервера.
▪️ Минимальная конфигурация. Создадаем новый ruleset с таблицей для фильтрации трафика:
sudo nft add table inet filter
sudo nft 'add chain inet filter input { type filter hook input priority 0; policy drop; }'
sudo nft add rule inet filter input ct state established,related accept
sudo nft add rule inet filter input iif lo accept
sudo nft add rule inet filter input ip protocol icmp accept
sudo nft add rule inet filter input tcp dport {22,80,443} accept
Что тут происходит:
принимаем все соединения в состоянии ESTABLISHED и RELATED
разрешаем локальный интерфейс (lo)
разрешаем ping (ICMP)
открываем SSH, HTTP и HTTPS
sudo nft add rule inet filter input tcp dport 22 ct state new limit rate 10/minute accept
sudo nft add rule inet filter input tcp dport 22 drop
# блокируем пакеты без флагов (NULL scan)
sudo nft add rule inet filter input tcp flags == 0 drop
# блокируем XMAS-скан
sudo nft add rule inet filter input tcp flags & (fin|psh|urg) == (fin|psh|urg) drop
sudo nft list ruleset
sudo sh -c "nft list ruleset > /etc/nftables.conf"
sudo systemctl enable nftables
sudo systemctl restart nftables