NetworkAdmin.ru
4.73K subscribers
240 photos
32 videos
2 files
605 links
Авторский блог про сетевое и системное администрирование.

Сайт: networkadmin.ru
Реклама: @dad_admin
Биржа: https://telega.in/c/networkadminru
Download Telegram
Cloud-Init в Proxmox: автоматическое создание виртуальных машин

Если вы часто вручную создаете виртуальные машины в Proxmox, эту рутину легко автоматизировать с помощью Cloud-Init, который поддерживается в Proxmox из коробки.

Cloud-Init позволяет при создании ВМ автоматически задать:

▪️ пользователей, пароли и SSH-ключи
▪️ hostname
▪️ сетевые настройки и DNS
▪️ первичное обновление пакетов

Без Cloud-Init все это пришлось бы настраивать вручную в каждой новой виртуалке.

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

1️⃣ Подготавливаем базовую ВМ. Устанавливаем ОС и нужные пакеты, обязательно ставим cloud-init:


apt install cloud-init


Можно использовать готовые cloud-образы:

Debian - cloud.debian.org
Ubuntu - cloud-images.ubuntu.com
Astra Linux - dl.astralinux.ru

Proxmox отлично поддерживает образы, подготовленные под OpenStack.

2️⃣ Делаем шаблон. Готовую ВМ переводим в шаблон через Convert to template.

3️⃣ Создаем новую ВМ из шаблона. Добавляем к ней диск CloudInit Drive.

4️⃣ Настраиваем Cloud-Init. В параметрах ВМ появляется раздел Cloud-Init, где можно индивидуально указать пользователя, ключи, сеть и DNS. При первом запуске настройки применяются автоматически.

Инструкция в Wiki Proxmox:

🔗 Cloud-Init Support
🔗 Cloud-Init FAQ

#proxmox #cloudinit

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍123
⭐️ Windows Storage Spaces: зеркалирование и RAID без стороннего ПО

В Windows есть встроенный механизм программного хранения данных - Storage Spaces. По сути, это аналог Linux LVM + software RAID, который позволяет объединять диски в пул и создавать на их основе отказоустойчивые тома без стороннего ПО и RAID-контроллеров.

▪️ Как это работает. Архитектура состоит из трех уровней:

1. Physical disks - физические диски (HDD/SSD, SATA/NVMe, USB тоже поддерживаются).
2. Storage Pool - пул хранения, в который объединяются диски.
3. Virtual Disk (Space) - логический диск с заданным уровнем отказоустойчивости.

На уровне Virtual Disk выбирается тип защиты данных.

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

Simple - без отказоустойчивости (аналог RAID0). Максимальная скорость и объем.
Two-way mirror - зеркалирование данных на два диска (аналог RAID1).
Three-way mirror - зеркалирование на три диска (для критичных данных).
Parity - распределенная четность (аналог RAID5/6, зависит от конфигурации).

▪️ Плюсы Storage Spaces

встроено в Windows (Server и Pro-версии);
не требует перезагрузки при добавлении дисков;
поддерживает hot-swap;
можно расширять пул на ходу;
работает поверх обычных дисков без контроллера.

▪️ Практические моменты

- Зеркала отлично подходят для VM, файловых серверов и рабочих станций.
- Parity экономит место, но хуже по записи, особенно на мелких I/O.
- Для системных дисков чаще используют зеркало, а не parity.
- Управлять можно через GUI или PowerShell (Get-StoragePool, New-VirtualDisk).

▪️ Когда это хорошее решение

небольшой сервер или NAS на Windows;
тестовые и офисные инфраструктуры;
когда нет аппаратного RAID, но нужна отказоустойчивость.

#storage #raid

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍12
📱 Запись терминала

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

воспроизводить в браузере;
встраивать в документацию;
использовать в обучающих материалах;
пересматривать прямо в терминале.

▪️ Установка. В большинстве дистрибутивов asciinema есть в репозиториях:


apt install asciinema


▪️ Запись сессии. Начать запись можно одной командой:


asciinema rec


▪️ Завершение - Ctrl+D или exit. По умолчанию создается файл формата .cast, в котором хранится вся запись.

▪️ Воспроизведение. Записанную сессию можно воспроизвести локально:


