Узел выхода ZeroTier не работает? Проверьте маршрут, NAT и клиент
Маршрут 0.0.0.0/0 в клиенте — ещё не выход. Узел должен пересылать и транслировать, сеть должна анонсировать маршрут, а клиент — принимать его.
Таблица маршрутов показывает маршрут по умолчанию через интерфейс ZeroTier, сеть сообщает, что она в сети, а браузер всё равно выходит с локального адреса провайдера. Такое сочетание встречается часто, и это не ошибка клиента. Маршрут по умолчанию лишь говорит, куда должны идти пакеты; на другом конце что-то должно их пересылать и транслировать. Три отдельные части должны выполняться, прежде чем узел выхода заработает.
Маршрут есть, но наружу ничего не уходит
Сначала проверьте таблицу маршрутов клиента. Строка вроде default via 10.147.20.5 dev zt0 доказывает, что маршрут установлен, а не то, что назначение примет трафик. Следующим хопом должен быть участник, готовый и способный его переслать.
Если тот же запрос по-прежнему уходит через физический интерфейс, клиент не установил маршрут или установил его с метрикой, проигравшей локальному маршруту по умолчанию. Если запрос исчезает после установки маршрута, узел выхода получает пакеты и не может их переслать или транслировать. Клиент, сохраняющий физический маршрут по умолчанию, вообще не отправляет пакет на выход.
Это различие определяет, где работать. Сравнение публичного адреса до и после изменения отделяет маршрут, который никогда не использовался, от того, который использовался и был сброшен, и требует одной команды вместо просмотра всей конфигурации. Сделайте сравнение до того, как менять что-либо ещё, чтобы оба результата были из одного начального состояния.
Три части, которые все должны выполняться
Выход — это цепочка, и самое слабое звено определяет симптом. В таблице ниже звенья перечислены в порядке, в котором они обычно отказывают.
| Part | Where it lives | What a failure looks like |
|---|---|---|
| Forwarding and NAT | Exit node kernel and firewall | Traffic arrives, no reply |
| Managed default route | ZeroTier network controller | No default via the tunnel on the member |
| Client acceptance | Member's per-network setting | Route offered but not installed |
| DNS behavior | Client resolver configuration | Pages fail by name, IP works |
Первая строка — та, которую скрывает название опции. Участник становится выходом только тогда, когда его ядро пересылает пакеты между интерфейсом ZeroTier и интерфейсом, обращённым в интернет, и когда обратный путь транслируется назад в туннель. Без этой пересылки участник — партнёр, а не шлюз.
Строка контроллера — это разрешение, а не конфигурация. Анонс 0.0.0.0/0 через участника сообщает каждому клиенту, где находится выход; это не делает участника способным нести трафик. Это также не проверяет, есть ли у участника работающий путь в интернет. Документация ZeroTier об узле выхода описывает то же разделение между узлом, маршрутом и клиентом.
Настройте узел выхода для пересылки и трансляции
Включите пересылку IPv4 постоянно, затем добавьте NAT источника для трафика, покидающего интерфейс WAN. Правила фильтра должны разрешать пересылаемый поток в обоих направлениях, потому что пересылка и трансляция отделены от разрешения:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i zt0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o zt0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPTЗамените zt0 и eth0 именами на хосте; правило, сохранённое для примера интерфейса, не отслеживает пакеты на реальном. Сделайте изменения постоянными через менеджер межсетевого экрана, которому принадлежат правила, потому что команда в интерактивной оболочке исчезает при следующей перезагрузке.
Если на хосте работает менеджер межсетевого экрана, например UFW или firewalld, добавляйте правила через этот менеджер, а не складывайте строки iptables рядом. Два владельца, редактирующие одни и те же цепочки, создают политику, зависящую от порядка загрузки. Порядок важен, когда менеджер генерирует собственные цепочки. Тестируйте с клиента после перезагрузки менеджера, а не до неё.
Анонсируйте маршрут и примите его на клиенте
На контроллере сети добавьте управляемый маршрут для 0.0.0.0/0, следующим хопом которого является адрес ZeroTier участника выхода. Затем на участнике, который должен его использовать, разрешите переопределение для этой сети. Разрешение локальное: оно не перенастраивает других участников и не меняет контроллер.
zerotier-cli listnetworks
zerotier-cli set <network-id> allowDefault=1
ip route get 1.1.1.1Последняя команда должна сообщать интерфейс ZeroTier и адрес участника выхода. Если она по-прежнему сообщает физический интерфейс, маршрут отсутствует или конкурирующий маршрут по умолчанию имеет лучшую метрику.
Держите настройку ограниченной сетью, которой она нужна. Включение принятия маршрута по умолчанию глобально или в сети, которая должна предоставлять только частную подсеть, отправляет трафик через выход, который никогда не был рассчитан на это.
Проверьте выход и другие семейства адресов
Запросите публичный адрес у сервиса, который сообщает источник, и сравните его с WAN-адресом узла выхода. Затем загрузите сайт по имени, чтобы убедиться, что DNS всё ещё разрешается, и проверьте одно важное приложение, а не только браузер.
Клиент с двойным стеком может продолжать использовать свой собственный путь IPv6, пока IPv4 выходит через ZeroTier. Если цель — скрыть или контролировать весь трафик, нужны отдельный маршрут ::/0 и пересылка IPv6 на выходе, а тест IPv4 ничего о них не говорит.
Обратная фильтрация пути в Linux тоже может отбрасывать действительный трафик выхода на клиенте. ZeroTier документирует соображение по rp_filter для участвующих участников; меняйте эту настройку осознанно и только после подтверждения маршрута и NAT, а не как первый эксперимент.
Если требование — доступ к NAS или одной офисной подсети, управляемый маршрут для этого префикса является меньшим и более безопасным изменением, чем полный выход. Пропускать весь просмотр через другое устройство — это другое решение, чем достичь одного частного ресурса, и оно заслуживает отдельного рассмотрения.