Что нового

AmneziaWG не создаёт новый клиент: ошибка Docker API version is too new и её исправление

AmneziaWG не создаёт новый клиент: Docker API version is too new — диагностика и исправление​


Столкнулся с довольно странной проблемой на своём сервере AmneziaWG.

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

В этой заметке покажу, как я диагностировал проблему и что в итоге помогло.
72845672.jpg

Исходная ситуация​


На сервере уже работал контейнер:

Код:
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 нельзя публиковать в открытом доступе.
Об авторе
Guru
Василий, cистемный админ /gnu/linux/windows/macos/mikrotik/troubleshooter, создатель сайта
Интересуюсь всем что делает инфраструктуру быстрой и надёжной
Открыт к общению и проектам, написать мне можно через форму или в личном сообщении

❗ Если есть пожелания по обзору какого-либо вопроса не представленного на сайте - пиши в комментариях

Комментарии

Нет комментариев для отображения.

Информация о статье

Автор
Guru
Время чтения статьи
7 мин чтения
Просмотры
16
Посл. обновление

Ещё в VPN

Ещё от Guru

Поделиться этой статьёй

Назад
Верх