asciinema play demo.cast


Либо загрузить на сайт asciinema:


asciinema upload demo.cast


После загрузки вы получите ссылку и HTML-код для встраивания записи в сайт или wiki.

▪️ Почему это удобно

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

#linux #terminal

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥1
😭 Когда на Linux внезапно закончилось место

В ext4 есть полезная особенность: при создании файловой системы резервируется 5% пространства. Обычно это место доступно только root и нужно, чтобы система не умерла, когда диск заполнен под завязку. В критических ситуациях этот резерв реально спасает, без него многие сервисы просто перестают работать (привет ZFS и lvm-thin).

1️⃣ При необходимости размер резерва можно уменьшить и быстро освободить место:


tune2fs -m 3 /dev/mapper/root
# или
tune2fs -m 3 /dev/sda3


Вместо 5% оставляем 3%, а разница становится доступной системе. На больших разделах это могут быть десятки гигабайт. Теоретически можно поставить и 0%:


tune2fs -m 0 /dev/sda3



Но так делать не советую. Минимум 1% лучше оставить, а оптимальный компромисс те же 3%.

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

Создаем swap-файл на 1 ГБ:


dd if=/dev/zero of=/swap bs=1024 count=1000000
mkswap /swap
chmod 0600 /swap
swapon /swap


Отключить и удалить его так же просто:


swapoff -a
rm /swap


3️⃣ вариант страховки - заранее созданный пустой файл большого размера:


fallocate -l 10G /big_file


В экстренной ситуации его можно удалить и мгновенно получить несколько гигабайт свободного места, чтобы система ожила.

#linux #ext4

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18
Please open Telegram to view this post
VIEW IN TELEGRAM
😁151🤔1🤡1
🤩 tcpdump: фильтры, которые реально нужны

tcpdump знают все. Но часто его используют как tcpdump -i any и тонут в потоке пакетов. Ниже будут написаны фильтры, которые действительно спасают.

▪️ Фильтрация по хосту и сети. Трафик к конкретному IP:


tcpdump -i eth0 host 10.10.10.5


Только исходящий:


tcpdump -i eth0 src 10.10.10.5


Подсеть:


tcpdump net 192.168.1.0/24


▪️ Порты и сервисы. HTTP:


tcpdump tcp port 80


Несколько портов:


tcpdump 'tcp port 80 or tcp port 443'


Исключить SSH:


tcpdump 'not port 22'


▪️ Поиск конкретных TCP-флагов. Только SYN (поиск сканирования):


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


RST-пакеты (поиск проблем с соединением):


tcpdump 'tcp[tcpflags] & tcp-rst != 0'


▪️ Поиск по содержимому. Найти строку в HTTP:


tcpdump -A -s 0 'tcp port 80' | grep "POST"


Фильтр по размеру пакета:


tcpdump 'greater 1000'


▪️ Анализ проблем с соединением. Только неустановленные соединения:


tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn'


Повторные передачи:


tcpdump 'tcp[tcpflags] & tcp-ack != 0'


▪️ Захват в файл для анализа. Лучше всегда писать в pcap:


tcpdump -i eth0 -s 0 -w dump.pcap


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

#linux #tcpdump

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
💚 Как быстро прибить процесс, который слушает порт

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

▪️ Классический способ. Смотрим, кто слушает порт, через ss, находим PID и убиваем процесс:


ss -tulnp | grep 8080
tcp LISTEN 0 5 0.0.0.0:8080 0.0.0.0:* users:(("python3",pid=5152,fd=3))

kill 5152


Рабочий вариант, но требует двух шагов.

▪️ Быстрее через lsof. Гораздо удобнее использовать lsof, который отлично работает не только с файлами, но и с сетевыми соединениями:


lsof -i:8080


Пример вывода:


COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
python3 5156 root 3u IPv4 41738 0t0 TCP *:http-alt (LISTEN)


И сразу завершаем процесс:


kill 5156


А если хочется вообще в одно действие:


lsof -i:8080 -t | xargs kill


▪️ Почему lsof? Со временем начинаешь использовать lsof всё чаще:


lsof -i
lsof -i TCP:25
lsof -i TCP@1.2.3.4


