WireGuard подключается, но не пингуется: маршруты, firewall и peer
Handshake есть, а пинг не проходит? Причина — не в шифровании, а в маршрутизации и firewall. Разбираем, как исправить.
Содержание
Представьте: вы настроили WireGuard, видите, что handshake состоялся, но при попытке пропинговать удалённый узел — тишина. Это одна из самых частых проблем, с которой сталкиваются пользователи. Хорошая новость: в большинстве случаев решение лежит на поверхности и не требует глубоких знаний сетевых технологий. Плохая новость: без понимания основ маршрутизации и работы firewall вы будете долго блуждать в потёмках.
В этой статье мы разберём, почему WireGuard может подключаться, но не пропускать ICMP-пакеты (и не только их). Вы узнаете, как проверить маршруты, настроить firewall и правильно указать AllowedIPs. Мы рассмотрим типичные сценарии, дадим пошаговые инструкции и предостережём от распространённых ошибок. К концу вы сможете самостоятельно диагностировать и устранять проблему «не пингуется» в своей конфигурации WireGuard.
Почему handshake есть, а ping не проходит?
WireGuard — это VPN-туннель, который работает на уровне 3 (IP). Handshake — это процесс установления криптографического соединения между пирами. Если handshake прошёл, значит, пиры видят друг друга и могут обмениваться зашифрованными пакетами. Однако сам по себе handshake не гарантирует, что IP-пакеты будут маршрутизироваться корректно. Пинг (ICMP Echo Request) — это обычный IP-пакет, и для его доставки нужна работающая маршрутизация и отсутствие блокировок на пути.
Чаще всего проблема кроется в одном из четырёх аспектов:
- Неправильные AllowedIPs — определяют, какие подсети должны идти через туннель.
- Отсутствие обратных маршрутов — когда ответный пакет не знает, как вернуться.
- Firewall блокирует ICMP — на одном из пиров или на промежуточном устройстве.
- Неправильная настройка NAT — если сервер должен транслировать адреса.
Рассмотрим каждый пункт подробнее.
Пошаговая диагностика
Шаг 1. Проверьте статус WireGuard
Убедитесь, что туннель активен и handshake состоялся. На Linux используйте:
sudo wg showВы должны увидеть строку latest handshake с недавним временем. Если handshake отсутствует, значит, проблема не в маршрутизации, а в соединении (см. другие статьи). Если handshake есть, переходите к следующему шагу.
Шаг 2. Проверьте AllowedIPs
AllowedIPs — это список подсетей, которые должны быть доступны через туннель. Если вы хотите пинговать удалённый узел, его IP-адрес должен входить в AllowedIPs на вашей стороне. Например, если у сервера адрес 10.0.0.1, а у клиента 10.0.0.2, и вы хотите пинговать сервер, то на клиенте в AllowedIPs должен быть указан 10.0.0.1/32 (или более широкая подсеть).
Но важнее обратное: на сервере в AllowedIPs для клиента должен быть указан адрес клиента (или подсеть). Если вы хотите, чтобы клиент мог пинговать машины за сервером (например, 192.168.1.0/24), то эта подсеть должна быть в AllowedIPs на клиенте. Подробнее о разборе конфигурации читайте в статье Разбор конфигурационного файла WireGuard.
Шаг 3. Проверьте маршруты
После установки туннеля WireGuard автоматически добавляет маршруты для подсетей из AllowedIPs. Проверьте таблицу маршрутизации:
ip routeНа клиенте должен быть маршрут к 10.0.0.1/32 через интерфейс wg0 (или как у вас называется). Если маршрута нет, возможно, вы используете Policy Routing или что-то переопределяет маршруты. Также проверьте, что на сервере есть маршрут к клиенту.
Особое внимание уделите обратным маршрутам. Если клиент отправляет пакет на сервер, сервер должен знать, как отправить ответ. Если сервер не имеет маршрута к клиенту (например, к 10.0.0.2/32), ответ не уйдёт. Обычно маршрут создаётся автоматически, но если у вас сложная сеть, проверьте вручную.
Шаг 4. Проверьте firewall
Firewall может блокировать ICMP-пакеты. На Linux проверьте правила iptables/nftables:
sudo iptables -L -n -vУбедитесь, что политика для INPUT и FORWARD разрешает ICMP. Если у вас есть правила, блокирующие входящие ICMP, добавьте исключения для интерфейса wg0:
sudo iptables -A INPUT -i wg0 -p icmp -j ACCEPTТакже проверьте FORWARD, если пакеты должны транзитом проходить через сервер.
Шаг 5. Проверьте NAT
Если вы используете WireGuard для доступа в интернет или в удалённую сеть, на сервере должен быть настроен NAT (маскарадинг). Без NAT пакеты из туннеля не смогут выйти в другие сети. Проверьте правила iptables:
sudo iptables -t nat -L -n -vДолжно быть правило MASQUERADE для интерфейса wg0 или для выходного интерфейса (например, eth0). Если его нет, добавьте:
sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADEЗамените подсеть на вашу.
Шаг 6. Проверьте ICMP на клиенте
Иногда проблема в том, что клиент сам блокирует ICMP. На Windows проверьте, разрешён ли входящий ping в брандмауэре. На Android/iOS также могут быть ограничения.
Самостоятельная проверка результата
После внесения изменений перезапустите WireGuard и выполните пинг:
ping 10.0.0.1Если пинг проходит, проблема решена. Если нет, продолжайте диагностику. Используйте tcpdump на сервере, чтобы увидеть, приходят ли ICMP-пакеты:
sudo tcpdump -i wg0 icmpЕсли пакеты приходят, но ответ не уходит, значит, проблема в маршрутизации или firewall на сервере. Если пакеты не приходят, проблема на клиенте или в промежуточной сети.
Ограничения и безопасность
Не забывайте, что WireGuard — это VPN, и его настройка требует внимания к безопасности. Никогда не используйте сгенерированные онлайн-конфиги или чужие ключи — это может привести к компрометации вашего трафика. Подробнее об этом в статье Бесплатные конфиги и генераторы: риски.
Также помните, что ICMP может быть заблокирован провайдером или промежуточными устройствами. Если пинг не проходит, но другие сервисы (например, HTTP) работают, возможно, дело в фильтрации ICMP.
Для IPv6 убедитесь, что у вас настроены соответствующие маршруты и firewall (см. Работа с IPv6). Если вы используете CGNAT, могут быть сложности с пробросом портов — читайте CGNAT и DDNS.
В заключение: проблема «WireGuard не пингуется» почти всегда решается проверкой AllowedIPs, маршрутов и firewall. Надеемся, эта статья помогла вам.
Мини-чеклист
- Проверить, что handshake активен (wg show)
- Убедиться, что AllowedIPs включают IP-адрес назначения на обоих пирах
- Проверить таблицу маршрутов на обоих пирах (ip route)
- Разрешить ICMP в firewall для интерфейса wg0
- Настроить NAT (MASQUERADE) на сервере, если нужен доступ к другим сетям
Частые ошибки
- AllowedIPs = 0.0.0.0/0 на клиенте без необходимости — это отправляет весь трафик через VPN, что может вызвать проблемы с маршрутизацией
- Забыли указать обратный маршрут на сервере к подсети клиента
- Firewall блокирует ICMP в цепочке FORWARD на сервере
- Не настроен NAT, поэтому пакеты из туннеля не попадают во внешнюю сеть
- Использование одинаковых IP-адресов в разных подсетях (конфликт адресов)
FAQ
Почему WireGuard показывает handshake, но пинг не проходит?
Handshake означает, что туннель установлен, но для прохождения ICMP необходима корректная маршрутизация и отсутствие блокировок в firewall. Проверьте AllowedIPs, маршруты и правила iptables.
Как проверить, что маршруты настроены правильно?
Используйте команду ip route (Linux) или route print (Windows). Убедитесь, что есть маршрут к удалённой подсети через интерфейс WireGuard.
Что делать, если пинг не проходит, но другие сервисы работают?
Возможно, ICMP заблокирован провайдером или firewall. Попробуйте пропинговать с другого устройства или используйте tcpdump для диагностики.
Нужно ли настраивать NAT на сервере WireGuard?
NAT требуется, если клиенты должны получать доступ к сетям за сервером (например, интернет). Без NAT пакеты не будут маршрутизироваться.
Нужен быстрый рабочий доступ?
Если сейчас важнее вернуть подключение, чем продолжать ручную диагностику, переходите к прямому сценарию оформления доступа.
Получить доступ