Обновить
64K+
28
Иван Бондарев@lked

ИТ-специалист, Linux, сети, self-hosting и другое

137,3
Рейтинг
19
Подписчики
Отправить сообщение

Хорошая схема, спасибо что поделились. Если дома белый IP и провайдер не режет L2TP - так и правда проще: одна коробка, без аренды, да и рунет видит домашний адрес, а не датацентр. Честный плюс.

Статья скорее для другого старта: серый IP за CGNAT (у нас это сплошь и рядом) или когда нужен туннель, переживающий DPI. L2TP легко опознаётся и его нередко режут, а без IPsec он ещё и не шифрует. AmneziaWG на современном WireGuard, полегче в настройке и с обфускацией под блокировки. Так что не сложнее, а под другую задачу.

Метод рабочий, добавлю пару мест, где в такой переразметке легко словить сюрприз.

Первое - примонтировал новый диск в /opt/example, а старые данные из каталога не вычистил. Они не исчезнут, а спрячутся под маунтом и продолжат жрать место на корне - потом сидишь и гадаешь, почему / не освободился. И важен порядок: сервис должен стартовать уже после монтирования ФС, иначе успеет насыпать данных в пустой каталог под точкой монтирования. Надёжнее всего повесить в его юнит RequiresMountsFor=/opt/example.

Второе - место не вернулось после переноса. Чаще всего это процесс, который держит открытыми уже удалённые файлы: пока он жив, место не отдастся. lsof +L1 покажет виновника, помогает рестарт сервиса. Реже - снапшоты или зарезервированные под root блоки.

Про Тануки на 8 марта - точный пример: наплыв реальных заказов на графике легко принять за атаку. По логам вы это уже разбираете на уровне L7, добавлю пару сигналов ниже - они за минуту разводят атаку и всплеск нагрузки.

SYN-флуд видно сразу: ss -ntp state syn-recv | wc -l - если полуоткрытых соединений тысячи, это точно не покупатели набежали. Помогает дёшево - net.ipv4.tcp_syncookies=1, но именно от SYN-флуда, не от любого DDoS.

А ещё бывает так, что выглядит как атака, а это переполнение conntrack. conntrack -C против net.netfilter.nf_conntrack_max: таблица забита - новые соединения рубятся, сервер лежит, а трафик смешной. Тут не фильтры нужны, а поднять max и укоротить таймауты. И глянуть поток tcpdump-ом - однородный ли он.

У cron есть подлянка, про которую тут не сказали: он запускает задачу по расписанию, даже если прошлый запуск ещё не закончился. Медленный бэкап или скрипт, который иногда подвисает, за ночь наплодит десяток своих копий - они дерутся за диск и io, load улетает, а выглядит так, будто всё само сломалось.

Оборачиваю такие джобы в flock: flock -n /run/lock/myjob.lock -c ‘команда’ - пока первый не отработал, второй просто не стартует.

Кстати, поэтому systemd-таймеры, о которых выше писали, тут спокойнее: выполняющийся юнит таймер повторно не запустит, наложения нет из коробки. И рядом классика: у cron свой урезанный PATH, так что рабочая команда из crontab нередко падает с command not found, пока не пропишешь полный путь.

Да, 1280 уже низ, тут согласен - я и давал его только как крайний случай, если рвётся под нагрузкой, а не в простое. А keepalive на телефоне крутится в userspace, и если система рубит приложение в фоне, он может вообще не уходить - хоть 5, хоть 25. Так что сперва разрешить фон в настройках батареи, а keepalive уже потом: 25 обычно хватает, 5 - если NAT злой или роутер капризный.

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

Зайди в настройки батареи, разреши приложению (amneziawg/Amnezia) работать без ограничений, и в конфиге поставь PersistentKeepalive = 25. Обычно после этого перестаёт отваливаться.

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

По кластеру важный момент: RandomizedDelaySec - это рандомизация, а не координация. Задержка случайная и берётся заново при каждом срабатывании таймера, между узлами никак не согласована - два узла спокойно попадут в одно окно, и кворум всё равно уедет. Для кворума это не лечение, а лотерея.

Если надо железно по одному - либо выключить автоприменение и катить своим плейбуком (как выше с ansible), либо развести окна ребута по узлам, чтобы они физически не пересекались. В k8s для этого есть kured: держит кластерный лок и ребутит строго по одному, уважая PodDisruptionBudget (сам по себе PDB ребут ноды не сдержит - выше верно подметили).

А "моргание" одиночного сервера - это needrestart дёргает сервисы после апдейта библиотек. Если внезапный рестарт хуже отложенного, переведи его в list-only ($nrconf{restart} = ‘l’) и перезапускай в своё окно.

