Wireguard – Подписание для узла не завершилось за 5 секунд

Вопрос или проблема

У меня есть проблемы со стабильностью моего соединения через WireGuard. Я настроил 3 VPN-сети (описаны ниже), но давайте сосредоточимся на первой (wg0). Все работает, но через некоторое время соединение разрывается, клиент пытается инициализировать новое рукопожатие, сервер отвечает, но по каким-то причинам ответ никогда не доходит до клиента. Сброс соединения решает проблему до тех пор, пока оно снова не разорвется.

Я пробовал:

1. Установить политику ACCEPT для цепочки input, чтобы проверить, не является ли брандмауэр проблемой на сервере.
2. Установить политику ACCEPT для цепочки forward, чтобы проверить, не является ли брандмауэр проблемой на сервере.
3. Отключить брандмауэр Windows.
4. Понизить MTU как на клиенте, так и на сервере.
5. Установить PersistentKeepalive как на клиенте, так и на сервере.
6. Установить очень низкий PersistentKeepalive на клиенте.

Контекст:

1. Клиент — это ПК с Windows за NAT в домашней сети.
2. Сервер — это VPS на Linux с публичным IP на хостинге Hetzner.

Снимки Wireshark (изображения):
сервер (eth0)
клиент

1. Успешное рукопожатие, затем несколько раз клиенту удается снова выполнить несколько рукопожатий. 
2. Проблема с соединением.
3. Я отключаю клиента.
4. Я пингую клиента с сервера, сервер пытается инициализировать рукопожатия,
они доходят до клиента, но клиент отключен, поэтому они не удаются.
Это доказывает, что нет блокировок сети или брандмауэра со стороны клиента.

Логи WireGuard клиента:

Рукопожатие для пирa 1 (REDACTED:10000) не завершилось после 5 секунд, повторная попытка (попытка 2)
Отправка инициации рукопожатия пирy 1 (REDACTED:10000)
Рукопожатие для пирa 1 (REDACTED:10000) не завершилось после 5 секунд, повторная попытка (попытка 3)
Отправка инициации рукопожатия пирy 1 (REDACTED:10000)
Рукопожатие для пирa 1 (REDACTED:10000) не завершилось после 5 секунд, повторная попытка (попытка 4)

Конфигурация клиента:

[Interface]
PrivateKey = REDACTED
Address = 10.0.0.2/24
DNS = 8.8.8.8
MTU = 1280

[Peer]
PublicKey = REDACTED
AllowedIPs = 10.0.0.0/16
Endpoint = REDACTED:10000
PersistentKeepalive = 25

Конфигурация сервера:

[Interface]
Address = 10.0.0.1/24

ListenPort = 10000
PrivateKey = REDACTED
MTU = 1280

#ПК
[Peer]
PublicKey = REDACTED
AllowedIPs = 10.0.0.2/32

Правила iptables (скрипт):

iptables -F -t filter
iptables -F -t nat
iptables -F -t mangle
iptables -X -t filter
iptables -X -t nat
iptables -X -t mangle

#Установить политику
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP

#Группировать правила в цепочки
iptables -N _INPUT
iptables -N _OUTPUT
iptables -N _FORWARD
iptables -N _POSTROUTING -t nat

#Добавить цепочки
iptables -A INPUT -j _INPUT
iptables -A OUTPUT -j _OUTPUT
iptables -A FORWARD -j _FORWARD
iptables -A POSTROUTING -t nat -j _POSTROUTING

#Разрешить связанные и установленные соединения
iptables -A _INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A _FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

#Разрешить петлевые соединения
iptables -A _INPUT -i lo -j ACCEPT

#WireGuard [wg0] (10.0.0.0/24) -------------------------------------------------------------------------

#Разрешить весь трафик от устройств в этой сети
iptables -I _FORWARD -s 10.0.0.0/24 -j ACCEPT
iptables -I _INPUT -s 10.0.0.0/24 -j ACCEPT

#Открыть порт для этой сети
iptables -A _INPUT -i eth0 -p udp --dport 10000 -j ACCEPT

#Разрешить доступ в интернет
iptables -A _POSTROUTING -t nat -s 10.0.0.0/24 -o eth0 -j MASQUERADE

#WireGuard [wg1] (10.0.1.0/24) -------------------------------------------------------------------------

#Разрешить трафик к другим устройствам в wg1 и wg2
iptables -A _FORWARD -i wg1 -o wg1 -j ACCEPT
iptables -A _FORWARD -i wg1 -o wg2 -j ACCEPT

#Открыть порт для этой сети
iptables -A _INPUT -i eth0 -p udp --dport 10010 -j ACCEPT

#Разрешить доступ в интернет
iptables -A _FORWARD -i wg1 -o eth0 -j ACCEPT
iptables -A _POSTROUTING -t nat -s 10.0.1.0/24 -o eth0 -j MASQUERADE

#WireGuard [wg2] (10.0.2.0/24) -------------------------------------------------------------------------

iptables -A _INPUT -i eth0 -p udp --dport 10020 -j ACCEPT

#Логирование -----------------------------------------------------------------------------------------------