Очень наглядно показывает, кто, куда и по какому протоколу подключен.

▪️ Совсем ленивый вариант - killport. Есть утилита killport, которая делает все то же самое одной командой:


killport 8080


В стандартных репозиториях ее обычно нет, придется скачать готовый бинарник.
На Linux без нее легко обойтись, а вот на Windows такая утилита особенно полезна.

Можно сначала проверить, что именно будет завершено:


killport 445 --dry-run
Would kill process 'System' listening on port 445


Сначала смотрим, потом убиваем - все как надо.

#linux #network

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9
🟣 pv - контроль скорости и прогресса

pv (Pipe Viewer) - небольшая, но крайне полезная утилита для работы с pipe в Linux/Unix. Она позволяет видеть скорость передачи данных, объем, время работы, а при необходимости ограничивать пропускную способность. Есть почти во всех дистрибутивах:


apt install pv
dnf install pv


▪️ Прогресс-бар там, где его обычно нет. Например, при копировании файла:


pv testfile > testfile_copy


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


pv testfile | gzip > testfile.gz


▪️ Ограничение скорости через -L. Это спасает SSD, хранилища и гипервизоры от перегрузки:


pv -L 50m testfile > testfile_copy


Тем же способом удобно душить дампы БД:


mysqldump db01 | pv -L 20m > db01.sql


Для каталогов можно передать размер вручную и получить корректный ETA:


tar -czf - /usr | pv -s $(du -sb /usr | grep -o '[0-9]*') > usr.tgz


▪️ Мониторинг файловых дескрипторов процесса:


pv -d <PID>


Показывает, какие файлы реально читаются/пишутся и с какой скоростью.

▪️ Использование через ssh - для лимита канала или замера пропускной способности:


pv /dev/zero | ssh user@host 'cat > /dev/null'


#linux #pv

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥134
Админ отлично знает как устроена эта сеть

#юмор

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
😁22🔥4
🔒 trusted и encrypted keys: защита секретов с помощью TPM

В linux есть малоизвестный, но крутой механизм хранения секретов прямо на уровне ядра - trusted и encrypted keys. Это специальные типы ключей из подсистемы linux keyrings, которые позволяют защищать данные без хранения их в открытом виде на диске.

▪️ Encrypted keys. Используются для хранения секретов (паролей, ключей, токенов), которые шифруются мастер-ключом ядра. Сам ключ может храниться на диске, но без загруженной системы он бесполезен.

Пример создания:


keyctl add encrypted dbkey "new user:passphrase 32" @s


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

▪️ Trusted keys. Более высокий уровень защиты. Такие ключи генерируются и хранятся внутри TPM (Trusted Platform Module) и никогда не покидают его в открытом виде. Ядро получает только дескриптор, а все криптооперации выполняет TPM.

Пример:


keyctl add trusted tpmkey "new 32" @s


Даже root не сможет извлечь значение ключа, только использовать его.

▪️ Где это применяется

защита LUKS (через systemd-cryptenroll);
хранение ключей для dm-crypt;
secrets для сервисов без plaintext-файлов;
привязка данных к конкретному железу.

#linux #security

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62
GRE и IPIP: простые туннели без VPN

Не всегда нужен полноценный VPN с TLS, сертификатами и клиентами. Иногда задача проще: соединить две сети, протянуть маршрут до подсети или завернуть трафик через удалённый узел. В таких случаях отлично подходят GRE и IPIP - легкие L3-туннели, встроенные прямо в ядро Linux.

▪️ IPIP - самый простой вариант

IPIP (IP-in-IP) - это инкапсуляция IP-пакета внутрь другого IP-пакета.
Работает только с IPv4 - IPv4.

Минимальный пример:

Сервер A (1.1.1.1):


ip tunnel add tun0 mode ipip local 1.1.1.1 remote 2.2.2.2
ip addr add 10.10.10.1/30 dev tun0
ip link set tun0 up


Сервер B (2.2.2.2):


ip tunnel add tun0 mode ipip local 2.2.2.2 remote 1.1.1.1
ip addr add 10.10.10.2/30 dev tun0
ip link set tun0 up


Добавляем маршруты - и сети начинают видеть друг друга.

