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).
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
name | string | (required) | <string> | Уникальное имя прокси. Также участвует в построении state-dir по умолчанию, поэтому без явного state-dir переименование прокси даёт узлу новую идентичность. |
network | string | (required) | <16-hex-digit network ID> | Сеть ZeroTier для подключения — 16-значный шестнадцатеричный ID сети. |
state-dir | string | zerotier/<network>-<hash of name> | <directory path> | Каталог с постоянным состоянием узла и его идентичностью по умолчанию. Разрешается относительно рабочего каталога mihomo и должен оставаться в пределах безопасных путей. |
identity-secret | string | (from state-dir) | <identity.secret contents> | Полное содержимое identity.secret (address:0:public-key:private-key). Должно содержать закрытый ключ. Переопределяет идентичность из state-dir и никогда туда не записывается. |
planet | string | (built-in Earth planet) | <planet file path> | Путь к частному файлу planet, заменяющему встроенные корневые серверы (собственные корни). Читается и проверяется при запуске. |
mtu | int | (controller MTU) | 1280-10000 | Локальное переопределение MTU виртуальной сети. Может только понизить MTU, назначенный контроллером (2800, если контроллер его не передал). |
ip-stack | IPStackOption | (auto) | IPStackOption | Стек IP в пространстве пользователя, несущий TCP/UDP-трафик сети. Тот же блок, что на странице WireGuard (mode, congestion-controller). |
physical-mtu | int | 1432 | 510-10324 | Максимальная полезная нагрузка UDP, которую ZeroTier отправляет в физическую сеть. |
udp | bool | false | true | false | Разрешить UDP-трафик через этот исходящий. |
remote-dns-resolve | bool | false | true | false | Разрешать имена хостов назначения внутри сети ZeroTier через DNS-серверы, которые передаёт контроллер (или dns, если задан). Если выключено, имена разрешаются обычным резолвером mihomo. |
dns | []string | (controller-provided) | <nameserver> | … | Замена DNS-серверов, переданных контроллером. Используется только при remote-dns-resolve: true; запросы идут через этот исходящий. |
low-bandwidth | bool | false | true | false | Сократить фоновый трафик и частоту обновления конфигурации сети. |
encrypted-hello | bool | false | true | false | Отправлять исходящие пакеты HELLO с расширенным шифрованием ZeroTier (протокол 13). |
primary-port | int | 0 | 0-65535 | Основной локальный UDP-порт. 0 — любой свободный порт. |
secondary-port | int | 0 | -1 | 0-65535 | Второй локальный UDP-порт. 0 — свободный порт (выбирается заново примерно после двух минут без связи); -1 отключает его. Должен отличаться от primary-port. |
tcp-fallback-mode | string | auto | auto | force | disable | Резервный TCP-ретранслятор. auto сохраняет UDP и переходит на ретранслятор только после отказа прямого UDP; force отправляет всё через ретранслятор; disable никогда его не использует. |
tcp-fallback-relay | string | 204.80.128.1:443 | <host:port> | Адрес резервного TCP-ретранслятора. По умолчанию — публичный ретранслятор ZeroTier. |
orbit | []ZeroTierOrbitOption | [] | [ZeroTierOrbitOption] | Федеративные корневые миры (moon), к которым подключаться в дополнение к planet. Каждый world ID допускается только один раз. |
remote-trace-target | string | (unset) | <10-hex-digit node ID> | ID узла, получающего диагностические трассировки этого узла. |
remote-trace-level | uint64 | 0 | 0 | 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[]
| Поле | Тип | По умолчанию | Допустимые значения | Описание |
|---|---|---|---|---|
world | string | (required) | <16-hex-digit world ID> | ID мира moon. |
seed | string | (required) | <10-hex-digit node ID> | ID узла одного из корневых серверов этого moon; используется для получения описания мира. |
Исходный код: adapter/outbound/zerotier.go:132-135 · зафиксировано на v1.19.31 (ab405ba)
Блок ip-stack (mode, congestion-controller) описан на странице WireGuard.
Примеры
Минимальный исходящий, подключающийся к сети (после первого запуска авторизуйте узел в контроллере):
proxies:
- name: zt
type: zerotier
network: "0123456789abcdef"
udp: trueФиксированная идентичность, DNS контроллера для имён хостов и транспортный трафик через другой прокси:
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-ретранслятор:
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)
