Skip to content

EasyTier — mihomo ​

mihomo встраивает узел EasyTier и направляет трафик в его децентрализованную mesh-оверлейную сеть. Узел работает в пространстве пользователя без TUN-устройства (mihomo всегда принудительно включает no_tun и отключает привязку к устройству), а все его транспортные соединения идут через собственный dialer mihomo, поэтому к ним применяются dialer-proxy, interface-name и routing-mark. Оверлей поддерживает только IPv4.

Исходящий ​

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

ПолеТипПо умолчаниюДопустимые значенияОписание
namestring(required)<string>Уникальное имя прокси. Также instance-name по умолчанию, часть state-dir по умолчанию и имя, на которое ссылаются DNS-серверы et://.
network-namestring(required)<string>Имя сети EasyTier. Узлы попадают в одну оверлейную сеть, только если совпадают имя и секрет.
network-secretstring(empty)<string>Общий секрет сети. Для secure-mode нужен непустой секрет.
hostnamestring(core default)<string>Имя хоста, которое узел объявляет в оверлее; другие узлы обращаются к нему как <hostname> или <hostname>.<tld-dns-zone>.
ipv4string(DHCP)<IPv4 CIDR>Статический оверлейный IPv4 с префиксом, например 10.144.0.1/24. Если пусто, DHCP включается автоматически.
dhcpbooltrue when ipv4 is emptytrue | falseПолучать оверлейный IPv4-адрес автоматически.
peers[]string[]<peer URI> | …Пиры или ретрансляторы для подключения, например tcp://192.0.2.10:11010 или udp://…. Добавьте ?peer-public-key=<base64 X25519 key>, чтобы закрепить ключ пира. Обязательно, если у узла нет слушателей; public.easytier.top неявно не используется.
listeners[]string[]<listener URI> | …Локальные URI слушателей, например tcp://0.0.0.0:11010, чтобы другие узлы могли подключаться к этому. Нельзя совмещать с no-listener: true.
no-listener*bool(no listeners)true | falsetrue (или не задано при пустом listeners) — слушатели не открываются. Явный false при пустом listeners открывает слушатель по умолчанию tcp://0.0.0.0:11010.
mapped-listeners[]string[]<listener URI> | …Доступные извне адреса слушателей, которые объявляются другим узлам, например когда порт проброшен на NAT-шлюзе.
exit-nodes[]string[]<overlay IPv4> | …Оверлейные IPv4-адреса узлов, служащих выходными узлами для назначений вне оверлея.
proxy-networks[]string[]<CIDR> | …Подсети, которые этот узел открывает остальному оверлею через подсетевой прокси EasyTier.
instance-namestring(proxy name)<string>Имя встроенного экземпляра EasyTier.
state-dirstringeasytier/<name><directory path>Каталог, где хранится ID экземпляра, чтобы узел сохранял тот же экземпляр между перезапусками. Разрешается относительно рабочего каталога mihomo.
udpboolfalsetrue | falseРазрешить UDP-трафик через этот исходящий.
accept-dns*bool(core default)true | falseПередаётся ядру EasyTier как переключатель Magic DNS. Собственный поиск оверлейных имён в mihomo (см. «Примечания») работает в любом случае.
enable-exit-node*bool(core default)true | falseРазрешить другим узлам использовать этот узел как выходной.
enable-encryption*bool(core default)true | falseШифровать оверлейный трафик между пирами.
encryption-algorithmstring(core default)aes-gcm | <EasyTier algorithm name>Шифр при включённом шифровании. В примере конфигурации апстрима используется aes-gcm.
private-mode*bool(core default)true | falseРазрешать рукопожатие с этим узлом и ретрансляцию через него только узлам той же сети.
latency-first*bool(core default)true | falseПредпочитать путь с наименьшей задержкой, а не с наименьшим числом переходов.
disable-p2p*bool(core default)true | falseНе устанавливать прямые соединения между пирами; трафик идёт только через ретранслирующих пиров.
enable-kcp-proxy*bool(core default)true | falseПередавать проксируемый TCP между пирами поверх KCP (помогает на каналах с потерями).
disable-kcp-input*bool(core default)true | falseОтклонять проксируемые через KCP соединения от других пиров.
enable-quic-proxy*bool(core default)true | falseПередавать проксируемый TCP между пирами поверх QUIC.
disable-quic-input*bool(core default)true | falseОтклонять проксируемые через QUIC соединения от других пиров.
mtuint(core default)<bytes>MTU оверлея. Передаётся, только если больше 0.
tld-dns-zonestringet.net.<DNS zone>Зона Magic DNS для оверлейных имён хостов.
secure-mode*bool(auto)true | falseСквозное шифрование между узлами на основе Noise. Включается автоматически, если заданы локальные ключи или peer-public-key; явный false вместе с такими ключами — ошибка.
local-private-keystring(generated)<base64 X25519 private key>Фиксирует идентичность secure-mode этого узла, чтобы его открытый ключ не менялся между запусками.
local-public-keystring(derived)<base64 X25519 public key>Соответствующий открытый ключ. Обычно выводится из local-private-key; задавать его отдельно — ошибка.

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

Примеры ​

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

yaml
proxies:
  - name: et
    type: easytier
    network-name: example
    network-secret: secret
    peers:
      - tcp://192.0.2.10:11010
      - udp://192.0.2.11:11010
    udp: true

Статический адрес, закреплённый ключ ретранслятора (включает secure mode) и разрешение оверлейных имён средствами mihomo:

yaml
proxies:
  - name: et-office
    type: easytier
    network-name: office
    network-secret: secret
    hostname: mihomo
    ipv4: 10.144.0.5/24
    peers:
      - "tcp://relay.example.com:11010?peer-public-key=<base64-x25519-public-key>"
    local-private-key: "<base64-x25519-private-key>"
    exit-nodes: ["10.144.0.1"]

dns:
  nameserver-policy:
    "+.et.net": et://et-office

Примечания ​

  • network-name обязателен. Узел без peers должен иметь слушатели, иначе конфигурация отклоняется — mihomo никогда не откатывается к публичному узлу public.easytier.top.
  • Логика слушателей: по умолчанию слушатели закрыты. Задайте listeners, чтобы открыть конкретные, или no-listener: false при пустом listeners, чтобы открыть слушатель по умолчанию tcp://0.0.0.0:11010. no-listener: true вместе с listeners — ошибка.
  • Соединения остаются в оверлее и никогда не откатываются к сети хоста. Назначение должно быть оверлейным IPv4-адресом, подсетью, которую другие узлы открыли через proxy-networks, или — при exit-nodes — адресом, достижимым через выходной узел. Назначения IPv6 отклоняются; ip-version влияет только на транспортные соединения с пирами.
  • Поиск имён: имена, совпадающие с оверлейным узлом (<hostname> или <hostname>.<tld-dns-zone>), разрешаются по таблице маршрутов оверлея. Прочие имена в этой зоне завершаются ошибкой "not found"; всё остальное разрешается резолвером, который mihomo использует для имён прокси-серверов.
  • DNS: nameserver вида et://<proxy-name> (или easytier://<proxy-name>) отвечает на оверлейные запросы A и PTR от этого исходящего (TTL 60 с; неизвестные имена получают NXDOMAIN). Он предназначен для записей nameserver-policy, покрывающих зону Magic DNS, а не для роли общего резолвера — см. DNS.
  • Secure mode включается сам, если задать local-private-key / local-public-key или добавить peer-public-key в URI пира. Ему нужен непустой network-secret. Закрепите local-private-key, чтобы открытый ключ узла не менялся между перезапусками.
  • state-dir (по умолчанию easytier/<name>) хранит только ID экземпляра; оверлейный адрес берётся из ipv4 или DHCP.
  • Незаданные необязательные флаги сохраняют значения по умолчанию встроенного ядра EasyTier.
  • Поддержка EasyTier включена в сборку по умолчанию. Сборка с тегом no_easytier принимает ту же форму конфигурации, но при запуске завершается ошибкой "EasyTier support is disabled".

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

  • Xray-core и sing-box не поддерживают EasyTier. Ближайшие аналоги на этом сайте — конечные точки mesh-VPN: Tailscale — sing-box и WireGuard — sing-box.
  • Внутри mihomo другие исходящие для оверлейных сетей в пространстве пользователя — Tailscale и ZeroTier. Nameserver ts://<proxy-name> у Tailscale — аналог et://.

Исходный код: adapter/outbound/easytier.go:51-84 · v1.19.31 (ab405ba)

Core Tutorial от Argsment