- Go 99.6%
- Makefile 0.4%
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> |
||
|---|---|---|
| cmd/courier | ||
| docs | ||
| internal | ||
| rules | ||
| .cursorrules | ||
| .gitignore | ||
| com.courier.plist | ||
| courier.service | ||
| courier@.service | ||
| go.mod | ||
| go.sum | ||
| Makefile | ||
| README.md | ||
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
- Отклоняет IPv6.
- Обходит локальные, приватные и
no_proxyназначения напрямую. - Применяет явные правила
domain_routing(авторитетное переопределение). - Использует свежие доказательства из кэша.
- Шлюз локальности (GeoIP): local → direct; foreign/unknown → нужна проверка.
- Проверка пригодности direct: usable → direct; unusable → proxy.
- Выбирает здоровый 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