🤩 Плюсы:

минимальный overhead;
простота;
работает из коробки.

🤩 Минусы:

только IPv4;
нет multicast;
нет шифрования;
GRE - гибче и мощнее.


▪️ GRE (Generic Routing Encapsulation) инкапсулирует практически любой L3-протокол. Поддерживает: IPv4 и IPv6, multicast и динамическую маршрутизацию (OSPF, BGP поверх туннеля)

Пример:


ip tunnel add gre1 mode gre local 1.1.1.1 remote 2.2.2.2 ttl 255
ip addr add 10.20.20.1/30 dev gre1
ip link set gre1 up


На второй стороне - зеркальная конфигурация.

🤩 GRE удобен, если:

нужно поднять OSPF между площадками;
протянуть несколько подсетей;
использовать FRR/Quagga;
строить overlay-сеть.


⚠️ Важный момент: это не VPN

Ни IPIP, ни GRE не шифруют трафик.
Это просто инкапсуляция.

Если нужен encryption: поверх GRE можно поднять IPsec или использовать WireGuard вместо этого

🤩 Когда это удобно

Связать два датацентра;
Протянуть подсеть в облако;
Обойти ограничения провайдера;
Сделать статическую связку без сложной PKI.

Если задача маршрутизация, а не безопасность, то GRE/IPIP часто проще любого VPN.

#linux #networking

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍132
⚡️ Быстрая настройка NFS для временного обмена файлами

Регулярно настраиваю NFS под разные прикладные задачи, чаще всего временные. Когда нужно быстро перекинуть большой объем данных между серверами, NFS почти всегда выигрывает по скорости у scp/ssh, SMB и HTTP. Особенно в локальной сети.

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

▪️ Сервер. Обычно все временные шары держу в /mnt:


mkdir /mnt/share
chown nobody:nogroup /mnt/share


Устанавливаем сервер NFS:


apt install nfs-kernel-server


Экспортируем каталог, например, только для клиента 172.16.10.25. Добавляем в /etc/exports:


/mnt/share 172.16.10.25(rw,all_squash,no_subtree_check,crossmnt)


Для всей подсети:


/mnt/share 172.16.10.0/24(rw,all_squash,no_subtree_check,crossmnt)


Для нескольких хостов будет удобнее отдельными строками:


/mnt/share 172.16.10.25(rw,all_squash,no_subtree_check,crossmnt)
/mnt/share 172.16.10.30(rw,all_squash,no_subtree_check,crossmnt)


Применяем конфигурацию:


systemctl restart nfs-server
systemctl status nfs-server


Для работы NFS должен быть доступен TCP порт 2049.

▪️ Клиент. Ставим клиентские утилиты:


apt install nfs-common


Проверяем, что сервер отдает экспорт:


showmount -e 172.16.10.10
Export list for 172.16.10.10:
/mnt/share 172.16.10.25


Монтируем ресурс:


mkdir /mnt/share
mount 172.16.10.10:/mnt/share /mnt/share


Проверяем:


df -h | grep nfs
172.16.10.10:/mnt/share 80G 5.1G 72G 7% /mnt/share


Желательно убедиться, что используется NFSv4:


mount -t nfs4


Тестируем запись:


echo "hello nfs" > /mnt/share/test.txt


При необходимости можно добавить в /etc/fstab:


172.16.10.10:/mnt/share /mnt/share nfs4 defaults 0 0


(и не забыть перевод строки в конце).

Для временных задач - это простой, быстрый и надежный вариант.

#linux #nfs

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍103
🤩 DHCP Relay: как раздавать IP через маршрутизаторы

В простых сетях DHCP-сервер и клиенты обычно находятся в одном сегменте. Клиент шлет broadcast-запрос, сервер отвечает и все работает. Но как только появляется маршрутизатор, broadcast дальше не идет, и DHCP внезапно ломается.

Именно для таких случаев и нужен DHCP relay.

Идея простая: маршрутизатор принимает DHCP-broadcast от клиента и пересылает его unicast’ом на DHCP-сервер в другой сети. Ответ сервера он так же передает обратно клиенту.

▪️ Как это выглядит логически