Хорошо расписано. На практике, правда, больнее всего не как оно грузится, а когда не грузится - вот пара вещей из жизни.

Классика: систему перенесли на другой гипервизор или сменили дисковый контроллер, и она больше не поднимается - падает в аварийный shell с «cannot mount root». Почти всегда это initramfs без нужного драйвера (virtio-scsi, nvme и подобное): ядро стартануло, а до диска достучаться нечем. Лечится из live или rescue - chroot и пересобрать initramfs (update-initramfs -u или dracut -f), проверив, что модуль реально попал внутрь.

Если грузится, но долго - systemd-analyze blame и critical-chain сразу показывают, какой юнит держит. Обычно какой-нибудь висящий *-wait-online или сетевой маунт, который ждёт таймаут.

Так в том и беда, что постоянного списка нет. Подсети у хостеров кочуют: сегодня диапазон чистый, через месяц уже в банах - потому и старые темы протухают, та с 2022-го на 4pda сейчас мало чем поможет. ntc.party посвежее, но туда ещё попасть надо.

Я бы на старте за списком и не гонялся. Поставить - минут пять, так что проще просто пробовать: поднял сервер, проверил пару минут. Не взлетело - не сиди весь вечер над конфигом, скорее всего дело в самом хостере, бери другую локацию или провайдера. Почасовая оплата у многих есть, попытка стоит копейки. И ещё: чем популярнее облако, тем хуже. Hetzner, OVH, DigitalOcean берут под VPN массово, их диапазоны чаще всего и оказываются в банах. Что-то поменьше и порегиональнее живёт дольше, хотя и внутри Hetzner иногда везёт на чистую подсеть - тут лотерея.

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

Для одного устройства - да, клиентский AllowedIPs проще, я в статье так и пишу. «Сложно» в серверной схеме не для пользователя: всё один раз делается на сервере, а на клиенте только импортируешь конфиг.

Серверная схема - для семьи, когда устройств несколько. То раздельное туннелирование, про которое ты говоришь, есть в полном приложении Amnezia, а оно тяжёлое - тащит кучу протоколов. Его пришлось бы включать на каждом телефоне и держать список РФ-сетей свежим. На сервере это один раз через ipset, дальше список обновляется сам по расписанию. А устройствам достаётся лёгкий AmneziaWG-клиент (тот же amneziawg-android): импортировал конфиг и пользуешься, ничего не настраивая. То есть не сложнее - просто настройка переезжает с десятка клиентов в одну точку.

Подробнее про серверную часть: https://github.com/bivlked/amneziawg-installer/blob/main/CASCADE.md

Знакомая ситуация. Бан за пару секунд - это не «трафик резали», а блок по хостеру: подсети Hetzner (да и других крупных - OVH, Aruba) давно в списках, новый VPS оттуда режут почти сразу. Выше верно подсказали. Лечится сменой площадки - на ntc.party и 4pda есть живые списки рабочих хостеров, Финляндия с Германией сами по себе ок, если конкретная подсеть чистая.

Для семейного копеечного не усложняй на старте: берёшь один такой сервер, ставишь скрипт одной командой (Linux знать не надо), поднимаешь на нём всех и раздаёшь QR на телефоны - уже рабочий семейный VPN. А деление «ru напрямую, остальное за бугор» живёт на сервере, не на каждом устройстве, так что вручную правила прописывать не нужно - это просто шаг второй, добавишь когда освоишься. Начать: https://github.com/bivlked/amneziawg-installer, про деление отдельно: https://github.com/bivlked/amneziawg-installer/blob/main/CASCADE.md

Апдейт по теме статьи: выкатил v5.17.0. Добавил в фаервол сервера MSS-clamp - он подрезает размер TCP-сегментов под MTU туннеля. Это убирает ровно ту болячку, про которую писал выше: когда на мобильном или в каскаде тяжёлые страницы и закачки виснут из-за того, что где-то по пути режется ICMP.

Всё на стороне сервера, клиентам ничего переделывать не надо. Подробности в релизе: https://github.com/bivlked/amneziawg-installer/releases/tag/v5.17.0

Спасибо, гляну на досуге. Только у нас разные истории: у вас, судя по Docker с панелью, роутер/файрвол с веб-мордой; у меня наоборот - голый kernel-native установщик под одну задачу, без докера и демонов, чтобы на копеечном VPS ничего лишнего не молотило. Так что не пересекаемся - скорее про разные сценарии. Удачи с проектом.

Прямо внутри LXC - нет. Я ставлю AmneziaWG модулем ядра через DKMS, а контейнер делит ядро с хостом и свой модуль загрузить не даёт. На Proxmox есть два рабочих пути:

  1. Отдать VPN отдельную KVM-виртуалку. Там своё ядро, и скрипт отрабатывает ровно как на обычном VPS, без танцев с бубном. Я бы выбрал этот - проще всего.

  2. Остаться в LXC, но ставить userspace-вариант amneziawg-go: модуль ядра ему не нужен, работает через /dev/net/tun. Мой инсталлятор этот путь не покрывает (он намеренно kernel-native ради скорости), но в ADVANCED.md есть ручной рецепт. Нужен privileged-контейнер либо unprivileged с проброшенным /dev/net/tun и CAP_NET_ADMIN, плюс nesting для iptables. По скорости хуже kernel-native, ориентир +30-50% CPU на гигабите.

Раздел про LXC: https://github.com/bivlked/amneziawg-installer/blob/main/ADVANCED.md#lxc-userspace-adv

Если пойдёте по userspace и упрётесь - заходите в Issues, разберёмся.

Справедливо, для гигабита на быстром канале hy2 с агрессивным congestion control выжмет больше - 0ka выше верно разложил, не поспоришь. Но это другая задача. Козырь у Амнезии другой - лёгкость: WireGuard в ядре, копеечный VPS почти не грузится, на клиенте просто приложение на телефоне (хочешь - и бота-раздатчика в докере рядом, серверу без разницы). Для дома 300-450 Мбит за глаза, а весь смысл - проскочить DPI, не теряя этой лёгкости. Возни с настройкой под операторов, кстати, стало меньше - есть пресет и таблица с рецептами.

Так и есть, для себя одного клиентский роутинг проще - в статье про это и написано, хватает AllowedIPs на клиенте, без всякого каскада. И geosite в xray штука удобная, тут не спорю.

Каскад нужен в другом случае: когда деление держишь на сервере и не хочешь лезть в каждого клиента. Раздал семье QR в приложении - и у всех сразу рунет напрямую, остальное за границу, без .dat и правил. Для одного пользователя это правда перебор.

Про оверхед справедливо, тут не спорю. Суть скрипта в другом: он берёт самый дешёвый VPS и выжимает из него максимум как из VPN-сервера - тюнинг под железо, харднинг, а клиентами вы управляете из консоли. Это для тех, кому нужен сервер, заточенный под одну задачу и полностью свой. Подробно тут: https://bivlked.github.io/amneziawg-installer/ru/compare/

Честный размен, одного правильного ответа тут нет.

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

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

Кому важно вообще не думать - коммерческий разумнее. Кто не хочет отдавать трафик чужому дяде - свой.

На iOS клиент (WG/AmneziaWG) разруливает трафик по AllowedIPs - то есть по диапазонам адресов, а не по доменам. Поэтому «только заблокированное в туннель» в лоб не выходит: клиенту нужно скормить список подсетей, которые гнать через VPN. Готовые списки заблокированного (типа antizapret) под это есть, но их нужно обновлять, и под CDN-сервисы с плавающими IP они всё равно не закроют.

Сосед выше как раз так и сделал - вручную прописал маски CDN, и это рабочий путь. Если честно, на айфоне проще гнать всё через туннель (AllowedIPs 0.0.0.0/0), но точечный список тоже живёт. Одна засада: некоторые мелко нарезанные списки на iOS рвут коннект через несколько секунд, выглядит один в один как блокировка по DPI, хотя дело в маршрутах. Полный туннель этим не страдает.

Так что выбор такой: либо всё в туннель и не думать, либо точечный список подсетей, но повозиться придётся.

Тут @Barnaby выше верно поправил - официальное приложение тоже умеет несколько клиентов, не только то устройство, с которого ставишь. Так что разница не в этом.

Она в другом. Официальное приложение разворачивает серверную часть в Docker и управляет ей из своего GUI. Мой установщик ставит AmneziaWG 2.0 модулем ядра, без докера, всё headless одной командой по SSH, и заодно настраивает сам сервер под одну задачу - VPN-сервер, но максимально эффективно и срезает лишние пакеты. Протокол под капотом один и тот же.

Если любопытно, отличия от родного приложения расписаны отдельно: https://bivlked.github.io/amneziawg-installer/ru/compare/

Информация

В рейтинге
39-й
Откуда
Москва, Москва и Московская обл., Россия
Дата рождения
Зарегистрирован
Активность

Специализация

Системный администратор, Администратор серверов
Старший
Python
Linux
Git
Bash
Nginx