Перейти к содержанию

Поставщики прокси

proxy-providers:
  provider1:
    type: http
    url: "http://test.com"
    path: ./proxy_providers/provider1.yaml
    interval: 3600
    proxy: DIRECT
    size-limit: 0
    age-secret-key: AGE-SECRET-KEY-1ZTQLLN0A4U3ZTT3DCZKYN0CGZEZQLWX2DFTXUWMT4ZHR0N2UG6LSW9NT0N
    header:
      User-Agent:
      - "mihomo/1.18.3"
      Authorization:
      - 'token 1231231'
      # X-Age-Public-Key:
      # - 'age1xh86kh9v23vattr58yedspm3f57sxvnswu9krr6ns438amekx5gsd09uma'
    health-check:
      enable: true
      url: https://www.gstatic.com/generate_204
      interval: 300
      timeout: 5000
      lazy: true
      expected-status: 204
    override:
      tfo: false
      mptcp: false
      udp: true
      udp-over-tcp: false
      down: "50 Mbps"
      up: "10 Mbps"
      skip-cert-verify: true
      name-cert-verify: example.com
      dialer-proxy: proxy
      interface-name: tailscale0
      routing-mark: 233
      ip-version: ipv4-prefer
      additional-prefix: "provider1 prefix |"
      additional-suffix: "| provider1 suffix"
      proxy-name:
      - pattern: "IPLC-(.*?)倍"
        target: "iplc x $1"
      # override-expr:
      #   - '.name = "[provider1] " + .name'                    
      #   - '.plugin-opts.mode = "tls"'                        
      #   - '.alpn[] |= upcase'                                
      #   - 'del(.skip-cert-verify)'                           
      #   - '.name = (.name | trim | upcase)'                  
      #   - '.name = "[\(.type)] \(.name):\(.port)"'           
      #   - '(select(.port == 443) | .tls) = true'             
      #   - '.tags |= (unique | sort)'                         
      #   - '.names = [.servers[] | select(.enabled) | .name]' 
      #   - '.servers |= map(select(.enabled))'                
      #   - '.options |= with_entries(.key |= upcase)'         
      #   - '. | with_entries(.key |= upcase)'                 
    filter: "(?i)港|hk|hongkong|hong kong"
    exclude-filter: "xxx"
    exclude-type: "ss|http"
    payload:
      - name: "ss1"
        type: ss
        server: server
        port: 443
        cipher: chacha20-ietf-poly1305
        password: "password"

name

Обязательное поле. Имя провайдера (например, provider1). Должно быть уникальным. Рекомендуется, чтобы оно не совпадало с именами групп прокси (Proxy Groups).

type

Обязательное поле. Тип провайдера, доступные варианты: http / file / inline.

url

URL-адрес для загрузки. Требуется только в том случае, если type имеет значение http.

path

Необязательное поле. Путь к файлу. Должен быть уникальным. Если не указан, в качестве имени файла будет использоваться MD5-хэш от URL.

Из соображений безопасности по умолчанию разрешено сохранение файлов только внутри домашней директории HomeDir (которая задается параметром запуска -d). Если вы хотите сохранить файл в другом месте, укажите дополнительные разрешенные пути через переменную окружения SAFE_PATHS. Синтаксис этой переменной соответствует правилам системной переменной PATH (разделение точкой с запятой ; в Windows и двоеточием : в других операционных системах).

interval

Интервал обновления провайдера, в секундах.

proxy

Выполнять загрузку/обновление через указанный прокси. По умолчанию DIRECT (напрямую).

size-limit

Ограничение максимального размера загружаемого файла. Значение по умолчанию 0 означает отсутствие ограничений. Единица измерения — байты (b).

age-secret-key

Если этот параметр установлен, ядро попытается расшифровать файл конфигурации в формате age armor, используя указанный секретный ключ.

Примечание:

  • На данный момент для зашифрованного контента поддерживается только официальный ASCII-формат "armor" спецификации age-encryption.org/v1.
  • Что касается форматов ключей, в настоящее время поддерживаются только типы получателей x25519 и гибридный постквантовый тип получателя mlkem768-x25519 из спецификации age-encryption.org/v1.
  • На данный момент ядро не отправляет публичный ключ серверу автоматически. Пользователям необходимо вручную установить заголовок X-Age-Public-Key или загрузить публичный ключ другими способами.
  • Загрузка зашифрованных конфигурационных файлов также поддерживается через аргумент командной строки -age-secret-key или переменную окружения CLASH_AGE_SECRET_KEY.

Утилиты:

  • Вы можете сгенерировать подходящий ключ x25519 с помощью команды mihomo age keygen.
  • Вы можете сгенерировать подходящий ключ mlkem768-x25519 с помощью команды mihomo age keygen-pq.
  • Вы можете экспортировать открытый ключ age-public-key из секретного ключа с помощью mihomo age convert <secret_key>.
  • Вы можете расшифровать зашифрованный файл с помощью mihomo age decrypt <secret_key> <source_file> <target_file>. Если вместо <source_file> указан дефис -, чтение будет производиться из стандартного ввода; если вместо <target_file> указан дефис -, запись будет производиться в стандартный вывод.
  • Вы можете зашифровать незашифрованный файл с помощью mihomo age encrypt <public_key> <source_file> <target_file>. Если вместо <source_file> указан дефис -, чтение будет производиться из стандартного ввода; если вместо <target_file> указан дефис -, запись будет производиться в стандартный вывод.

Примеры реализаций:

Пользовательские заголовки HTTP-запроса.

health-check

Проверка доступности (тест задержки).

health-check.enable

