WireGuard Error: Port binding error: Unable to listen on specified UDP port — Решение
Служба wg-quick не может поднять интерфейс и завершается аварийно при попытке привязать указанный порт прослушивания к сокету ядра.
- Ошибка в консоли:
[#] ip link set mtu 1420 up dev wg0 ... Error: UDP port 51820 is already in useилиAddress already in use. - Статус юнита
systemctl status wg-quick@wg0показывает статусfailed (Result: exit-code). - В dmesg появляется сообщение:
wireguard: wg0: Cannot bind to UDP port 51820. - Повторный запуск туннеля падает до момента создания сетевого интерфейса.
1. Поиск процесса, блокирующего UDP-порт
Определите процесс, который захватил целевой UDP-порт:
ss -ulnp 'sport = :51820'
# Либо через lsof
lsof -i UDP:51820Если порт занят другим инстансом WireGuard, Docker-контейнером или сервисом вроде Kuma/DNS/STUN, остановите конфликтующий процесс:
kill -9 <PID_ПРОЦЕССА>2. Проверка зависших интерфейсов WireGuard
Если предыдущая сессия туннеля аварийно завершилась, интерфейс ядра мог остаться в памяти:
# Проверка существующих интерфейсов
ip link show type wireguard
# Принудительное удаление зависшего интерфейса
ip link delete dev wg03. Проверка прав доступа и сетевого пространства имен
Если WireGuard запускается без root-прав или в непривилегированном контейнере LXC/Docker, ядро заблокирует привязку к сокету:
# Для непривилегированных портов (< 1024) выдайте capability (если используется userspace wireguard-go):
setcap 'cap_net_bind_service=+ep' /usr/bin/wireguard-go4. Изменение порта прослушивания в конфигурации
Если стандартный порт занят критической службой, смените ListenPort в /etc/wireguard/wg0.conf:
[Interface]
Address = 10.0.0.1/24
ListenPort = 51821
PrivateKey = <PrivateKey>5. Чистый перезапуск сервиса
systemctl restart wg-quick@wg0
wg show wg0 Частые вопросы (FAQ)
Могут ли два разных интерфейса (wg0 и wg1) слушать один и тот же UDP-порт?
Нет. В одном сетевом пространстве имен (network namespace) один UDP-порт может быть занят только одним сокетом интерфейса WireGuard. Для второго туннеля укажите другой ListenPort.
Почему ss/netstat не показывают PID процесса, занявшего порт WireGuard?
Модуль WireGuard работает внутри ядра Linux (in-tree kernel module), поэтому сетевой сокет создается контекстом ядра (kernel socket) и не имеет связанного PID в пространстве пользователя.
Нужно ли указывать ListenPort на стороне клиента?
Нет. На клиентах директиву ListenPort указывать не рекомендуется — система автоматически выберет свободный случайный эфемерный порт для исходящего трафика.
Как разрешить WireGuard слушать привилегированные порты (например, 53 UDP или 443 UDP)?
Модуль ядра WireGuard по умолчанию имеет права ядра и может занимать любые порты от 1 до 65535, если они не заняты другими демонами (например, bind9 или dnsmasq).