ServerAdmin.ru
27K subscribers
189 photos
27 videos
8 files
2.49K links
Авторская информация о системном администрировании.

Информация о рекламе: @srv_admin_reklama_bot
Автор: @zeroxzed

Второй канал: @srv_admin_live
Сайт: serveradmin.ru
Download Telegram
​​Небольшой совет, основанный на личном опыте. Сделать отдельную заметку по теме меня натолкнул недавний пример с mytop, когда подключение по localhost не сработало. Я тогда не стал подробно разбираться с вопросом, а просто заменил на 127.0.0.1 и всё заработало.

С подобной ошибкой я сталкивался не раз, поэтому у меня давно появилась привычка не использовать localhost в настройках. В данном случае mytop при использовании localhost почему-то пытается подключиться через socket, а не tcp. Я впервые с таким сталкиваюсь. Не знал о подобной особенности. Перепроверил, всё так и есть. Если взять обычный консольный mysql клиент на этом же хосте, то он в обоих случаях подключается по tcp, а вот у mytop почему-то другое поведение.

Это ещё один пример в копилку по данной теме. Я чаще всего сталкивался с тем, что localhost отвечает по ipv6, который где-то может быть не настроен. Например, в конфигурации nginx он отключен, а ты пытаешься статистику сервиса забирать через curl http://localhost/status и получаешь ошибку. Если это делается в консоли, сразу будет понятно, в чём проблема.

А вот если какая-то проверка выполняется через Zabbix с использованием localhost, бывает трудно понять, что не так. Я как-то раз провозился с подобной проблемой, не догадавшись сразу, в чём там дело. И с тех пор всегда пишу явно 127.0.0.1, чтобы просто не тратить на это время.

Стандартный вид файла hosts может быть примерно таким:

127.0.0.1 localhost
127.0.1.1 debian11
::1   localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Пингуя localhost, вы обращаетесь к нему по ipv6:

# ping localhost
PING localhost(localhost (::1)) 56 data bytes
64 bytes from localhost (::1): icmp_seq=1 ttl=64 time=0.016 ms
64 bytes from localhost (::1): icmp_seq=2 ttl=64 time=0.023 ms

Так что нужно либо отключать ipv6 на localhost, либо явно обращаться по тому протоколу, который вам нужен.

#совет #linux
​​Короткая справочная заметка. С недавних пор (последние ~два года) для просмотра информации о системе использую простую команду:

# hostnamectl

Static hostname: serveradmin.ru
Icon name: computer-vm
Chassis: vm
Machine ID: 3cdf45d116364add90df898f553e5665
Boot ID: de9b9d3b12e54447abd7fdccc4543ebd
Virtualization: microsoft
Operating System: Debian GNU/Linux 11 (bullseye)
Kernel: Linux 5.10.0-26-amd64
Architecture: x86-64

Потихоньку ушёл от всех других вариантов. Раньше пользовался:

# lsb_release -a
# uname -a
# cat /etc/os-release
# cat /etc/redhat-release

Уже забывать всё это стал. Hostnamectl даёт всю базовую информацию сразу, так что никуда заглядывать больше не надо. Тут и имя системы, и версия ОС, и ядро. Сразу видно, виртуальная машина это или контейнер. Если контейнер, то будет показан его тип: docker, lxc или openvz. Если VM, то тип виртуализации.

#systemd
​​При использовании виртуализации на базе QEMU (например, Proxmox) я всегда в обязательном порядке использую qemu-guest-agent, который позволяет гипервизору взаимодействовать с установленной системой. Для этого в свойствах виртуальной машины нужно включить использование агента, а на систему установить соответствующий пакет.

Для Debian пакет так и называется - qemu-guest-agent:

# apt install qemu-guest-agent
# systemctl enable --now qemu-guest-agent

В общем случае в процессе эксплуатации системы вам не обязательно взаимодействовать с агентом. Он нужен гипервизору, например, для корректного завершения работы гостевой системы, для её заморозки во время бэкапа, для синхронизации времени и т.д.

При необходимости, вы тоже можете использовать возможности агента, обращаясь к гостевой системе через него. Для проверки связи с агентом, в консоли гипервизора можно набрать:

# qm agent <vmid> ping

Если всё в порядке, то вы не увидите никакого вывода, а код завершения будет нулевой. Это был пример команды для хоста Proxmox. Если у вас другая система виртуализации, и там, к примеру, используется virsh для управления, то команда будет следующая:

# virsh qemu-agent-command vmname '{"execute": "guest-ping"}'

Команды будут похожие. Приведу ещё один пример с Proxmox и virsh, а дальше буду только для Proxmox приводить. Смотрим время на гостевой системе:

# qm agent 101 get-time
# virsh qemu-agent-command vmname '{"execute": "guest-get-time"}'

Для взаимодействия с агентом используется отдельный протокол QMP, который возвращает ответы на запросы в формате json, так что для взаимодействия с ним пригодится утилита jq.

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

# qm agent 101 info | jq -r '.supported_commands[] | select(.enabled==true) | .name'

Я сразу обработал вывод, выбрав только поддерживаемые команды, и выведя само название. Можете посмотреть на полный вывод без обработки. К сожалению, конкретно в proxmox вывод supported_commands не совпадает с реальным списком, который поддерживается, потому что некоторые команды, типа guest-exec выполняются немного в другом синтаксисе. Те команды, что не работают, выдадут ошибку, а вместе с ошибкой выводится список, который реально поддерживается:

# qm agent 101 get-cpustats
400 Parameter verification failed.
command: value 'get-cpustats' does not have a value in the enumeration 'fsfreeze-freeze, fsfreeze-status, fsfreeze-thaw, fstrim, get-fsinfo, get-host-name, get-memory-block-info, get-memory-blocks, get-osinfo, get-time, get-timezone, get-users, get-vcpus, info, network-get-interfaces, ping, shutdown, suspend-disk, suspend-hybrid, suspend-ram'
qm guest cmd <vmid> <command>

Соответственно, вот этот список более точный. Из названия команд чаще всего понятен смысл. Смотрим информацию об установленной ОС:

# qm agent 101 get-osinfo

{
  "id" : "debian",
  "kernel-release" : "6.1.0-13-amd64",
  "kernel-version" : "#1 SMP PREEMPT_DYNAMIC Debian 6.1.55-1 (2023-09-29)",
  "machine" : "x86_64",
  "name" : "Debian GNU/Linux",
  "pretty-name" : "Debian GNU/Linux 12 (bookworm)",
  "version" : "12 (bookworm)",
  "version-id" : "12"
}

И так далее. Инструмент простой для освоения и использования. Может пригодиться, если нужен будет какой-то свой мониторинг с уровня гипервизора, например, за списком VM на хосте со следующей информацией:

гостевая система;
диски и точки монтирования;
сетевые интерфейсы и ip адреса на них;
количество cpu и ram.

Можно и доступность гостя так проверять. Также с помощью агента можно запускать любые команды на гостевой машине:

# qm guest exec 101 "df"

#kvm #proxmox
​​Расскажу об одной возможности bash, с которой хоть и не часто, но приходится сталкиваться. Я столкнулся, когда писал утреннюю заметку про qemu-guest-agent. С его помощью можно выполнить любую команду на гостевой системе. Например так:

# qm guest exec 101 "df"

Далее мне захотелось добавить некоторые ключи к этой команде:

# qm guest exec 101 "df -Th"
Agent error: Guest agent command failed, error was 'Failed to execute child process “df -Th” (No such file or directory)'

Получил ошибку. Эта команда так не работает. Агент пытается найти бинарник df -Th. Читаю описание команды. Дополнительные аргументы надо передавать отдельно, примерно так:

# qm guest exec 101 "df" "/"

В таком виде работает. Добавляю ключи к df и опять ошибка:

# qm guest exec 101 "df" "/" "-Th"
Unknown option: th
400 unable to parse option

Тут типичная проблема для bash. Команда qm считает, что в конструкции -Th я передаю параметры для неё, а она их не понимает. Как же быть? Для этого существуют два тире --. Они говорят команде, что после них нужно игнорировать любые аргументы. То есть правильно будет вот так:

# qm guest exec 101 "df" "/" -- "-Th"

В таком виде команда отработает так, как ожидается. Двойным тире мы дали понять qm, что -Th не её аргументы.

С подобной проблемой легко столкнуться, когда, к примеру, вам через grep нужно найти строку -v. Как её указать? Это очень наглядный пример по данной теме. Grep будет считать, что -v это её аргумент и вместо поиска будет выводить свою версию. Тут надо действовать аналогично:

# grep -- -v file.txt

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

#bash
​​Информация для тех, кто работает с Windows и VPN на базе WireGuard. Есть удобное приложение, которое позволяет настраивать использование приложениями различных туннелей. Например, один браузер направить через VPN, а все остальные приложения напрямую через основное сетевое соединение.

Настроить это можно с помощью TunnlTo. Установка и настройка очень простые. Скачиваете обычный msi пакет, устанавливаете приложение. Добавляете туда настройки туннеля WG, либо вручную, либо импортом файла с настройками. Далее открываете настройки этого туннеля и указываете, каким приложениям можно его использовать.

Помимо настройки приложений, можно указать IP адреса и подсети, в которые нужно ходить через заданный туннель. Настраивать можно как разрешающие правила, так и запрещающие. То есть можно всем разрешить ходить через какой-то туннель, кроме определённого приложения.

Я программу проверил лично, все очень быстро настроил, потестировал. Очень удобно. Приложение поддерживает множественные VPN подключения. Если кто-то знает подобное приложение для OpenVPN, поделитесь информацией. Мне бы очень пригодилось, так как в основной использую OVPN, а не WG.

Исходники

#wireguard
​​В Linux есть инструмент для сохранения состояния работающих процессов, в том числе PID, системные права, открытые файлы, используемую память, сокеты, tcp соединения и т.д. То есть полное состояние процесса сохраняется на диск. Делается это с помощью CRIU (Checkpoint Restore In Userspace). Причём работает она в пространстве пользователя, а не ядра ОС.

В свежих версиях Debian и Ubuntu CRIU есть в базовых репозиториях:

# apt install criu

Покажу сразу на наглядном примере, как это работает. Создаём скрипт test.sh, который выводит в консоль текущую дату:

#!/bin/sh
while :; do
sleep 1
date
done

Запускаем его и наблюдаем работу. Открываем соседнюю консоль. Создадим там директорию, куда сохраним состояние процесса:

# mkdir ~/criu && cd ~/criu

Смотрим pid нашего скрипта:

# ps -C test.sh
  PID TTY     TIME CMD
  748 pts/1  00:00:00 test.sh

Сохраняем состояние процесса. Это пример для процесса, запущенного в консоли, следовательно с привязкой к shell:

# criu dump -vvvv -o dump.log -t 748 --shell-job

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

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

# criu restore -vvvv -o restore.log --shell-job

Он продолжит работу в открытой консоли. Можно выключить или перезагрузить систему. И после этого восстановить процесс. Он так же продолжит свою работу с момента заморозки.

Я пробовал переносить процесс в другую систему (Debian -> Ubuntu), но там восстановить не получается. Должно быть такое же окружение и системные файлы. У меня он сразу ругался на разные размеры бинарников dash и sleep. Для реальной миграции между системами нужно соблюсти ряд условий, описанных в документации.

Изначально проект был открыт для создания инструмента по заморозке и переноса контейнеров OpenVZ, но сейчас расширил свою работу на LXC/LXD, Docker. Вот пример, как сохранить состояние Docker контейнера и запустить вновь: ⇨ https://criu.org/Docker_External.

Посмотрел немного записей на youtube по этой теме. Люди сохраняют открытые VNC сессии со всем софтом и открытыми TCP соединениями. Пример с открытым видео в браузере. После восстановления, продолжается воспроизведение практически на том же месте. Также инструмент применим для сохранения и восстановления контейнеров в Kubernetes.

Сайт / Исходники

#linux #docker
На днях перебирал свои старые записи, в которых собирал на мой взгляд полезную информацию. Нашёл реальный список вопросов на собеседовании Middle DevOps, который выложил человек после собеса. По сути они все админские. Сейчас админов не осталось, все девопсами стали.

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

Какие бывают системы инициализации в Linux. В чём преимущества наиболее популярной?

В прошлом популярны SysV и Upstart, сейчас - Systemd. Основные преимущества - гибкие настройки сервисов и интеграция с системными настройками и компонентами, единая система инициализации для всех популярных дистрибутивов.

Что такое systemd unit, для чего он нужен, в каком каталоге создают файлы юнитов?

Unit - объект systemd, который служит для описания запуска и работы сервиса. Обычно в /etc/systemd/system.

Какие потоки ввода/вывода существуют в Linux, их нумерация?

0 (stdin), 1 (stdout) и 2 (stderr)

Как перенаправить поток вывода ошибок в стандартный вывод, зачем это может пригодиться?

# command 2>&1
Пригодится, чтобы собрать в один лог файл и результаты работы команды, и ошибки.

Есть приложение, которое пишет лог-файл, он занял почти всё свободное место на диске. Приложение останавливать нельзя, каким образом правильно освободить место на диске?

Очистить лог, к примеру, с помощью truncate, или cat /dev/null > log_file не удаляя сам файл. Либо удалить/переместить лог и дать команду приложению на reload, если он подобное поддерживает. Например, nginx reload, kill -USR1 `cat /var/run/nginx.pid`, smb reload, postfix reload и т.д. Если что-то напутали, файл удалили, но место не освободилось, то смотрим удалённые файлы через lsof +L1 и удаляем окончательно.

Что такое файловый дескриптор?

Это число-идентификатор потока ввода/вывода, который связан с файлом. Процессы имеют свои таблицы файловых дескрипторов, с которыми работают. Для ввода/вывода данных процесс обращается к ядру через системный вызов, передавая номер дескриптора.

Какой утилитой можно посмотреть файлы связанные с определенным потоком ввода-вывода?

Если не ошибаюсь, то lsof. В данном случае не понимаю, что подразумевается под определённым потоком. Файловые дескрипторы процесса смотрим так: lsof -p <pid>

Что такое интернет сокет в Linux?

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

Какая встроенная утилита есть в Linux для ротации логов, какой тип ротации бывает?

Logrotate. Ротация по размеру, по времени жизни файла. Если делаем ротацию по размеру, не забываем настроить частый запуск logrotate.

Как проверить доступность порта, слушает ли соединение сервер?

# ss -tulnp

Был ли опыт конфигурирования Nginx, почему его используют как точку входа перед Backend?

Используют для распределения соединений/нагрузки между бэкендами, для удобства управления и контроля за соединениями.

Можно ли удалить default.conf из Nginx, в чем его ключевая фишка?

Можно удалить. Там прописан параметр default_server, его можно перенести в другой виртуальный хост. С этим параметром он будет собирать все запросы по ip адресу и несуществующим доменам.

Где локально в Linux прописать соответствие IP - DNS, как это может помочь в отладке конфигурации Nginx?

В файле /etc/hosts. Как может помочь в отладке - не знаю. Иногда нужно на бэкенде прописать соответствие IP адреса бэкенда доменному имени сайта, чтобы некоторые запросы выполнялись локально, а не ходили на прокси.

В чем принципиальное отличие виртуализации от контейнеризации?

Виртуальная машина — полноценный экземпляр ОС со своим ядром. Контейнеры используют ядро хостовой машины.

Ответы писал сам. Если ошибся, прошу поправить.

#обучение
​​Информация для некрофилов и любителей старины. До сих пор существуют и поддерживаются браузеры для работы в Windows XP. Для меня было удивительно это узнать, так как на прошлой итерации внимания к WinXP я нашёл только какой-то китайский браузер на основе старого chromium, который постоянно ругался на https соединения.