#Логирование новых подключений на портах WireGuard
#iptables -I _INPUT -i eth0 -p udp --dport 10000 -m conntrack --ctstate NEW -m limit --limit 1/s -j LOG --log-prefix "WIREGUARD_NEW_WG0: " --log-level 7
#iptables -I _INPUT -i eth0 -p udp --dport 10010 -m conntrack --ctstate NEW -m limit --limit 1/s -j LOG --log-prefix "WIREGUARD_NEW_WG1: " --log-level 7
#iptables -I _INPUT -i eth0 -p udp --dport 10020 -m conntrack --ctstate NEW -m limit --limit 1/s -j LOG --log-prefix "WIREGUARD_NEW_WG2: " --log-level 7

#Логирование отброшенных на _FORWARD
iptables -A _FORWARD -m limit --limit 1/s -j LOG --log-prefix "IPTABLES_FRWD_DROP: " --log-level 7

Сети описаны:

[wg0] – Высший уровень доверия

Подсеть для этой сети: 10.0.0.0/24
Адрес интерфейса: 10.0.0.1
Адреса клиентов: от 10.0.0.2 до 10.0.0.254
Порт прослушивания: 10000

Устройства в этой сети могут получить доступ к:

  1. Интернету
  2. Устройствам в сети wg0
  3. Устройствам в сети wg1
  4. Устройствам в сети wg2

[wg1] – Ограниченное/Условное доверие

Подсеть для этой сети: 10.0.1.0/24
Адрес интерфейса: 10.0.1.1
Адреса клиентов: от 10.0.1.2 до 10.0.1.254
Порт прослушивания: 10010

Устройства в этой сети могут получить доступ к:

  1. Интернету
  2. Устройствам в сети wg1
  3. Устройствам в сети wg2

[wg2] – Без доверия

Подсеть для этой сети: 10.0.2.0/24
Адрес интерфейса: 10.0.2.1
Адреса клиентов: от 10.0.2.2 до 10.2.0.254
Порт прослушивания: 10020

Устройства в этой сети могут получить доступ к:

  1. Ничему

Ответ или решение

Проблема с ошибкой "Handshake for peer did not complete after 5 seconds" в WireGuard может быть вызвана различными факторами, включая настройки сети, параметры конфигурации WireGuard и правила брандмауэра. Давайте рассмотрим некоторые шаги, которые могут помочь решить вашу проблему.

1. Проверка IP-адресов и ключей

Убедитесь, что IP-адреса и ключи в конфигурации клиента и сервера настроены корректно, и что соответствующие ключи совпадают. Убедитесь, что:

  • В конфигурации клиента используется корректный публичный ключ сервера.
  • Локальный IP-адрес клиента (10.0.0.2) и адрес сервера (10.0.0.1) находятся в одной подсети.

2. Регулирование MTU

Уже упомянутое изменение MTU до 1280 на клиенте и сервере является хорошей практикой. Однако, можно попробовать новые значения MTU, например 1400, чтобы посмотреть, даст ли это улучшение в стабильности соединения.

3. Настройка PersistentKeepalive

Вы уже установили значение PersistentKeepalive на 25 секунд, что должно помочь поддерживать соединение активным. Но в некоторых случаях можно попробовать увеличить это значение до 30 или 60 секунд, чтобы удостовериться в том, что подсоединение оставалось стабильным.

4. Анализ правил iptables

Поскольку вы отключили фаервол Windows, обратите внимание на настройки iptables на стороне сервера. Убедитесь, что у вас разрешены все необходимые соединения для UDP-порта 10000. Поскольку вы используете NAT, убедитесь, что NAT корректно настроен.

Как дополнительное упоминание, вы можете временно разрешить все входящие подключения для диагностики:

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT

Если это решит вашу проблему, вы сможете постепенно добавлять обратно ограничения, чтобы выявить, что конкретно блокирует соединение.

5. Логирование и анализ трафика

Используйте tcpdump или Wireshark для анализа трафика между клиентом и сервером, чтобы увидеть, действительно ли пакеты рукопожатий отправляются и получаются. Если пакеты отправляются, но не доходят, может быть проблема с маршрутизацией или дополнительным фаерволом на промежуточных устройствах (например, роутерах).

6. Проверка доступности сервера

Убедитесь, что ваш VPS в Hetzner имеет стабильное соединение с сетью. Иногда проблемы на стороне провайдера могут приводить к нестабильному соединению.

7. Обновление программного обеспечения

Убедитесь, что вы используете последнюю версию WireGuard и обновленные сетевые драйверы на клиенте. Иногда старые версии могут содержать ошибки, которые уже исправлены в новых релизах.

Заключение

Если ни один из вышеуказанных шагов не решает проблему, попробуйте создать новый тестовый сервер WireGuard без дополнительных настроек, чтобы подтвердить работоспособность базовой конфигурации. Это поможет указать, является ли проблема связанной с вашей текущей настройкой или конкретным окружением.

При соблюдении всех этих рекомендаций, вы сможете улучшить стабильность вашего подключения WireGuard. Если проблема продолжает существовать, возможно стоит рассмотреть дополнительные варианты поддержки или специализированные форумы, где можно получить помощь от сообщества.

Оцените материал
Добавить комментарий

Капча загружается...