Клиент: DHCPDISCOVER (broadcast)
Маршрутизатор (relay): ловит запрос и отправляет его на DHCP-сервер
DHCP-сервер: выдает адрес с учетом подсети клиента
Relay: возвращает ответ клиенту

Ключевой момент - relay добавляет в пакет поле giaddr, по которому сервер понимает, из какой сети пришел запрос.

▪️ Пример на Linux (isc-dhcp-relay)

1️⃣ Устанавливаем relay:


apt install isc-dhcp-relay


2️⃣ Указываем IP DHCP-сервера, например 10.50.0.10, и интерфейсы, где сидят клиенты:


INTERFACES="eth1 eth2"
SERVERS="10.50.0.10"


3️⃣ Перезапускаем:


systemctl restart isc-dhcp-relay


Готово. Клиенты из разных VLAN/подсетей будут получать IP от одного центрального DHCP-сервера.

▪️ Где это реально используется

Несколько VLAN, один DHCP-сервер
Офисы с централизованной сетевой инфраструктурой
Wi-Fi контроллеры и L3-коммутаторы
MikroTik / Cisco / Juniper - relay там настраивается аналогично

▪️ Важно помнить

На DHCP-сервере должны быть описаны все подсети
UDP порты 67/68 должны быть разрешены
Без relay DHCP через маршрутизатор не работает по определению

#networking #dhcp

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍102
This media is not supported in your browser
VIEW IN TELEGRAM
Что-то пошло не по плану 😕

#юмор

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
😁161
🕓 Автоматизация работы с дисками и устройствами

В linux все железо - это события. Вставили диск, появился интерфейс, подключили USB - ядро сгенерировало событие, а udev решил, что с ним делать. Если нужно не просто чтобы работало, а чтобы работало как надо, в дело идут udev rules.

▶️ Что такое udev rules

udev rules - это правила, которые:

переименовывают устройства
задают права и владельцев
создают симлинки
запускают команды при подключении/отключении


Работают на уровне событий, без cron, демонов и костылей.

👁 Где живут правила

Свои правила кладут сюда:


/etc/udev/rules.d/


Файлы читаются в порядке номеров, например:


10-local.rules
99-usb.rules


▪️ Простой пример: стабильное имя для диска. Допустим, USB-диск каждый раз появляется как sdb, sdc, sdd. Это неудобно.

Смотрим атрибуты:


udevadm info --query=all --name=/dev/sdb


Пишем правило:


SUBSYSTEM=="block", ENV{ID_SERIAL}=="WD_Elements_25A1", SYMLINK+="backup_disk"


Теперь диск всегда доступен как:


/dev/backup_disk


▪️ Права и владелец для устройств. Например, для USB-UART адаптера:


SUBSYSTEM=="tty", ATTRS{idVendor}=="1a86", ATTRS{idProduct}=="7523", MODE="0660", GROUP="dialout"


Больше не нужно chmod после каждой перезагрузки.

▪️ Автоматический запуск команды. Можно выполнить действие при подключении:


ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_LABEL}=="DATA", RUN+="/usr/local/bin/mount-data.sh"


▪️ После правок:


udevadm control --reload
udevadm trigger


Или просто переподключить устройство.

#linux #udev

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍124
📊 Как уменьшить файловую систему ext4

Файловая система ext4 умеет уменьшаться штатно, при условии, что на разделе достаточно свободного места. В этом ее большое отличие от xfs, которая сжиматься не умеет вообще. Но есть важное ограничение: уменьшение ext4 возможно только в размонтированном виде. На живой системе это не работает.

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

▪️ Классический способ. В идеальном мире вы загружаетесь с LiveCD, монтируете нужный раздел и выполняете:


/sbin/resize2fs /dev/sda1 40G


Файловая система на /dev/sda1 будет уменьшена до 40 ГБ, при условии, что данных там меньше этого объема. Перед и после операции настоятельно рекомендуется проверить файловую систему:


/sbin/e2fsck -yf /dev/sda1


Если раздел смонтирован, ничего не получится:


resize2fs: On-line shrinking not supported
e2fsck: Cannot continue, aborting.