Mypal68 не такой. Работает идеально, регулярно обновляется. Все популярные сайты открываются. Можно даже видюшки на ютубе смотреть, если железо вытянет. Это может вдохнуть жизнь в какую-то старую железку. Браузер портабельный, установка не нужна.

Удивительно, но Kaspersky Free версии 18.0.0.405 тоже до сих пор работает и обновляется.

Летом писал заметку про сайт, совместимый со службой обновления Windows, в том числе версии XP. Там вплоть до 95-й версии поддержка.

Я не знаю, зачем это может кому-то сейчас понадобиться. Мне, к примеру, не надо. Чисто по приколу посмотреть на старую систему. Есть уже набор пылящихся железок на Windows 10.

#windows
Каких только top-ов в Linux нет. Встречайте ещё один, про который большинство скорее всего не слышали - dnstop. Живёт в базовых репах:

# apt install dnstop

Пригодится в основном на локальном dns сервере, но не обязательно только там. С помощью dnstop можно в режиме реального времени смотреть статистику dns запросов, как приходящих на сервер, так и исходящих от него самого.

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

# dnstop eth0

Если хотите сразу исключить локальные запросы сервера, то исключите его IP адрес с помощью ключа -i:

# dnstop eth0 -i 10.20.1.2

После запуска вы увидите основной экран с IP адресами источников запросов и количеством запросов. С помощью клавиш вы можете выбрать различные режимы отображения информации:

s - таблица source address, экран по умолчанию после запуска
d - таблица destination address
t - статистика по типам запросов
r - таблица кодов ответов
@ - таблица source + адреса доменов 2-го уровня в запросе

Это не все горячие клавиши. Я перечислил только те, что показались полезными. Остальные возможности можно посмотреть в man.

По своей сути dnstop похож на tcpdump, потому что использует библиотеку libpcap, только она анализирует исключительно dns запросы. Результат работы можно сохранить в pcap файл с помощью ключа savefile.

#dns #perfomance
This media is not supported in your browser
VIEW IN TELEGRAM
Есть тут настоящие девопсы? У вас так же в среднем проходит рабочий день? В целом, распорядок неплохой.

Музыкальная комната немного удивила. Впервые услышал, что такие есть в офисах. Немного поискал информации в интернете. Оказывается, такие комнаты много где есть - Яндекс, VK, Ростелеком и т.д.

Осталось туда добавить комнаты для одиночного или семейного проживания, детский сад, школа дистанционно. И можно будет из офиса вообще не уходить. А выросшие дети станут автоматически работниками компании. Странно, что до этого ещё не дошли, а всех людей распустили на удалёнку. Наверное, пока компаниям экономически не выгодно обеспечивать сотрудников жильём, пусть оплачивают сами. Но и музыкальные комнаты когда-то делать тоже было невыгодно.

p.s. видео отсюда

#devops
Я делал уже много заметок на тему systemd, где эта изначально система инициализации и управления службами стала заменять старые компоненты системы Linux. Повествование не будет полным без рассказа о монтировании файловых систем с помощью systemd. Сейчас этот механизм встречается повсеместно, особенно у облачных провайдеров, так что знать о нём необходимо.

Давно уже рассказывал, как попал в неприятную ситуацию с облачной виртуалкой, где нужно было заменить диск. Я не учёл момент, что провайдер напрямую управляет монтированием внутри пользовательских виртуалок через systemd, из-за чего я чуть не потерял все данные.

Монтирование файловых систем с помощью systemd обладает явными преимуществами перед привычным fstab:

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

Самый простой пример монтирования локального диска в /mnt/backup со стандартными настройками. Создаём юнит в /etc/systemd/system с именем mnt-backup.mount:

[Unit]
Description=Disk for backups
[Mount]
What=/dev/disk/by-uuid/f774fad3-2ba0-47d1-a20b-0b1c2ae1b7d6
Where=/mnt/backup
Type=ext4
Options=defaults
[Install]
WantedBy=multi-user.target

На диске должен быть создан раздел с файловой системой ext4. Если раздела нет, то создайте с помощью cfdisk. Если нет файловой системы, то создайте:

# mkfs -t ext4 /dev/sdb1

Uuid диска смотрим с помощью blkid:

# blkid
/dev/sdb1: UUID="f774fad3-2ba0-47d1-a20b-0b1c2ae1b7d6" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="a6242d02-8cff-fd44-99ce-a37c654c446c"

Перечитываем содержание юнитов и монтируем файловую систему:

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

Если всё в порядке, можно добавить в автозагрузку:

# systemctl enable mnt-backup.mount

Теперь покажу пример юнита автомонтирования на примере диска NFS, который доступен только после подключения по openvpn с помощью локального клиента. Он будет автоматически подключаться при обращении к точке монтирования и отключаться в случае отсутствия активности в течении 60 секунд. У него должно быть расширение .automount. Для этого мы должны создать обычный юнит mnt-backup.mount, но не включать его автозагрузку, и к нему добавить mnt-backup.automount.

mnt-backup.mount:

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

mnt-backup.automount:

[Unit]
Description=NFS share
Requires=network-online.target
BindsTo=openvpn@client.service 
After=openvpn@client.service
[Automount]
Where=/mnt/backup
TimeoutIdleSec=60
[Install]
WantedBy=graphical.target

Добавляем автомонтирование в автозагрузку:

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

