Skip to content

ZeroTier — mihomo ​

mihomo может подключиться к виртуальной сети ZeroTier как узел в пространстве пользователя и направлять в неё трафик прямо из конфигурации прокси. Узел целиком работает в пространстве пользователя — без системной службы ZeroTier и TUN-устройства ядра — и передаёт TCP/UDP через заданный ip-stack. Поддерживаются частные planet, moon (orbit) и резервный TCP-ретранслятор ZeroTier.

Исходящий ​

Запись в proxies: с type: zerotier. Встраивает BasicOption (общие поля исходящих, например dialer-proxy, interface-name, routing-mark и ip-version).

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(required)<string>Уникальное имя прокси. Также участвует в построении state-dir по умолчанию, поэтому без явного state-dir переименование прокси даёт узлу новую идентичность.
networkstring(required)<16-hex-digit network ID>Сеть ZeroTier для подключения — 16-значный шестнадцатеричный ID сети.
state-dirstringzerotier/<network>-<hash of name><directory path>Каталог с постоянным состоянием узла и его идентичностью по умолчанию. Разрешается относительно рабочего каталога mihomo и должен оставаться в пределах безопасных путей.
identity-secretstring(from state-dir)<identity.secret contents>Полное содержимое identity.secret (address:0:public-key:private-key). Должно содержать закрытый ключ. Переопределяет идентичность из state-dir и никогда туда не записывается.
planetstring(built-in Earth planet)<planet file path>Путь к частному файлу planet, заменяющему встроенные корневые серверы (собственные корни). Читается и проверяется при запуске.
mtuint(controller MTU)1280-10000Локальное переопределение MTU виртуальной сети. Может только понизить MTU, назначенный контроллером (2800, если контроллер его не передал).
ip-stackIPStackOption(auto)IPStackOptionСтек IP в пространстве пользователя, несущий TCP/UDP-трафик сети. Тот же блок, что на странице WireGuard (mode, congestion-controller).
physical-mtuint1432510-10324Максимальная полезная нагрузка UDP, которую ZeroTier отправляет в физическую сеть.
udpboolfalsetrue | falseРазрешить UDP-трафик через этот исходящий.
remote-dns-resolveboolfalsetrue | falseРазрешать имена хостов назначения внутри сети ZeroTier через DNS-серверы, которые передаёт контроллер (или dns, если задан). Если выключено, имена разрешаются обычным резолвером mihomo.
dns[]string(controller-provided)<nameserver> | …Замена DNS-серверов, переданных контроллером. Используется только при remote-dns-resolve: true; запросы идут через этот исходящий.
low-bandwidthboolfalsetrue | falseСократить фоновый трафик и частоту обновления конфигурации сети.
encrypted-helloboolfalsetrue | falseОтправлять исходящие пакеты HELLO с расширенным шифрованием ZeroTier (протокол 13).
primary-portint00-65535Основной локальный UDP-порт. 0 — любой свободный порт.
secondary-portint0-1 | 0-65535Второй локальный UDP-порт. 0 — свободный порт (выбирается заново примерно после двух минут без связи); -1 отключает его. Должен отличаться от primary-port.
tcp-fallback-modestringautoauto | force | disableРезервный TCP-ретранслятор. auto сохраняет UDP и переходит на ретранслятор только после отказа прямого UDP; force отправляет всё через ретранслятор; disable никогда его не использует.
tcp-fallback-relaystring204.80.128.1:443<host:port>Адрес резервного TCP-ретранслятора. По умолчанию — публичный ретранслятор ZeroTier.
orbit[]ZeroTierOrbitOption[][ZeroTierOrbitOption]Федеративные корневые миры (moon), к которым подключаться в дополнение к planet. Каждый world ID допускается только один раз.
remote-trace-targetstring(unset)<10-hex-digit node ID>ID узла, получающего диагностические трассировки этого узла.
remote-trace-leveluint6400 | 10 | 15 | 20 | 30Уровень детализации трассировки для remote-trace-target: 0 normal, 10 verbose, 15 rules, 20 debug, 30 insane. Значения больше 30 отклоняются.

Исходный код: adapter/outbound/zerotier.go:108-130 · зафиксировано на v1.19.31 (ab405ba)

orbit[] ​

ПолеТипПо умолчаниюДопустимые значенияОписание
worldstring(required)<16-hex-digit world ID>ID мира moon.
seedstring(required)<10-hex-digit node ID>ID узла одного из корневых серверов этого moon; используется для получения описания мира.

Исходный код: adapter/outbound/zerotier.go:132-135 · зафиксировано на v1.19.31 (ab405ba)

Блок ip-stack (mode, congestion-controller) описан на странице WireGuard.

Примеры ​

Минимальный исходящий, подключающийся к сети (после первого запуска авторизуйте узел в контроллере):

yaml
proxies:
  - name: zt
    type: zerotier
    network: "0123456789abcdef"
    udp: true

Фиксированная идентичность, DNS контроллера для имён хостов и транспортный трафик через другой прокси:

yaml
proxies:
  - name: zt-home
    type: zerotier
    network: "0123456789abcdef"
    identity-secret: "0123456789:0:<public-key>:<private-key>"
    remote-dns-resolve: true
    udp: true
    dialer-proxy: ss1

Собственные корни с moon и принудительный TCP-ретранслятор:

yaml
proxies:
  - name: zt-private
    type: zerotier
    network: "0123456789abcdef"
    planet: ./zerotier/planet
    orbit:
      - world: "0123456789abcdef"
        seed: "0123456789"
    tcp-fallback-mode: force

Примечания ​

  • Доступны только назначения внутри маршрутов, которые назначает контроллер сети; остальное завершается ошибкой "outside ZeroTier managed routes". Чтобы пускать через сеть обычный трафик, контроллер должен передать соответствующий маршрут через участника, работающего шлюзом.
  • state-dir по умолчанию — zerotier/<network>-<первые 12 шестнадцатеричных цифр SHA-256(name)> в рабочем каталоге mihomo, поэтому у каждого исходящего своя идентичность. Сохраняйте каталог (или задайте identity-secret), чтобы ID узла не менялся между перезапусками; в частной сети новый ID придётся авторизовать заново.
  • При заданном identity-secret конфликт адресов с другим узлом нельзя решить сменой идентичности; mihomo повторяет попытку не чаще раза в 30 секунд, пока другой узел не уйдёт.
  • mtu только понижает MTU: действующее значение — меньшее из MTU контроллера (в пределах 1280–10000, 2800, если не передан) и mtu.
  • dns игнорируется без remote-dns-resolve: true. С ним разрешение имён для этого исходящего идёт к DNS-серверам контроллера (или dns) через саму сеть ZeroTier.
  • dialer-proxy пускает транспортный трафик ZeroTier через другой исходящий; тогда вместо общих UDP-сокетов используются отдельные сокеты для каждого пира.
  • Поддержка ZeroTier включена в сборку по умолчанию. Сборка с тегом no_zerotier принимает ту же форму конфигурации, но при запуске завершается ошибкой "ZeroTier support is disabled".

Сравнение с другими ядрами ​

  • Xray-core и sing-box не поддерживают ZeroTier. Ближайшие аналоги на этом сайте — конечные точки mesh-VPN: Tailscale — sing-box (конечная точка в endpoints[]) и WireGuard — sing-box.
  • Внутри mihomo другие исходящие для оверлейных сетей в пространстве пользователя — Tailscale и EasyTier; WireGuard покрывает обычные туннели «точка — точка».

Исходный код: adapter/outbound/zerotier.go:108-130 · v1.19.31 (ab405ba)

Core Tutorial от Argsment