Можно подключиться к пир-у Wireguard только после того, как я пингану сервер.

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

У меня есть 1 компьютер, настроенный как сервер, и все остальные как пиры. Вот конфигурация сервера:

[Interface]
Address = 10.0.0.1/16
SaveConfig = false
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o enp6s0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o enp6s0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o enp6s0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o enp6s0 -j MASQUERADE
ListenPort = 51820
PrivateKey = <key>

# ... больше пиров, которые работают нормально ...

[Peer]
PublicKey = <key>
AllowedIPs = 10.0.55.2

А вот конфигурация нового пира, из-за которого возникают проблемы:

[Interface]
Address = 10.0.55.2
SaveConfig = false
ListenPort = 51820
PrivateKey = <key>

[Peer]
PublicKey = <key>
AllowedIPs = 10.0.0.0/16
Endpoint = my.endpoint.com:51820

Я могу подключиться к этому новому пиру ПОСЛЕ того, как я пинговал сервер с этого нового пира. До этого я получаю только сообщения Destination Host Unreachable.

Я также пробовал использовать адреса только с маской /24, но это ничего не изменило.

Кто-нибудь знает, что не так?

Думаю, я мог бы добавить команду ping как команду PostUp, но это кажется плохим решением.

Пакеты в конечном итоге отправляются на MAC-адрес целевого хоста. Это требует, чтобы MAC-адрес целевого хоста находился в ARP-таблице отправляющего хоста, или чтобы MAC-адрес шлюза по умолчанию отправляющего хоста находился в ARP-таблице отправляющего хоста (для неконтактной связи). Если отправляющий хост и целевой хост находятся в одной и той же Layer 3 сети, то отправляющий хост будет отправлять широковещательный запрос для MAC-адреса целевого хоста в локальной сети. Если отправляющий хост и целевой хост находятся в разных Layer 3 сетях, то отправляющий хост будет отправлять широковещательный запрос для MAC-адреса настроенного шлюза по умолчанию в локальной сети. Когда он получает ответ, он добавляет этот MAC-адрес в свою ARP-таблицу.

Пока вы не инициируете связь с сервером от клиента, у клиента нет ни MAC-адреса сервера в его ARP-таблице, ни MAC-адреса его шлюза по умолчанию в его ARP-таблице… если клиент уже не связывался с неконтактным хостом.

Мой предположение, что это и вызывает проблему. Находятся ли клиент и сервер в одной и той же Layer 3 сети? Мы не можем это сказать, потому что вы пропустили маску сети клиента в вашем вопросе.

Я тестировал WireGuard в домашней лаборатории и столкнулся с такой же проблемой.

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

В конце концов это сработало.

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

У меня была похожая проблема, и мне пришлось добавить это правило ufw, так как ICMP обрабатывается иначе, чем TCP:

sudo ufw route allow in on wg0 out on wg0

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

Проблема, с которой вы столкнулись, говорит о том, что новое устройство-партнёр в конфигурации WireGuard может установить соединение с сервером только после его «пробуждения» с помощью команды ping. Это поведение указывает на возможные проблемы на уровне сетевой конфигурации, особенно связанные с протоколами ARP и маршрутизации.

Анализ проблемы

Для начала, рассмотрим, что происходит при передаче данных между вашим сервером и новым партнёром. При отправке пакетов, отправитель должен знать MAC-адрес получателя на канальном уровне. Это достигается через таблицу ARP (Address Resolution Protocol), в которой хранятся соответствия между IP-адресами и MAC-адресами. Если устройство не знает MAC-адреса целевого хоста, оно не сможет отправить данные, что приводит к ошибке «Destination Host Unreachable».

Потенциальные причины проблемы

  1. ARP-таблица: Когда новое устройство отправляет ping на сервер, оно получает его MAC-адрес, который добавляется в ARP-таблицу устройства. Это объясняет, почему после первого ping соединение устанавливается. Важно убедиться, что ARP-таблицы на обоих устройствах (сервер и клиент) правильно настраиваются.

  2. Маршрутизация: Убедитесь, что маршруты между клиентом и сервером настроены корректно. Если вы используете NAT и у вас несколько сетевых интерфейсов, проверьте, что маршруты перенаправляют пакеты правильно.

  3. Сетевые маски: Проверьте маски подсетей на клиенте и сервере. В вашем случае используется конфигурация 10.0.0.0/16 для сервера и 10.0.55.2 для клиента. Убедитесь, что IP-адреса действительно попадают в однородные подсети.

  4. Политики брандмауэра: Убедитесь, что настройки брандмауэра (например, iptables или ufw) не блокируют ICMP (протокол, используемый для ping). Как вы упомянули, добавление специального правила в ufw (sudo ufw route allow in on wg0 out on wg0) может помочь разрешить трафик между интерфейсами WireGuard.

  5. Настройки WireGuard: Обратите внимание на конфигурационные файлы WireGuard для корректной настройки AllowedIPs. В конфигурации вашего партнёра стоит учесть, чтобы AllowedIPs правильно указывали допустимые адреса, которые могут использоваться для маршрутизации.

Рекомендации по решению

  1. Проверка ARP-таблицы: После первого ping можно проверить ARP-таблицу на клиенте (команда arp -a) и убедиться, что MAC-адрес сервера присутствует.

  2. Настройка маршрутов: Если есть необходимость, добавьте статические маршруты на устройстве-партнёре, чтобы указать, как добраться до сети WireGuard.

  3. Тестирование bриджирования: На вашем маршрутизаторе проверьте, чтобы он возможно не игнорировал определённые типы трафика, такие как Echo Request (ping). Некоторые маршрутизаторы могут иметь радиальные настройки ICMP.

  4. Использование L3-протоколов: Если проблемы продолжаются, подумайте о добавлении правила, которое позволило бы обмен данных между сетевыми интерфейсами, предпочтительно через проверку журнала пакетов.

Заключение

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

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

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