Теперь при старте системы ничего монтироваться не будет. При обращении к точке монтирования /mnt/backup будет предпринята попытка примонтировать сетевой диск при условии запущенной службы openvpn@client.service. Если служба будет отключена, диск принудительно будет отмонтирован, так как .automount жёстко привязан не только к запуску службы, но и к её работе.

Документация по mount и automount:
- systemd.mount — Mount unit configuration
- systemd.automount — Automount unit configuration

📌 Полезные ссылки по теме systemd:

◽️Systemd timers как замена Cron
◽️Journald как замена Syslog
◽️Systemd-journal-remote - централизованное хранение логов
◽️Systemd-journal-gatewayd - просмотр логов через браузер
◽️Hostnamectl для просмотра информации о системе
◽️Systemd-resolved - кэширующий DNS сервер

#systemd
​​Я писал ранее несколько заметок на тему того, что веду свои дела в сервисе todoist.com. Последняя была на тему того, что в этом сервисе появились календари, хоть и не в таком виде, как мне хотелось бы. Это в очередной раз побудило меня поискать что-то другое. В итоге я нашёл, попробовал и перенёс все свои дела в другой сервис.

Речь далее пойдёт про Singularity. Это российский онлайн сервис и одноимённая программа для компьютера и смартфона. Последние две недели я вёл свои дела и календари параллельно в ней. В итоге принял решение полностью перейти на этот сервис. Причины, побудившие меня это сделать, следующие:

1️⃣ Полностью российское решение. Никаких заморочек с оплатой. Цена очень низкая (167 р. в месяц при оплате за год).
2️⃣ Отдельное приложение под десктопную ОС (есть под все системы). Оно хоть и является обёрткой под веб версию и внешне от неё не отличается, тем не менее сделано всё равно удобнее, чем работа через браузер. Можно открыть две копии приложения одновременно, разместить на одном экране и тягать задачи, к примеру, из списка на календарь.
3️⃣ Понравилось мобильное приложение. Оно адаптировано под смартфоны, выглядит не уменьшенной копией веб версии. Постоянно им пользуюсь.
4️⃣ Есть интеграция с telegram, когда ты кидаешь текст боту, а он создаёт в общем списке задачу. С компьютера уже дооформляешь её и ставишь в нужный проект с датами.
5️⃣ Есть календарь со всеми критичными для меня возможностями.
6️⃣ Есть возможность подключать календари в режиме просмотра от сервиса Яндекс. У меня там семейные, совместные с супругой, так что мне удобно видеть их у себя.

По совокупности возможностей Singularity заменил мне связку todoist.com + planyway.com. В итоге вместо двух иностранных сервисов с риском потерять к ним доступ, получил один российский с локальной копией всех данных у меня на компе. Можно запустить приложение без интернета и спокойно в нём поработать. Planyway иногда ложился и я терял доступ к своим календарям. Было очень неудобно, хоть и некритично. Теперь у меня копия всех нужных данных есть локально и доступна без интернета: задачи, календари в Singularity, заметки в Joplin. Подумываю, как организовать Singularity так, чтобы и заметки в ней хранить. Пока пристреливаюсь.

Подобные сервисы плюс-минус одинаковые по возможностям. Выбор зависит от каких-то личных предпочтений и особенностей использования. Я много всего пробовал. Возможно из-за привычки внешний вид todoist мне всегда нравится больше, чем какой-либо другой. Singularity не стала исключением. Внешний вид нравится меньше, хотя в целом нет отторжения. Но буду привыкать теперь. Выбор сделан. Использую, кстати, светлую тему, а не умолчательную тёмную.

Ниже на картинке общий календарь по всем проектам. У задач есть теги, отображение можно сегментировать по ним. То есть не всё в одной куче. Для меня это важно.

#заметки
Расскажу своими словами о такой характеристики сетевого пакета как TTL (Time to live). Думаю, многие если что-то и знают или слышали об этом, то не вдавались в подробности, так как базово системному администратору не так часто приходится подробно разбираться с временем жизни пакета.

Вообще, я впервые познакомился с этим термином, когда купил свой первый модем Yota и захотел не просто пользоваться интернетом на одном устройстве, но и раздать его другим. В то время у Yota был безлимит только для конкретного устройства, в который воткнут модем или сим карта. А одним из способов определить, что интернет раздаётся, был анализ его TTL. Но не только. Из забавного расскажу, что также был контроль ресурсов, к которым обращается пользователь. Я тогда ещё иногда админил Freebsd, а на ноуте была тестовая виртуалка с ней. Как только я пытался обновить список портов (это аналог обновления репозитория в Linux), мне провайдер отключал интернет за нарушение условий использования. Видимо какой-то местный админ, настраивавший ограничения, решил, что пользователь Yota с usb модемом не может обновлять пакеты для Freebsd. Обходил это VPN соединением. Сразу весь траф в него заворачивал, чтобы не палить.

Возвращаюсь к TTL. Это число, которое присутствует в отдельном поле IP заголовка сетевого пакета. После прохождения каждого маршрутизатора этот параметр уменьшается на единицу. Как только это число станет равно 0, пакет уничтожается. Сделано это для того, чтобы ограничить способность пакета бесконечно перемещаться по сети. Рано или поздно он будет уничтожен, если не достигнет адресата.

