AmneziaWG: Ошибка привязки контейнера amnezia-wireguard к сети хоста
- Ошибка Docker при запуске:
docker: Error response from daemon: driver failed programming external connectivity on endpoint amnezia-wireguard: Bind for 0.0.0.0:51820 failed: port is already allocated. - Контейнер падает с ошибкой:
RTNETLINK answers: Operation not permittedпри создании сетевого интерфейса. - Служба не может получить доступ к внешнему интерфейсу хоста для трансляции NAT/MASQUERADE.
1. Поиск конфликтующих процессов, занимающих порт
# Проверка занятости UDP порта
ss -ulnp | grep 51820
lsof -i UDP:51820Если порт занят системным WireGuard или другим контейнером, остановите службу: systemctl stop wg-quick@*.
2. Настройка необходимых Linux Capabilities в Docker Compose
AmneziaWG требует расширенных прав для взаимодействия с подсистемами маршрутизации ядра:
version: '3.8'
services:
amnezia-wireguard:
image: amneziavpn/amnezia-wireguard:latest
container_name: amnezia-wireguard
restart: always
network_mode: "host"
cap_add:
- NET_ADMIN
- NET_RAW
volumes:
- /etc/amnezia/amnezia-wireguard:/etc/amnezia/amnezia-wireguard
- /lib/modules:/lib/modules:ro
sysctls:
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=13. Включение форвардинга пакетов на хосте
sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.d/99-amnezia.conf
sysctl --system4. Перезапуск сетевого демона Docker
systemctl restart docker
docker compose down && docker compose up -d Частые вопросы (FAQ)
Зачем контейнеру AmneziaWG нужен режим network_mode: 'host'?
Режим host позволяет контейнеру напрямую создавать сетевые интерфейсы awg0 в пространстве имен ядра хоста и избегать двойной трансляции оверхеда Docker bridge.
Что означает ошибка RTNETLINK answers: Operation not permitted в Docker?
Это означает отсутствие capability NET_ADMIN у контейнера. Docker блокирует системные вызовы ip link и iptables без этой директивы.
Нужно ли пробрасывать /lib/modules в контейнер?
Да, если сервер использует kernel-модуль kmod-amneziawg, контейнеру необходим доступ к модулям ядра хоста для выполнения modprobe.
Как изменить порт AmneziaWG в Docker без пересоздания контейнера через приложение?
Отредактируйте переменную ListenPort в файле конфигурации awg0.conf и перезапустите контейнер командой docker restart amnezia-wireguard.