Вопрос или проблема
У меня есть 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».
Потенциальные причины проблемы
-
ARP-таблица: Когда новое устройство отправляет ping на сервер, оно получает его MAC-адрес, который добавляется в ARP-таблицу устройства. Это объясняет, почему после первого ping соединение устанавливается. Важно убедиться, что ARP-таблицы на обоих устройствах (сервер и клиент) правильно настраиваются.
-
Маршрутизация: Убедитесь, что маршруты между клиентом и сервером настроены корректно. Если вы используете NAT и у вас несколько сетевых интерфейсов, проверьте, что маршруты перенаправляют пакеты правильно.
-
Сетевые маски: Проверьте маски подсетей на клиенте и сервере. В вашем случае используется конфигурация 10.0.0.0/16 для сервера и 10.0.55.2 для клиента. Убедитесь, что IP-адреса действительно попадают в однородные подсети.
-
Политики брандмауэра: Убедитесь, что настройки брандмауэра (например, iptables или ufw) не блокируют ICMP (протокол, используемый для ping). Как вы упомянули, добавление специального правила в ufw (
sudo ufw route allow in on wg0 out on wg0
) может помочь разрешить трафик между интерфейсами WireGuard. -
Настройки WireGuard: Обратите внимание на конфигурационные файлы WireGuard для корректной настройки AllowedIPs. В конфигурации вашего партнёра стоит учесть, чтобы AllowedIPs правильно указывали допустимые адреса, которые могут использоваться для маршрутизации.
Рекомендации по решению
-
Проверка ARP-таблицы: После первого ping можно проверить ARP-таблицу на клиенте (команда
arp -a
) и убедиться, что MAC-адрес сервера присутствует. -
Настройка маршрутов: Если есть необходимость, добавьте статические маршруты на устройстве-партнёре, чтобы указать, как добраться до сети WireGuard.
-
Тестирование bриджирования: На вашем маршрутизаторе проверьте, чтобы он возможно не игнорировал определённые типы трафика, такие как Echo Request (ping). Некоторые маршрутизаторы могут иметь радиальные настройки ICMP.
-
Использование L3-протоколов: Если проблемы продолжаются, подумайте о добавлении правила, которое позволило бы обмен данных между сетевыми интерфейсами, предпочтительно через проверку журнала пакетов.
Заключение
Ваша проблема не уникальна и может быть вызвана рядом факторов, от сетевых конфигураций до настроек брандмауэра. Главное — прочность сетевой архитектуры, включая корректную маршрутизацию и наличие обновлённых ARP записей в каждом устройстве. Исправив эти недоработки и следя за рекомендациями, вы сможете устранить текущие трудности подключения и обеспечить стабильную работу WireGuard в вашей сети.