Как это работает на практике, наглядно можно показать на примере ограничений Yota того периода. У разных устройств и систем по умолчанию устанавливается разное TTL. Для Linux, Android обычно это 64, для Windows 128. Если вы используете интернет напрямую на смартфоне, то TTL выходящего из вашего устройства пакета будет 64. Если же вы раздаёте интернет другому смартфону, то на вашем устройстве TTL будет 64, на втором устройстве, которому раздали интернет, будет 63. И провайдер на своём оборудовании увидит TTL 63, а не 64. Это позволяет ему определить раздачу. Способ простой, но эффективный для большей части абонентов.

Изменить TTL довольно просто, если у вас есть навыки и инструменты системы. Можно поменять настройки по умолчанию TTL на системе, раздающей интернет. Просто увеличить значение на 1. Пример для Linux:

# sysctl -w net.ipv4.ip_default_ttl=65

Но будет неудобно, если вы выходите с этого устройства в интернет напрямую. Можно на ходу с помощью iptables править время жизни пакетов. Настройка будет зависеть от того, раздающее это устройство или использующее интернет. Пример для раздающего:

# iptables -t mangle -A POSTROUTING -j TTL --ttl-set 65

Для android устройств (рутованных) и многих usb модемов (перепрошитых) выпускали патчи, где как раз с помощью параметра системы или iptables решали этот вопрос. Под Windows он решался таким же способом, только другими инструментами.

Сейчас, по идее, всё это неактуально стало, так как законодательно запретили провайдерам ограничивать раздачу интернета. Но для понимания TTL этот пример актуален, так как не знаю, где ещё можно с этим столкнуться. В обычных сетевых задачах с TTL мне не приходилось сталкиваться.

#network
​​Пару лет назад я писал про удобную программу для контроля за сетевой активностью приложений в системе - Portmaster (поддерживает Windows и Linux ). Хочу ещё раз привлечь к ней внимание, особенно для тех, кто про неё не знает. Программа активно развивается и обрастает дополнительными возможностями. Чего-то более функционального и удобного и при этом бесплатного я не знаю.

Автор внедрил платные подписки с некоторой не очень существенной функциональностью. Основная платная возможность - сохранение истории приложений. Недавно он радостно сообщил, что наконец-то благодаря этим подпискам он полностью покрывает расходы на поддержку и развитие программы. Так что проект будет и дальше развиваться. Обещают начать разрабатывать похожее приложение для Android, если подписок хватит на оплату отдельного разработчика для этого.

Вся основная информация по программе есть в первой заметке. Кратко поясню, что это Firewall, который перехватывает все сетевые пакеты. Но при этом умеет ими управлять не только на уровне IP адресов и портов, но и доменов, приложений, системных служб. Последнее особенно удобно. С помощью Portmaster можно взять под контроль сетевую активность Windows. Посмотреть, куда и какие службы ходят. Выборочно их ограничить или полностью всё заблокировать.

У Portmaster удобное и наглядное управление. Он автоматически находит все установленные приложения и службы. Выводит статистику в различных разрезах и группировках. Есть обзорный Dashbord по всей сетевой активности системы.

Можно каждому приложению настраивать свои правила. К примеру, сделать один браузер, где жёстко блокируется всё лишнее, а во втором оставить чистый сёрфинг без каких-либо фильтров. Либо в каком-то браузере запретить конкретный сайт. Почтовому клиенту можно запретить любые сетевые подключение, кроме tcp портов, необходимых для получения и отправки почты.

В настоящее время Portmaster может выступать также в роли блокировщика рекламы на уровне списков сайтов и dns запросов. Всё это настраивается более гибко, чем в популярных блокировщиках.

В общем, продукт функционален и удобен. У меня давно витает идея в голове, как-то разделить в рамках одной системы рабочее пространство и развлекательное. Хочу сделать один браузер для работы, где будет заблокировано всё лишнее, в том числе развлекательные сайты, а второй для всего остального. Иногда руки сами тянутся открыть что-то отвлекающее и залипнуть, вместо того, чтобы доделать дела.

Сайт / Исходники / Видеообзор

#security
​​Как бы вы решили следующую задачу.

Как проверить, есть ли обращение клиента на порт TCP 22 сервера с определённого IP адреса и порта?

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

В таком виде этот вопрос выглядит довольно просто, так как тут речь скорее всего про службу sshd, которая по умолчанию логируется практически везде. Можно просто зайти в её лог и посмотреть, какие там были подключения.

Если же речь идёт о любом другом соединении, то если оно активно, посмотреть его можно с помощью netstat или более современного ss:

# netstat -ntu
# ss -ntu

Нужный адрес и порт можно грепнуть:

# netstat -ntu | grep ':22'

Менее очевидный вариант с помощью lsof:

# lsof -ni TCP:22

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

# iptables -N ssh_in
# iptables -A INPUT -j ssh_in
# iptables -A ssh_in -j LOG --log-level info --log-prefix "--IN--SSH--"
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Сделал отдельную цепочку для логирования и отправил туда запись всех пакетов с портом назначения 22. Логи будут по умолчанию собираться в системном логе syslog. При желании можно в отдельный файл вынести через правило в rsyslog. Отдельную цепочку для каждой службы я обычно не делаю. Вместо этого создаю три цепочки - input, output, forward, куда добавляю правила для тех адресов и портов, которые я хочу логировать.