▪️ А если LiveCD недоступен? Вот тут начинается самое интересное. resize2fs можно выполнить из initramfs, то есть еще до загрузки основной системы. По сути, мы превращаем initramfs в мини-LiveCD.

1️⃣ Добавляем утилиты в initramfs. Создаем исполняемый файл /etc/initramfs-tools/hooks/resizefs:


#!/bin/sh
set -e
. /usr/share/initramfs-tools/hook-functions

copy_exec /sbin/e2fsck
copy_exec /sbin/resize2fs


2️⃣ Добавляем скрипт выполнения. Создаем исполняемый файл /etc/initramfs-tools/scripts/local-premount/resizefs:


#!/bin/sh
set -e

/sbin/e2fsck -yf /dev/sda1
/sbin/resize2fs /dev/sda1 40G
/sbin/e2fsck -yf /dev/sda1


3️⃣ Пересобираем initramfs. Смотрим доступные ядра:


ls /boot | grep config


И пересобираем образ, например для последнего ядра:


update-initramfs -u -k 6.1.0-22-amd64


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

#ext4 #filesystems

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍133
⚙️ Ограничение памяти процессов через systemd

Если нужно аккуратно ограничить потребление памяти процессом, systemd делает это буквально из коробки. Причем не грубо, а с понятной логикой: можно замедлять процесс, забирать у него память или в крайнем случае прибивать. Все параметры описаны в документации, но на практике используются лишь несколько ключевых. Разберу их на примере.

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

▪️ MemoryAccounting=yes
Включает учет потребления памяти для юнита. Без этого остальные лимиты просто не работают.

▪️ MemoryHigh=2G
Мягкий лимит. Процесс может его превышать, но systemd начнет активно забирать память и тормозить выполнение. Основной и самый безопасный механизм.

▪️ MemoryMax=3G
Жёсткий предел. При достижении процесс будет убит OOM Killer’ом. Использовать стоит осторожно, скорее как страховку.

▪️ MemorySwapMax=512M
Ограничение на использование swap. Полезно, если не хотите, чтобы сервис утонул в свопе.

▪️ Restart=on-failure
Позволяет автоматически перезапустить сервис, если его убили по памяти.

▪️ OOMPolicy=kill
Определяет поведение при OOM: либо корректная остановка (stop), либо жесткое убийство (kill).

▪️ Пример systemd unit


[Unit]
Description=Node.js Worker
After=network.target

[Service]
ExecStart=/usr/bin/node /opt/app/worker.js
Restart=on-failure

MemoryAccounting=yes
MemoryHigh=2G
MemoryMax=3G
MemorySwapMax=512M
OOMPolicy=kill

[Install]
WantedBy=multi-user.target


▪️ Быстрое тестирование из консоли. Создадим процесс, который пытается съесть 1 ГБ памяти:


node -e 'let a = "x".repeat(1024*1024*1024); setTimeout(()=>{}, 600000)'


Теперь запустим его с лимитами через systemd:


systemd-run --scope \
-p MemoryHigh=300M \
-p MemoryMax=400M \
node -e 'let a = "x".repeat(1024*1024*1024); setTimeout(()=>{}, 600000)'


Процесс запросит гигабайт, но реально получит лишь разрешенный объем.

Проверяем:


ps -o pid,rss,cmd -C node


RSS будет в пределах лимита, даже если виртуальная память (VSZ) гораздо больше.

#linux #systemd

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍14
🔑 Как сменить пароль в RDP/RDS сессии

Пользователи, которые работают с корпоративными ресурсами через RDP/RDS, часто упираются в странную проблему: нужно сменить пароль, а привычный Ctrl + Alt + Del ведет себя неправильно.

⚠️ Причина простая - в RDP-сессии это сочетание перехватывается локальным компьютером, а не удалённым сервером. В итоге открывается окно безопасности вашей рабочей машины, а не терминального сервера.


Но варианты есть.

▪️ Ctrl + Alt + End

Это полный аналог Ctrl + Alt + Del, но именно для RDP.
Работает, если вы подключены напрямую к серверу.

▪️ Если RDP внутри RDP

Когда есть цепочка из нескольких RDP-сессий, Ctrl + Alt + End срабатывает только в первом окне и дальше не проходит.

В этом случае помогает экранная клавиатура:

