OpenVPN: свой VPN-сервер без облачных сервисов

OpenVPN строится на собственном PKI — сертификаты сервера и клиентов подписаны одним CA, который выпускается через easy-rsa, идущий в комплекте. ./easyrsa init-pki ./easyrsa build-ca ./easyrsa build-server-full server nopass ./easyrsa build-client-full client1 nopass Минимальный server.conf: port 1194 proto udp dev tun ca ca.crt cert server.crt key server.key dh dh.pem tls-auth ta.key 0 tls-auth добавляет HMAC-подпись поверх TLS-хендшейка — защита от DoS через невалидные пакеты и от сканирования порта: сервер не отвечает вообще, если пакет не подписан правильным ta.key. ...

September 19, 2026 · llexa

FUSE с нуля #4: gocryptfs — шифрованный маунт поверх обычной ФС

encfs долгое время был стандартным выбором для шифрованного FUSE-маунта, пока в нём не нашли структурные уязвимости (утечка метаданных, уязвимость к атакам по объёму файла). gocryptfs написан позже с учётом этих проблем — тоже FUSE, тоже пофайловое шифрование, но с современной криптографией (AES-256-GCM) и явным аудитом на старте проекта. mkdir cipher plain gocryptfs -init cipher gocryptfs cipher plain После -init в cipher/ создаётся мастер-ключ, зашифрованный паролем; gocryptfs cipher plain монтирует расшифрованное представление в plain/ — файлы внутри лежат как обычно, а в cipher/ физически видны только зашифрованные блобы с именами тоже зашифрованными. ...

September 18, 2026 · llexa

keepalived: плавающий IP через VRRP без облачного балансировщика

Когда облачного балансировщика нет (bare-metal, свой ЦОД), а нужен один IP, за которым прозрачно стоит один из двух серверов — keepalived поднимает VRRP: два узла договариваются, кто сейчас MASTER и держит виртуальный IP, а кто BACKUP и ждёт. # /etc/keepalived/keepalived.conf на MASTER vrrp_instance VI_1 { state MASTER interface eth0 virtual_router_id 51 priority 150 virtual_ipaddress { 10.0.0.100/24 } } На BACKUP — та же конфигурация, но state BACKUP и priority ниже (например, 100). virtual_router_id должен совпадать на обеих машинах — это идентификатор VRRP-группы, не порт и не IP. ...

September 18, 2026 · llexa

Обзор новинок #9: релизы за 5–12 сентября

Новые релизы за неделю — что важно для сервера и терминала. syncthing v2.1.5 — поддержка HTTP/HTTPS-прокси с CONNECT https://github.com/syncthing/syncthing/releases/tag/v2.1.5 uptime-kuma 2.5.4 — новые провайдеры уведомлений, SFTP-монитор https://github.com/louislam/uptime-kuma/releases/tag/2.5.4 io_uring — крупные патчи производительности от Jens Axboe https://www.phoronix.com/news/Linux-IO-uring-Crazy-Friday mold — линкер переписывают на Rust, цель — стать линкером по умолчанию https://www.phoronix.com/news/Mold-Linker-In-Rust-Coming skim v5.7.0 — фаззи-поиск в терминале, обновление https://github.com/skim-rs/skim/releases/tag/v5.7.0 #linux #sysadmin #releases

September 18, 2026 · llexa

nsenter: заходим в namespace процесса без docker exec

docker exec работает только если в образе есть шелл, а сам docker жив. nsenter заходит в те же namespaces напрямую через процесс на хосте — работает и для контейнеров без шелла (distroless-образы), и для разбора любых процессов, изолированных namespaces, не только Docker. nsenter --target $(pgrep -f myservice) --mount --uts --ipc --net --pid -- /bin/sh --target PID — чей namespace открываем, дальше флаги выбирают какие именно namespace’ы разделить: --net — сетевой стек контейнера, --mount — его файловую систему, --pid — его дерево процессов. ...

September 17, 2026 · llexa

systemd timers вместо cron: когда это оправдано

Таймер systemd — это два юнита: .timer задаёт расписание, .service — что выполнить. Не замена cron ради моды — таймер даёт то, чего у cron нет: журналирование через journald, зависимости между юнитами, и самое полезное — Persistent=true. # /etc/systemd/system/backup.timer [Timer] OnCalendar=daily Persistent=true [Install] WantedBy=timers.target Persistent=true запускает пропущенный job сразу после старта системы, если она была выключена в момент срабатывания — у cron такого нет, пропущенный запуск в down-time просто теряется. ...

September 17, 2026 · llexa

Vim с нуля #8: diff-режим и работа с патчами

vimdiff file1 file2 открывает оба файла side-by-side с подсветкой различий. Свой diff, без отдельной установки. Перенос изменений: :diffget " взять блок из другого окна :diffput " отправить блок в другое окно ]c / [c " к следующему/предыдущему различию Если правил файл вручную и подсветка не обновилась — :diffupdate пересчитает её заново. Патч можно накатить прямо из Vim: :!patch -p1 < fix.patch. Команда идёт в шелл и правит файл на диске, буфер она не трогает. Поэтому сразу за ней — :e!, иначе Vim покажет старую версию. ...

September 17, 2026 · llexa

tcpdump: захват трафика из терминала

Wireshark на сервере без GUI не поставить, а разобраться, что происходит на сети, иногда нужно прямо там. tcpdump закрывает этот разрыв — захват и базовый разбор пакетов одной командой, файл потом можно открыть в Wireshark локально. tcpdump -i eth0 -n port 443 tcpdump -i any -n host 10.0.0.5 and not port 22 tcpdump -i eth0 -w capture.pcap -n отключает резолв DNS/портов в имена — без него каждый пакет тормозит на обратном lookup. -w пишет в pcap-файл вместо вывода в терминал — так и захватывать на сервере, а анализировать в Wireshark на своей машине. ...

September 16, 2026 · llexa

firewalld: зоны вместо линейных цепочек правил

На RPM-системах (RED OS, RHEL, Fedora) по умолчанию стоит firewalld — модель зон вместо линейного списка правил как в nftables/iptables. Интерфейс приписан к зоне (public, internal, trusted), и правила действуют в контексте зоны, а не глобально. firewall-cmd --get-active-zones firewall-cmd --zone=public --add-service=https --permanent firewall-cmd --zone=public --add-port=8443/tcp --permanent firewall-cmd --reload Без --permanent правило живёт до перезагрузки демона — удобно для теста, опасно для продакшена, если забыл добавить постоянно. Rich rules — точечные исключения, которых нет в сервисах: ...

September 15, 2026 · llexa

HAProxy: балансировка, ACL и health checks

HAProxy разделяет конфиг на frontend (что слушаем) и backend (куда шлём), в отличие от nginx, где всё описывается блоками server/location вперемешку. Такое разделение упрощает ACL — правила маршрутизации по пути, хосту или заголовку живут отдельно от списка бэкендов. frontend web bind *:80 acl is_api path_beg /api use_backend api_servers if is_api default_backend web_servers backend web_servers option httpchk GET /health server web1 10.0.0.1:8080 check server web2 10.0.0.2:8080 check option httpchk шлёт GET на /health, упавший чек убирает узел из ротации без перезапуска HAProxy. check в строке server включает мониторинг — без него трафик слепо идёт и на мёртвый бэкенд. ...

September 14, 2026 · llexa