AmneziaWG не создаёт новый клиент: Docker API version is too new — диагностика и исправление
Столкнулся с довольно странной проблемой на своём сервере AmneziaWG.
Несколько машин уже давно подключались к VPN и нормально работали. Для каждой машины был создан отдельный конфиг. Когда понадобилось добавить ещё один компьютер, я создал новый доступ через Amnezia, однако новый клиент подключаться не хотел.
В этой заметке покажу, как я диагностировал проблему и что в итоге помогло.
Исходная ситуация
На сервере уже работал контейнер:
Код:
amnezia-awg
Сам сервер достаточно давно не перезапускался, а контейнер AmneziaWG работал больше года.
Существующие клиенты продолжали подключаться без каких-либо проблем.
При этом новый клиент:
- создавался через функцию расшаривания доступа Amnezia;
- получал конфигурацию;
- но соединение не устанавливалось;
- handshake не происходил.
Каждая машина использовала собственный конфиг, поэтому вариант с одновременным использованием одного WireGuard-ключа сразу отпадал.
Проверяю контейнер AmneziaWG
Первым делом я решил посмотреть состояние контейнера:
Код:
docker ps
Но вместо списка контейнеров получил:
Код:
Error response from daemon: client version 1.52 is too new. Maximum supported API version is 1.43
То же самое происходило при попытке выполнить:
Код:
docker exec -it amnezia-awg wg show
Это уже было важной зацепкой.
Получалось, что установленный Docker CLI пытается работать через API 1.52, а запущенный Docker daemon поддерживает только API 1.43.
Временный обход ошибки Docker API
Чтобы не обновлять и не перезапускать сразу рабочий сервер, я временно принудительно указал Docker использовать API 1.43:
Код:
DOCKER_API_VERSION=1.43 docker ps
После этого команда сразу заработала:
Код:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2c44a86bd9fd amnezia-awg "dumb-init /opt/amne…" 24 months ago Up 21 months 0.0.0.0:33979->33979/udp, [::]:33979->33979/udp amnezia-awg
То есть сам контейнер AmneziaWG был исправен и продолжал работать.
Проверяю peers AmneziaWG
Теперь можно было посмотреть реальное состояние WireGuard:
Код:
DOCKER_API_VERSION=1.43 docker exec -it amnezia-awg wg show
У меня интерфейс назывался:
Код:
wg0
и слушал UDP-порт:
Код:
33979
Параметры AmneziaWG выглядели примерно так:
Код:
interface: wg0
listening port: 33979
jc: 4
jmin: 10
jmax: 50
s1: 32
s2: 140
h1: ...
h2: ...
h3: ...
h4: ...
Самое интересное оказалось ниже.
Проверяю клиентов:
Код:
DOCKER_API_VERSION=1.43 docker exec amnezia-awg
wg show wg0 peers | wc -l
У меня результат был:
Код:
20
Проверяю постоянную конфигурацию
Дальше я посмотрел каталог конфигурации AWG:
Код:
DOCKER_API_VERSION=1.43 docker exec amnezia-awg
sh -c 'ls -lah /opt/amnezia/awg'
В нём находились:
Код:
clientsTable
wg0.conf
wireguard_psk.key
wireguard_server_private_key.key
wireguard_server_public_key.key
Проверил размер таблицы клиентов:
Код:
DOCKER_API_VERSION=1.43 docker exec amnezia-awg
sh -c 'wc -c /opt/amnezia/awg/clientsTable; wc -l /opt/amnezia/awg/clientsTable'
В моём случае:
Код:
5866 /opt/amnezia/awg/clientsTable
182 /opt/amnezia/awg/clientsTable
То есть файл не был пустым или повреждённым.
После этого проверил сам конфиг:
Код:
DOCKER_API_VERSION=1.43 docker exec amnezia-awg
grep -c '^[Peer]' /opt/amnezia/awg/wg0.conf
Результат:
Код:
20
И количество реально загруженных peers:
Код:
DOCKER_API_VERSION=1.43 docker exec amnezia-awg
wg show wg0 peers | wc -l
Тоже:
Код:
20
Получалось:
Код:
wg0.conf = 20 peers
живой wg0 = 20 peers
Хотя новый клиент уже был создан через Amnezia.
То есть новый peer на сервер вообще не попадал.
Очень полезная проверка времени изменения файлов
Я также посмотрел даты изменения конфигурации:
Код:
DOCKER_API_VERSION=1.43 docker exec amnezia-awg
stat /opt/amnezia/awg/clientsTable /opt/amnezia/awg/wg0.conf
И обнаружил, что оба файла последний раз изменялись ещё:
Код:
2026-02-18
Хотя нового клиента я пытался создавать сейчас.
Это окончательно показало, что Amnezia не изменяет серверную конфигурацию при создании нового доступа.
Проверяю адрес интерфейса
Отдельно проверил IP самого WireGuard-интерфейса:
Код:
DOCKER_API_VERSION=1.43 docker exec amnezia-awg
ip -4 addr show dev wg0
Получил:
Код:
inet 10.8.1.0/24 scope global wg0
Это также позволило исключить ошибочное предположение, что адрес клиента:
Код:
10.8.1.1/32
обязательно конфликтует с сервером.
В моей конфигурации сервер использовал адрес интерфейса:
Код:
10.8.1.0/24
поэтому клиентский:
Код:
10.8.1.1/32
был допустим.
Почему создаваемый конфиг был нерабочим
При проверке нового конфига обнаружилась ещё одна характерная проблема.
Он выглядел примерно так:
Код:
[Interface]
Address = 10.8.1.1/32
DNS = 1.1.1.1, 1.0.0.1
PrivateKey = ...
Jc = 4
Jmin = 10
Jmax = 50
S1 = 32
S2 = 140
H1 = ...
H2 = ...
H3 = ...
H4 = ...
[Peer]
PublicKey =
PresharedKey =
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = SERVER_IP:33979
PersistentKeepalive = 25
Обратите внимание:
Код:
PublicKey =
PresharedKey =
оставались пустыми.
Такой клиент очевидно не сможет нормально выполнить handshake.
Причём проблема была не в самом WireGuard-протоколе. Amnezia просто не смогла корректно получить данные сервера и записать нового peer.
Нахожу настоящую причину
После этого я проверил версии Docker:
Код:
DOCKER_API_VERSION=1.43 docker version
Получилось:
Код:
Client:
Version: 29.1.3
API version: 1.43 (downgraded from 1.52)
Server:
Engine:
Version: 24.0.7
API version: 1.43
То есть установленный Docker CLI уже был:
Код:
29.1.3
а в памяти всё ещё работал старый daemon:
Код:
24.0.7
Проверил пакеты:
Код:
dpkg -l | grep -E 'docker|containerd' | grep '^ii'
У меня было:
Код:
ii containerd 2.2.1-0ubuntu1~22.04.2
ii docker.io 29.1.3-0ubuntu3~22.04.2
Система:
Код:
Ubuntu 22.04.4 LTS
Получалась следующая ситуация:
Код:
Docker CLI на диске: 29.1.3 / API 1.52
Docker daemon в памяти: 24.0.7 / API 1.43
Скорее всего, пакет Docker обновился через обычное обновление Ubuntu, но сам daemon после этого не был перезапущен.
Почему старые клиенты при этом продолжали работать
На первый взгляд ситуация кажется странной: Docker сломан, а VPN работает.
На самом деле всё логично.
Контейнер AmneziaWG уже был запущен и продолжал обслуживать существующие peers:
Код:
старые клиенты
↓
уже записаны в wg0.conf
↓
уже загружены в wg0
↓
продолжают работать
Но когда Amnezia пытается создать нового клиента, ей необходимо обратиться к контейнеру:
Код:
docker exec ...
А эта команда уже падала:
Код:
client version 1.52 is too new.
Maximum supported API version is 1.43
В результате происходило примерно следующее:
Код:
Amnezia → SSH на сервер
↓
docker exec ...
↓
ошибка Docker API
↓
Amnezia не получает нужные данные
↓
clientsTable не изменяется
↓
wg0.conf не изменяется
↓
новый peer не создаётся
↓
генерируется неполный vpn:///.conf
↓
handshake отсутствует
Исправление
Поскольку на диске уже находился новый Docker, переустанавливать AmneziaWG или Docker не понадобилось.
Я просто перезапустил Docker daemon:
Код:
systemctl restart docker
Перед этим, разумеется, стоит учитывать, что работающие VPN-соединения на короткое время оборвутся.
После перезапуска проверил:
Код:
docker version
Теперь клиент и сервер Docker стали использовать согласованные версии API.
После этого обычные команды снова начали работать без:
Код:
DOCKER_API_VERSION=1.43
Например:
Код:
docker ps
и:
Код:
docker exec amnezia-awg wg show
стали выполняться нормально.
Проверка после исправления
После перезапуска Docker я снова создал новый доступ через Amnezia.
На этот раз всё заработало.
Можно дополнительно проверить количество peers:
Код:
docker exec amnezia-awg wg show wg0 peers | wc -l
Если до создания клиента было:
Код:
20
то после успешного добавления должно стать:
Код:
21
Проверить постоянный конфиг:
Код:
docker exec amnezia-awg
grep -c '^[Peer]' /opt/amnezia/awg/wg0.conf
И время изменения файлов:
Код:
docker exec amnezia-awg
stat /opt/amnezia/awg/clientsTable /opt/amnezia/awg/wg0.conf
После нормального создания клиента дата изменения должна обновиться.
Краткая диагностика
Если старые клиенты AmneziaWG работают, а новые внезапно перестали создаваться, я теперь проверяю в таком порядке.
1. Проверяю Docker
Код:
docker ps
Если вижу:
Код:
client version X is too new.
Maximum supported API version is Y
то временно проверяю через совместимую версию API:
Код:
DOCKER_API_VERSION=1.43 docker ps
Конкретное значение необходимо подставлять из текста ошибки.
2. Проверяю версии Docker
Код:
DOCKER_API_VERSION=1.43 docker version
Смотрю отдельно:
Код:
Client Version
Server Engine Version
API version
3. Проверяю количество AWG peers
Код:
DOCKER_API_VERSION=1.43 docker exec amnezia-awg
wg show wg0 peers | wc -l
4. Проверяю постоянный конфиг
Код:
DOCKER_API_VERSION=1.43 docker exec amnezia-awg
grep -c '^[Peer]' /opt/amnezia/awg/wg0.conf
5. Проверяю время изменения файлов
Код:
DOCKER_API_VERSION=1.43 docker exec amnezia-awg
stat /opt/amnezia/awg/clientsTable /opt/amnezia/awg/wg0.conf
Если я только что создал нового клиента, а файлы не изменились, значит peer на сервер не записался.
6. Если Docker CLI уже обновлён, а daemon старый
Проверяю:
Код:
dockerd --version
и:
Код:
docker version
Если бинарник нового daemon уже установлен, а запущенный Server Engine показывает старую версию, обычно достаточно:
Код:
systemctl restart docker
После этого снова:
Код:
docker version
docker ps
Полезные команды
Показать контейнеры:
Код:
docker ps
Показать состояние AmneziaWG:
Код:
docker exec -it amnezia-awg wg show
Показать только peers:
Код:
docker exec amnezia-awg wg show wg0 peers
Посчитать peers:
Код:
docker exec amnezia-awg wg show wg0 peers | wc -l
Посчитать peers в постоянном конфиге:
Код:
docker exec amnezia-awg
grep -c '^[Peer]' /opt/amnezia/awg/wg0.conf
Посмотреть файлы AmneziaWG:
Код:
docker exec amnezia-awg
sh -c 'ls -lah /opt/amnezia/awg'
Посмотреть адрес интерфейса:
Код:
docker exec amnezia-awg ip -4 addr show dev wg0
Проверить даты конфигурации:
Код:
docker exec amnezia-awg
stat /opt/amnezia/awg/clientsTable /opt/amnezia/awg/wg0.conf
Проверить версии Docker:
Код:
docker version
dockerd --version
Проверить установленные пакеты Ubuntu:
Код:
dpkg -l | grep -E 'docker|containerd' | grep '^ii'
Итог
В моём случае проблема вообще не была связана с количеством клиентов AmneziaWG.
На сервере уже существовало около 20 peers, и они продолжали нормально работать.
Причина оказалась в рассинхронизации версий Docker:
Код:
Docker CLI 29.1.3
Docker daemon 24.0.7
Из-за этого обычный:
Код:
docker exec
не работал.
Amnezia при создании нового доступа не могла нормально обратиться к своему контейнеру, поэтому новый peer не попадал ни в:
Код:
/opt/amnezia/awg/clientsTable
ни в:
Код:
/opt/amnezia/awg/wg0.conf
Старые VPN-подключения при этом продолжали работать, что и делало проблему неочевидной.
После:
Код:
systemctl restart docker
Docker daemon запустился уже с актуальной версией, управление контейнером восстановилось, и Amnezia снова начала нормально создавать новые конфигурации.
Важно!
Если конфигурация AmneziaWG или ссылка
vpn:// уже публиковалась где-либо вместе с настоящим PrivateKey, такой клиентский ключ лучше отозвать и создать новый.PrivateKey и PresharedKey нельзя публиковать в открытом доступе.