Это всё, что мне пришло в голову по данному вопросу. Если знаете ещё какие-то способы, то напишите. Будет интересно посмотреть.

Пока заканчивал материал, вспомнил про ещё один:

# cat /proc/net/nf_conntrack | grep 'dport=22'

В принципе, это тот же самый ss или netstat. Они скорее всего отсюда и берут информацию.

#network #terminal
​​Расскажу вам про одну систему, которая привлекла моё внимание. Сначала думал, что это какая-то малорабочая поделка, но когда навёл справки понял, что нет. Видел отзывы людей, которые её использовали месяцами. Речь пойдёт об Qubes OS.

Идея там очень похожа на то, что я описывал ранее в рассказе про Distrobox. Только тут вместо контейнеров полноценные виртуальные машины на базе гипервизора XEN. То есть вся система - это набор самостоятельных виртуальных машин, разделённых по некоторым логическим признакам или приложениям. Например, отдельная VM для работы, для развлечений, для приватной информации и т.д. Можно настроить работу какого-то приложения в отдельной виртуальной машине.

Система построена на базе Fedora. В качестве основной хостовой системы может быть выбрана Fedora либо Debian. Все виртуальные машины интегрированы в единый интерфейс основной системы. Разработчики постарались всё это организовать так, чтобы было похоже на единую систему на базе Linux.

Для того, чтобы всё нормально работало, железо должно поддерживать технологию IOMMU (Intel VT-d или AMD IOMMU). Она нужна для корректной работы изолированных сетей и проброса PCI устройств в виртуалки. Я попробовал развернуть Qubes OS во вложенной виртуализации в Proxmox. Систему поставил, но сеть между VM не заработала как раз из-за отсутствия IOMMU. Так что для нормальной работы системы её надо ставить на соответствующее железо. Оценить удобства работы такой необычной схемы не получилось.

Вообще, идея подобной системы кажется здравой. Современные гипервизоры уже достаточно развиты, чтобы реализовать подобную концепцию. Дело только за практической реализацией. Было бы удобно иметь ОС, которая по сути состоит из отдельных кубиков, внутри которых может быть любая ОС, в том числе и Windows. Qubes OS как раз позволяет создать такую систему. Нужно только корректно и без багов реализовать межсистемное взаимодействие. Технических проблем нет. Все системы, что поддерживает гипервизор, в теории могут запускаться и работать в такой системе.

Если кто-то уже пользовался этой системой, поделитесь впечатлениями. Концепция, как я уже сказал, выглядит заманчивой. Загрузил шаблон нужной системы и развернул любой софт на его основе. И всё это добавил в единое рабочее пространство. Удобно же. Чем-то похоже на Windows и WSL, только более масштабно. Qubes OS, кстати, Windows тоже поддерживает.

Сайт / Свежий обзор

#разное
​​Вчера кратко коснулся темы логирования сетевых соединений с помощью iptables. Решил посвятить этой теме отдельную заметку и рассказать, как я настраиваю логирование.

Задач вести какую-то статистику с помощью iptables у меня обычно нет, так что логирую я чаще всего заблокированные соединения. И то только на момент отладки, потому что часто это большой объём информации.

Вот пример простейшего набора правил для веб сервера, где запрещено всё, что не разрешено явно (22,80,443 порты). Показываю для понимания принципа.

# default rules
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# allow localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# allow established
iptables -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p all -m state --state ESTABLISHED,RELATED -j ACCEPT

# allow ping
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# allow server connections
iptables -A OUTPUT -o ens3 -j ACCEPT

# allow ssh, www
iptables -A INPUT -i ens3 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i ens3 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i ens3 -p tcp --dport 443 -j ACCEPT

# logging
iptables -N block_in
iptables -N block_out
iptables -N block_fw
iptables -A INPUT -j block_in
iptables -A OUTPUT -j block_out
iptables -A FORWARD -j block_fw
iptables -A block_in -j LOG --log-level info --log-prefix "-IN-BLOCK-"
iptables -A block_in -j DROP
iptables -A block_out -j LOG --log-level info --log-prefix "-OUT-BLOCK-"
iptables -A block_out -j DROP
iptables -A block_fw -j LOG --log-level info --log-prefix "-FW-BLOCK-"
iptables -A block_fw -j DROP

С такими правилами в лог будут попадать все заблокированные соединения во всех трех цепочках. В обычной работе это не нужно. Но если набор правил большой, бывает, что добавляете куда-то новое правило, а пакеты по какой-то причине не ходят. Такое бывает нередко, особенно когда между различных VPN туннелей приходится трафиком управлять. Добавляете правила для логирования из этого примера и смотрите, нет ли ваших пакетов в списке заблокированных. Префиксы для разных цепочек помогают быстро грепать разные цепочки. Если находите заблокированные пакеты, разбираетесь, почему они там оказались. Вносите исправление в правила. Когда всё закончите, правила с логированием удаляете, чтобы не собирать ненужные логи.

📌 Полезные материалы по теме:

Графическое отображение правил iptables
Защита от брута и скана портов
Отладка работы с помощью iptables-tracer
Бан всех, кто стучит в закрытый порт
Блокировка стран по IP

#iptables
На днях на моём форуме человек задал вопрос на тему того, как лучше организовать сетевые настройки и виртуальные машины на двух выделенных серверах. Я написал подробный ответ, который хорошо подойдёт под формат заметки сюда. Плюс, тема общая, может быть полезна кому-то ещё. Вот его вопрос:

Очень нужен совет. Имеется два выделенных сервера, арендованных в Selectel. Сервера с приватной сетью. На серверах планируется поставить RDP сервер на Windows и сервер под базу данных. Сервера должны уметь общаться между собой. Плюс еще нужен безопасный доступ к RDP серверу. Как лучше на ваш взгляд все это организовать? Поставить на оба сервер Proxmox и на него виртуалки? Возможно ли при таком раскладе чтобы виртуалки с разных хостов Proxmox видели друг друга? Как обезопасить доступ RDP? Поднимать какой-то шлюз или как? Или вообще без Proxmox обойтись?

Я бы делал следующим образом:
 
1️⃣ В обязательном порядке на сервера поставил Proxmox и всю функциональность реализовывал бы только в виртуальных машинах. Так как есть приватная сеть, никаких дополнительных сложностей со взаимодействием виртуальных машин не будет. Делаем бридж на интерфейсах приватной сети и добавляем сетевые интерфейсы с этим бриджем виртуальным машинам. Они будут обращаться друг к другу напрямую.

2️⃣ На машине с терминальным сервером сделал бы отдельную виртуалку под шлюз. Все остальные виртуальные машины ходили бы в интернет через неё. В эту виртуалку прокинул бы сетевой интерфейс с внешним IP. Сами гипервизоры настроил бы только в приватной сети, чтобы они ходили в интернет тоже только через этот шлюз. Обязательно настроить автоматический запуск этой виртуальной машины.

3️⃣ На шлюзе настроил бы firewall и управлял доступом к виртуалкам и их доступом в интернет через него. На него же поставил бы Nginx для проксирования запросов к внутренним веб ресурсам.

4️⃣ Доступ к терминальному серверу реализовал бы либо с помощью Openvpn, если нужен прямой доступ через терминальный клиент, либо с помощью Guacamole, если будет достаточен такой режим работы на сервере через браузер. Настраивал бы это на шлюзе. Можно сразу и то, и другое.

5️⃣ В отдельной виртуальной машине поднял бы Zabbix для мониторинга всего этого хозяйства и какую-то систему для сбора логов (ELK или Loki). И добавил бы внешний мониторинг, типа uptimerobot или uptime-kuma.

6️⃣ Если есть возможность по месту на дисках, на одном из серверов организовал бы вируталку под локальные бэкапы как самих виртуальных машин, так и сырых данных. С этой виртуалки забирал бы данные куда-то во вне. Если есть возможность поднять Proxmox Backup Server, поднял бы его для внешнего бэкапа виртуалок целиком.
 
Итого, получается следующая минимальная конфигурация по виртуалкам:

СУБД
Терминальник
Шлюз
Мониторинг и логи
Бэкап.

Раскидываются между серверами в зависимости от ресурсов и нагрузки. Скорее всего СУБД и Мониторинг с логами это один сервер, Терминальник, Шлюз и Бэкап это второй сервер. При желании можно раздробить всё это на большее количество виртуальных машин. Мониторинг, Guacamole, Логи разнести по разным машинам. Это будет удобнее и безопаснее, но больше расходов по ресурсам и поддержке.

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

#виртуализация #совет
​​Тема с Portmaster получила очень живой отклик в виде сохранений заметки. Решил её немного развить и предложить альтернативу этому хоть и удобному, но очень объёмному и тяжёлому приложению. Тяжёл прежде всего интерфейс на Electron, само ядро там на Go. В противовес можно поставить simplewall. Это обёртка над Windows Filtering Platform (WFP) весом буквально в мегабайт. В репозитории все скрины на русском языке, так что автор, судя по всему, русскоязычный.

Компания Microsoft действует очень разумно и логично в своей массовой системе Windows. Закрывает наиболее актуальные потребности людей, замыкая их в своей экосистеме. Отрезает всех остальных от бигдаты пользователей. Её встроенных средств безопасности и защиты достаточно среднестатистическому пользователю. Нет необходимости ставить сторонние антивирусы или прочие приложения.

WFP - это набор системных служб для фильтрации трафика, охватывающий все основные сетевые уровни, от транспортного (TCP/UDP) до канального (Ethernet). Simplewall взаимодействует с WFP через встроенный API. То есть это не обёртка над Windows Firewall, как может показаться вначале.

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

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

Особенность Simplewall в том, что все настроенные правила будут действовать даже если приложение не запущено. Реальная фильтрация выполняется с помощью WFP по преднастроенным правилам. По умолчанию, после запуска фильтрации, программа заблокирует всю сетевую активность. На каждое приложение, которое попросится в сеть, будет выскакивать окно с запросом разрешения или запрета сетевой активности. То есть это очень простой способ заблокировать все запросы с машины во вне.

#windows #security #network
This media is not supported in your browser
VIEW IN TELEGRAM
▶️ Нескончаемая тема приколов на тему разработчиков и тестировщиков. Ютуб подкинул в рекомендации. Вообще, неплохо эти рекомендации работают. Я постоянно что-то оттуда смотрю и периодически сохраняю, чтобы вам показать. Некоторое вижу там впервые. То есть не видел в других каналах с приколами, как, к примеру, представленное видео.

Кто не видел, рекомендую ещё вот это посмотреть по схожей теме: https://t.me/srv_admin/1189

#юмор