Запустите osk.exe
Зажмите Ctrl + Alt на физической клавиатуре
Нажмите Del на экранной клавиатуре

В итоге появится окно Windows Security уже на нужном сервере.

▪️ Удобный вариант для терминальных пользователей. Чтобы не объяснять это каждый раз, можно положить на Public Desktop ярлык для смены пароля.

Через команду оболочки:


explorer.exe shell:::{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}


Через VBS-скрипт:


Set objShell = CreateObject("Shell.Application")
objShell.WindowsSecurity


Через PowerShell:


powershell.exe -noprofile -noninteractive -command "(New-Object -ComObject shell.application).WindowsSecurity()"


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

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

#windows #rdp #rds

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥14👍5🤡1
LACP (802.3ad): агрегация каналов на практике

Когда одного сетевого линка уже не хватает по пропускной способности или хочется повысить отказоустойчивость, на помощь приходит LACP - Link Aggregation Control Protocol (IEEE 802.3ad). Он позволяет объединить несколько физических интерфейсов в один логический канал.

Важно сразу понять: LACP - это не удвоение скорости для одного соединения, а распределение потоков между линками.

▪️ Зачем используют LACP

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

Частые кейсы: сервера виртуализации, NAS, storage, аплинки между коммутаторами.

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

LACP объединяет интерфейсы в bond / lag.
Трафик распределяется по хешу: MAC, IP, порт назначения (зависит от настроек).
Один TCP-поток всегда идёт по одному физическому каналу, чтобы не было reorder пакетов.

▪️ Пример на Linux (bonding). Создаём bond-интерфейс в режиме 802.3ad: modprobe bonding

Пример /etc/network/interfaces:


auto bond0
iface bond0 inet static
address 10.10.0.10/24
bond-mode 802.3ad
bond-miimon 100
bond-slaves eno1 eno2
bond-xmit-hash-policy layer3+4


После поднятия можно проверить:


cat /proc/net/bonding/bond0


▪️ Коммутатор - обязателен

LACP должен быть настроен с двух сторон.
Если на сервере включен 802.3ad, а на свитче обычный access/trunk, линк либо не поднимется, либо будет флапать.

На большинстве управляемых коммутаторов это выглядит как LAG / Port-Channel с режимом LACP active.

▪️ Частые ошибки

ожидание, что один iperf покажет x2 скорость
разные настройки LACP на сервере и коммутаторе
объединение портов с разной скоростью (1G + 10G - это плохая идея)

#networking #lacp

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Когда сказали, что отправят ключ почтой и через неделю приходит конверт с этим..

#юмор

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
😁27👍8🔥4🍾1
😨 Как восстановить случайно удаленный скрипт

Настраивал как-то bash-скрипт бэкапа с ротацией старых копий. Для удобства и сам скрипт, и тестовые бэкапы лежали в одной директории. В итоге перепутал условие удаления и после выполнения скрипт аккуратно удалил… сам себя. А это была единственная версия.

Переписывать всё с нуля совсем не хотелось, поэтому решил попробовать восстановление. Если файл небольшой и действовать сразу - шансы на успех вполне хорошие.

Есть утилита scalpel, для файлового карвинга. Ставим:


apt install scalpel


Scalpel ищет файлы по сигнатурам. Для бинарников они обычно известны, а вот bash-скрипт - это обычный текст. Поэтому я добавил свою сигнатуру в /etc/scalpel/scalpel.conf:


NONE y 2000 #!/usr/bin/env bash


#!/usr/bin/env bash - шебанг, с которого обычно начинаются скрипты. Этого достаточно, чтобы scalpel начал их искать.

Создаем каталог для результата и запускаем сканирование:


mkdir /tmp/recover
scalpel /dev/mapper/vg0-root -o /tmp/recover


Указываем именно блочное устройство с файловой системой. Через несколько минут сканирования раздела ~60G в каталоге появилось множество восстановленных текстовых файлов.

Нужный скрипт оказался почти сразу, содержимое восстановилось полностью.

Вывод простой: если что-то удалили случайно - ничего не пишите на диск и сразу пробуйте восстановление.

#linux #recovery

🧑‍💻 NetworkAdmin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍143