No description
  • Go 99.6%
  • Makefile 0.4%
Find a file
Vlad Samoylik 3f03ff748e fix(resolver): require full GET after HEAD+peek 2xx before accessible verdict
HEAD+peek could mark DPI-shaped hosts as accessible after the first few kilobytes; fall through to full GET with stall detection for inconclusive 2xx responses.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-07 13:16:25 +03:00
cmd/courier fix(proxy): idle tunnel timeout and spoofdpi backpressure for YouTube 2026-07-04 13:49:29 +03:00
docs feat(routing): pin RKN slowdown and strict proxied cache hot path 2026-07-04 22:09:31 +03:00
internal fix(resolver): require full GET after HEAD+peek 2xx before accessible verdict 2026-07-07 13:16:25 +03:00
rules Rename courier-client to courier 2026-01-06 21:04:48 +03:00
.cursorrules Add development rules and update cursor configuration 2025-12-12 20:45:31 +03:00
.gitignore Implement robust manual HTTP/1.1 probe with proper stall detection 2026-01-11 23:49:40 +03:00
com.courier.plist Rename courier-client to courier 2026-01-06 21:04:48 +03:00
courier.service Refactor proxy: extract common and http_server packages 2026-02-24 20:32:38 +03:00
courier@.service Rename courier-client to courier 2026-01-06 21:04:48 +03:00
go.mod Add GeoIP database auto-update via IP2Location API 2026-01-14 03:34:34 +03:00
go.sum Add GeoIP database auto-update via IP2Location API 2026-01-14 03:34:34 +03:00
Makefile Revert "fix(routing): improve autodetect, pinned backends, and macOS install" 2026-07-02 12:52:09 +03:00
README.md Update README.md 2026-07-06 14:49:28 +03:00

Courier

Courier — адаптивный proxy-router с приоритетом direct-соединений для локального TCP-трафика.

Он поднимает локальные SOCKS5- и HTTP CONNECT-listener'ы и для каждого назначения решает: идти напрямую или через настроенный upstream-транспорт.

Courier не проксирует всё подряд. Он проверяет пригодность direct-пути и использует proxy только когда direct непригоден или политика явно требует proxy.

Классификатор пригодности direct + минимальный proxy-router. Минимизация proxy-трафика, проверки с учётом локальности и объяснимые решения маршрутизации.

Зачем

В сетях с выборочной фильтрацией и деградированной связностью гонять весь трафик через proxy дорого и часто не нужно.

Courier минимизирует использование proxy:

  • локальный и приватный трафик всегда идёт напрямую;
  • известные рабочие назначения остаются direct;
  • явные правила соблюдаются;
  • ненадёжные назначения уходят через proxy после проверки пригодности direct;
  • каждое решение объяснимо через courier explain.

Модель маршрутизации

ограничения → domain_routing → кэш → шлюз локальности → проверка direct → выбор proxy
  1. Отклоняет IPv6.
  2. Обходит локальные, приватные и no_proxy назначения напрямую.
  3. Применяет явные правила domain_routing (авторитетное переопределение).
  4. Использует свежие доказательства из кэша.
  5. Шлюз локальности (GeoIP): local → direct; foreign/unknown → нужна проверка.
  6. Проверка пригодности direct: usable → direct; unusable → proxy.
  7. Выбирает здоровый upstream только если direct неприемлем.

По умолчанию: profile: balanced, direct_check_enabled: true.

Базовый уклон — direct. Proxy — исключение.

Полный контракт: docs/ROUTING_POLICY.md. Архитектурное решение: docs/ADR_ROUTING_PIPELINE.md.

Профили политики

Профиль Поведение
manual Только domain_routing. Остальное direct. Без GeoIP, probe и записей в кэш.
minimal local → direct; foreign → probe; usable → direct; unusable → proxy; unknown → direct или короткий temporary.
balanced Больше автоматизации: unknown может дать временный proxy; повторяющиеся неоднозначные verdicts → временный proxy.
routing:
  profile: minimal   # manual | minimal | balanced

Объяснение решений (explain)

Основной инструмент отладки — без открытия туннеля и без изменения кэша:

courier explain steampowered.com:443
courier explain steampowered.com:443 --json
courier explain steampowered.com:443 --probe
courier explain steampowered.com:443 --no-network

JSON включает verdict, reason, direct_status, evidence, locality, результат probe, dns_used и dns_reason.

См. docs/CLI.md.

Быстрый старт

make build
courier -config /path/to/config.yaml
courier explain steampowered.com:443

Установка: docs/INSTALLATION.md.

Минимальный конфиг

listener:
  socks5:
    enabled: true
    listen: "127.0.0.1:1080"
  http:
    enabled: true
    listen: "127.0.0.1:8080"

routing:
  profile: minimal
  default_method: auto
  cache_enabled: true

transports:
  measurement_target: "google.com:443"
  socks5:
    selection_mode: weighted
    servers:
      - name: swe
        address: "127.0.0.1:1091"
        priority: 100

domain_routing:
  - domain: "*.steampowered.com"
    method: socks5
    backend: swe
  - domain: "example.local"
    method: direct

Полный справочник: docs/CONFIGURATION.md.

Кэш и upstream

courier cache get steampowered.com
courier cache cleanup --legacy-apex --dry-run
courier stats

Здоровье upstream: сквозной CONNECT до measurement_target, не TCP до локального порта. См. docs/UPSTREAM_HEALTH.md.

Чем Courier не является

  • Courier — не VPN и не transport-туннель.
  • Courier не проксирует весь трафик по умолчанию.
  • Courier решает, когда нужен настроенный upstream-транспорт.

Карта документации

Документ Содержание
docs/ROUTING_POLICY.md Конвейер, причины, wildcards, профили
docs/CACHE.md SQLite-кэш, TTL, probe
docs/GEOIP.md Шлюз локальности, foreign_proxy_chain
docs/UPSTREAM_HEALTH.md Состояние здоровья, latency
docs/CONFIGURATION.md Справочник конфигурации
docs/CLI.md explain, cache, probe, stats
docs/INSTALLATION.md Сборка, systemd, launchd
docs/ADR_ROUTING_PIPELINE.md ADR: конвейер, confidence, defaults

Лицензия

GPLv3