AmneziaWG: Ошибка выделения памяти при генерации случайного паддинга
- Аварийное завершение демона AmneziaWG с сообщением:
runtime: out of memoryилиkmalloc-512 allocation failed. - Внезапная перезагрузка домашнего роутера при одновременном подключении нескольких VPN-клиентов.
- В выводе
dmesgпоявляются предупреждения:page allocation failure: order:0, mode:0xcc0(GFP_KERNEL). - Зависание очереди передачи пакетов туннельного интерфейса.
1. Причина нехватки памяти при обфускации
Генерация криптографически стойких случайных чисел (CSPRNG) для параметров Jc и S1/S2 при высокой интенсивности пакетов рукопожатия вызывает частое выделение и освобождение страниц памяти в ядре Linux, приводя к фрагментации пула памяти Slab.
2. Оптимизация параметров паддинга для роутеров и слабых VPS
Уменьшите количество мусорных пакетов и размеры смещений в конфигурационном файле:
[Interface]
# Снизьте нагрузку на генератор случайных чисел
Jc = 1
Jmin = 20
Jmax = 100
S1 = 10
S2 = 103. Тюнинг ядра Linux для предотвращения фрагментации Slab
Добавьте параметры управления памятью в /etc/sysctl.d/99-amnezia-mem.conf:
# Минимальный резерв свободной памяти для ядра
vm.min_free_kbytes = 16384
# Снижение агрессивности кэширования dentry/inode
vm.vfs_cache_pressure = 200
# Своевременный сброс dirty страниц
vm.dirty_background_ratio = 5sysctl --system4. Мониторинг аллокаций ядра через slabtop
slabtop -s c -o | head -n 20 Частые вопросы (FAQ)
Почему WireGuard не страдает от этой проблемы, а AmneziaWG страдает?
Стандартный WireGuard использует статические фиксированные размеры пакетов без динамического выделения буферов под случайный паддинг и мусор.
Поможет ли создание Swap-файла на сервере?
Swap помогает только для процессов пространства пользователя (amneziawg-go). Модуль ядра kmod-amneziawg аллоцирует физическую память без возможности сброса в Swap.
Как ограничить использование памяти контейнером Amnezia в Docker?
Используйте директиву mem_limit: 256m и mem_reservation: 128m в секции сервиса Docker Compose.
Как проверить наличие свободной нефрагментированной памяти в ядре?
Проверьте файл /proc/buddyinfo. Если в старших порядках (order 3-10) стоят нули, ядро не может выделить непрерывные блоки памяти.