Включение проверки. Доступные варианты: true/false.

health-check.url

URL-адрес для проверки доступности. Рекомендуется использовать один из следующих адресов:

https://cp.cloudflare.com
https://www.gstatic.com/generate_204

health-check.interval

Интервал между проверками доступности, в секундах.

health-check.timeout

Таймаут проверки доступности, в миллисекундах.

health-check.lazy

Ленивый режим (Lazy state). По умолчанию true. Проверка задержки не выполняется, если узлы из данного провайдера не используются.

health-check.expected-status

См. Ожидаемый статус (Expected Status).

override

Переопределение конфигурации узлов при их загрузке. Поддерживаются следующие поля:

override.additional-prefix

Добавляет фиксированный префикс к имени узла.

override.additional-suffix

Добавляет фиксированный суффикс к имени узла.

override.proxy-name

Заменяет текст в имени узла с поддержкой регулярных выражений. pattern — это заменяемое регулярное выражение, а target — строка замены.

override.Прочие_параметры_конфигурации

См. общие поля tfo

См. общие поля mptcp

См. общие поля udp.

См. Shadowsocks udp-over-tcp

См. Hysteria/Hysteria2 up.

См. Hysteria/Hysteria2 down.

См. общие поля skip-cert-verify.

См. общие поля name-cert-verify.

См. общие поля dialer-proxy.

См. общие поля interface-name.

См. общие поля routing-mark.

См. общие поля ip-version.

override.override-expr

Это подмножество правил переопределения конфигурации на основе выражений в стиле yq v4. Элементы массива выполняются последовательно и вступают в силу позже, чем статические переопределения полей, описанные выше (такие как udp: true и т. д.).

Поддерживаемые формы путей: ., .name, ."a.b", .["a.b"], .items[0], .items[-1]; [] может обходить массивы или mapping. Присваивание создает отсутствующие mapping и неотрицательные индексы массивов, но не обновляет данные через скаляры.

Поддерживаемые операции: =, |=, +=, -=, *=, del(.field), pipeline |, union через запятую, select, оператор значения по умолчанию //, обычные сравнения и булевы операции. Значения поддерживают null / ~, булевы значения, десятичные/шестнадцатеричные целые числа, float, строки в двойных кавычках, массивы и mapping с ключами в двойных кавычках.

Поддерживаемые функции: length, keys, has, contains, select, reverse, sort, unique, flatten, any, all, map, map_values, filter, to_entries, from_entries, with_entries, any_c, all_c, test, sub, split, join, upcase, downcase, trim, tostring, tonumber, type и not.

Ограничения и важные примечания

  • Каждое выражение на выходе должно возвращать ровно один объект (mapping). Множественные результаты, не собранные в массив, а также операции del(.), приводящие к пустому результату, не поддерживаются.
  • Обязательно используйте круглые скобки, если в правой части оператора присваивания используются конвейеры (|) или логические операторы and/or.
  • Функция from_entries принимает только массивы элементов, содержащие строковые ключи.
  • Функция sort поддерживает только массивы скаляров (чисел или строк). Функции any/all поддерживаются только в беспараметрической форме.
  • Операторы ==/!= сравнивают текстовые значения скаляров по правилам yq, глубокое структурное сравнение массивов или объектов не выполняется.
  • Операторы <, <=, >, >= поддерживают сравнение только между числами, строками и null. При логических проверках только false и null обрабатываются как ложные значения, все остальные (включая 0 и "") считаются истинными.
  • Аргументы стандартных функций не должны возвращать несколько результатов. Однако функции, принимающие выражения (такие как map/filter), могут обрабатывать потоки результатов в своих аргументах. Аргументы функций могут разделяться запятыми или точками с запятой.
  • Вычисления выполняются по семантике значений (глубокое копирование). Чтение за пределами границ массива не расширяет исходный массив, а функции flatten/map_values в правой части не изменяют исходный путь неявно.
  • Используйте оператор |=, если вам необходимо изменить значение по исходному пути. Если выражение справа не возвращает результат, цель сохранит свое исходное значение, а не превратится автоматически в null.
  • Данные, прошедшие через потоки объектов, функции keys и преобразования записей, автоматически сортируются по алфавитному порядку ключей, так как базовая структура map[string]any не сохраняет исходный порядок написания ключей в YAML.
  • Неподдерживаемые языковые возможности: определение переменных (например, as/$x), итератор reduce, динамические пути (.[$key]), рекурсивный спуск (..).
  • Неподдерживаемые внешние возможности: обработка многодокументных файлов, доступ к файловой системе/переменным окружения, сохранение/обработка тегов, стилей и комментариев YAML, аргументы CLI-интерфейса yq.
  • Любой синтаксис, операторы или функции yq, не перечисленные в этой документации, не поддерживаются. Если вам нужно условное ветвление, используйте функцию select с последующей цепочкой выражений присваивания вместо конструкции if-else.

filter

Фильтрует узлы, соответствующие ключевым словам или регулярным выражениям. Вы можете использовать символ ` для разделения нескольких регулярных выражений.

exclude-filter

Исключает узлы, соответствующие ключевым словам или регулярным выражениям Вы можете использовать символ ` для разделения нескольких регулярных выражений.

exclude-type

Регулярные выражения не поддерживаются. Разделяйте типы прокси символом |. Исключает узлы на основе типа прокси, указанного в конфигурационном файле.

payload

Содержимое списка узлов. Работает только в том случае, если type имеет значение inline.

Если парсинг по протоколам http или из локального файла file завершается ошибкой, payload может использоваться в качестве резервного списка прокси-серверов.