AmneziaWG: Kernel Panic при пересылке пакетов в Linux
- Сервер внезапно зависает или перезагружается при высокой нагрузке на сеть через интерфейс
awg0. - В системном дампе
kdump/journalctl -kфиксируется:BUG: unable to handle page fault for addressв функцииamneziawg_xmitилиskb_copy_bits. - Ядро сообщает о разыменовании нулевого указателя (NULL pointer dereference) в обработчике обфускации пакетов.
- Сбой возникает при включении аппаратной разгрузки Generic Segmentation Offload (GSO).
1. Отключение аппаратных разгрузок сетевой карты (GSO, GRO, TSO)
Драйверы физических сетевых карт могут склеивать пакеты в большие блоки (Super-packets). Если модуль amneziawg пытается наложить случайный паддинг на составной буфер sk_buff, ядро падает в Panic.
# Отключение оффлоадов на внешнем интерфейсе eth0
ethtool -K eth0 gso off gro off tso off
# Фиксация параметров в systemd-networkd или ifupdown
echo "ETHTOOL_OPTS='-K eth0 gso off gro off tso off'" >> /etc/network/interfaces2. Обновление модуля ядра kmod-amneziawg до стабильного релиза
Удалите устаревший модуль DKMS и установите исправленную версию:
# Удаление старой версии
dkms remove amneziawg/1.0.0 --all
# Сборка актуальной версии из официального репозитория
git clone https://github.com/amnezia-vpn/amneziawg-linux-kernel-module.git /usr/src/amneziawg-1.0.1
dkms add amneziawg/1.0.1
dkms build amneziawg/1.0.1
dkms install amneziawg/1.0.13. Проверка корректности очередей ядра в sysctl
# Защита от переполнения сокетов ядра
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=167772164. Временный переход на режим amneziawg-go
Если ядро Linux устарело (например, Enterprise Linux со старым LTS ядром 4.18/5.4), используйте userspace-демон amneziawg-go, который физически изолирован от адресного пространства ядра.
Частые вопросы (FAQ)
Почему обычный WireGuard работает стабильно, а AmneziaWG падает в Panic?
Ранние версии кода модификации sk_buff в AmneziaWG некорректно пересчитывали контрольные суммы транспортного уровня при изменении длины заголовков на лету.
Как сохранить лог сбоя ядра, если сервер уходит в моментальный ребут?
Настройте сборщик kdump или используйте удаленную консоль netconsole для пересылки сообщений printk на соседний сервер по UDP.
Влияет ли отключение GSO/GRO на производительность процессора?
Нагрузка на CPU может незначительно возрасти (на 3-5%), однако это полностью устраняет дестабилизацию и падения сетевого стека.
С какими версиями ядра Linux официально совместим модуль amneziawg?
Модуль поддерживает ядра Linux начиная с версии 5.4 и вплоть до актуальных стабильных веток 6.6+ LTS.