DPI-устойчивый VPN с адаптивным движком выбора стратегии. 20+ техник обхода в одном инструменте: REALITY (имитация TLS-fingerprint Chrome/Firefox), HTTP/2 стеганография (данные прячутся в легитимные HTTP/2 фреймы), Traffic morphing (статистически подражает паттернам популярных сервисов), SNI-фрагментация, Salamander padding (QUIC), Geneva engine с правилами для России, Китая, Ирана, Турции. Адаптивный fallback: если текущая стратегия заблокирована — автоматически переключается на следующую в середине сессии без разрыва соединения. Включает TSPU Intelligence — ежемесячно обновляемую базу сигнатур российских блокировок.
git clone https://github.com/tiredvpn/tiredvpn cd tiredvpn # Сервер go build ./cmd/server && ./server --config server.yaml # Клиент go build ./cmd/client && ./client --server my.server:443 \ --strategy adaptive --country ru # Android APK — в релизах на GitHub
VPN, устойчивый к DPI, разработанный для работы в сильно цензурируемых сетях.
Связанные репозитории: tiredvpn/tiredvpn-android — Android-клиент
TiredVPN — это VPN, устойчивый к цензуре, который использует множественные стратегии обхода для установки и поддержания соединения в сетях с активной глубокой инспекцией пакетов (DPI). Вместо того чтобы полагаться на единую технику обфускации, он реализует адаптивный движок стратегий, который автоматически выбирает оптимальный транспорт в зависимости от текущих условий сети.
Система исследует доступные стратегии, ранжирует их по задержке и надежности и переключается на альтернативы в середине сеанса, если активная стратегия оказывается заблокированной. Это делает ее эффективной против сложных фильтрующих систем, таких как ТСПУ (Россия), ВФКН (Китай) и аналогичные инфраструктуры DPI.
Ключевые цели разработки:
| Особенность | TiredVPN | Xray/VLESS | sing-box | Outline |
|---|---|---|---|---|
| Стратегии обхода | 20+ | 3–5 | 5–8 | 1–2 |
| Адаптивное переключение | ✅ В середине сеанса | ❌ | Частичное | ❌ |
| Исследования ТСПУ | Ежедневные отчёты | ❌ | ❌ | ❌ |
| Постквантовая криптография | ✅ ML-KEM-768 | ❌ | ❌ | ❌ |
| Движок Geneva | ✅ | ❌ | ❌ | ❌ |
| Маскировка RTT | ✅ | ❌ | ❌ | ❌ |
| ICMP fallback | ✅ | ❌ | ❌ | ❌ |
| Деформация трафика | ✅ | ❌ | ❌ | ❌ |
| Приложение для Android | ✅ Нативное | Стороннее | Стороннее | ✅ |
| Лицензия | AGPL-3.0 | MPL-2.0 | GPL-3.0 | Apache-2.0 |
curl -fsSL https://tiredvpn.github.io/tiredvpn/install.sh | sudo bash -s -- --port 443
Устанавливает сервер, генерирует секрет и TLS-сертификат, запускает службу и выводит строку подключения, а также QR-код для мобильного приложения. Выберите другой порт с помощью --port N (по умолчанию 443).
curl -fsSL https://tiredvpn.github.io/tiredvpn/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/tiredvpn-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/tiredvpn-archive-keyring.gpg] https://tiredvpn.github.io/tiredvpn/apt stable main" | sudo tee /etc/apt/sources.list.d/tiredvpn.list
sudo apt update && sudo apt install tiredvpn
sudo tiredvpn-init # генерирует секрет/сертификат, печатает ключи, запускает службу
sudo tee /etc/yum.repos.d/tiredvpn.repo >/dev/null <<'EOF'
[tiredvpn]
name=TiredVPN
baseurl=https://tiredvpn.github.io/tiredvpn/rpm/$basearch
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://tiredvpn.github.io/tiredvpn/gpg.key
EOF
sudo dnf install tiredvpn && sudo tiredvpn-init
Пакеты apt и dnf устанавливают службу в отключенном состоянии — они поставляют бинарный файл, но оставляют его остановленным. Запустите sudo tiredvpn-init для завершения настройки: он генерирует секрет и сертификат, печатает ключи доступа и запускает службу. Однострочник и install.sh уже делают это за вас.
Для других дистрибутивов или хостов без systemd загрузите бинарный файл напрямую:
curl -LO https://github.com/tiredvpn/tiredvpn/releases/latest/download/tiredvpn-linux-amd64.tar.gz
tar xzf tiredvpn-linux-amd64.tar.gz
sudo mv tiredvpn-linux-amd64 /usr/local/bin/tiredvpn
Доступные платформы: linux-amd64, linux-arm64. Другие методы установки описаны в разделах Docker и Сборка из исходников ниже.
Kubernetes через Helm (сервер и/или клиент из одного релиза):
helm install my-tiredvpn oci://ghcr.io/tiredvpn/charts/tiredvpn --version 0.1.0 \
-f my-values.yaml
Смотрите deploy/helm/tiredvpn/README.md) для значений, примеров и опций TLS/аутентификации/Redis/HPA.
Следующие шаги (секрет, сертификаты, флаги сервера) предназначены только для ручной или продвинутой настройки. Однострочник и пакеты apt/dnf обрабатывают все это за вас через
tiredvpn-init— перейдите к разделам о приложениях, если вы использовали один из них.
openssl rand -hex 32
Для тестирования создайте самоподписанный сертификат:
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 \
-days 365 -nodes -keyout server.key -out server.crt \
-subj "/CN=your-server.com"
Для производства используйте Let's Encrypt с certbot:
sudo certbot certonly --standalone -d your-server.com
# Сертификаты будут по пути:
# /etc/letsencrypt/live/your-server.com/fullchain.pem
# /etc/letsencrypt/live/your-server.com/privkey.pem
tiredvpn server \
-listen :443 \
-cert server.crt \
-key server.key \
-secret <your-secret>
По умолчанию сервер слушает как TCP (TLS), так и UDP (QUIC). Он обслуживает поддельный веб-сайт для неаутентифицированных посетителей, делая его неотличимым от обычного HTTPS-сервера.
Если вы используете TUN-режим (-tun / -ip-pool), вы должны самостоятельно включить IP-форвардинг и NAT на хосте сервера. TiredVPN намеренно не изменяет ваш файрвол или маршрутизацию. Без этого TUN-клиент подключается, и в логах сервера появляется TUN mode established, но трафик не идет — пакеты клиента достигают TUN-интерфейса сервера и деваться некуда. (Режим SOCKS5-прокси не затронут: процесс сервера сам выводит этот трафик.)
# 1) Включить IP-форвардинг (сделать это постоянным)
sysctl -w net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
# 2) NAT для пула клиентов через ваш аплинк-интерфейс.
# Найти аплинк с помощью: ip route get 1.1.1.1 (часть "dev <iface>")
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o <wan-iface> -j MASQUERADE
# 3) Только если ваша политика FORWARD — DROP (проверить: iptables -S FORWARD | head -1)
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
iptables -A FORWARD -d 10.8.0.0/24 -j ACCEPT
Замените 10.8.0.0/24 на ваш CIDR из -ip-pool, а <wan-iface> на ваш реальный аплинк (например, eth0, enp1s0). Для IPv6-пулов продублируйте правила с ip6tables и net.ipv6.conf.all.forwarding=1. Используйте менеджер файрволов (nftables, ufw, firewalld), если предпочитаете — требование то же: проброс и NAT для пула.
tiredvpn client \
-server your-server.com:443 \
-secret <your-secret> \
-listen 127.0.0.1:1080
Запускает локальный SOCKS5-прокси на порту 1080. Настройте свой браузер или приложения на socks5://127.0.0.1:1080.
sudo tiredvpn client \
-server your-server.com:443 \
-secret <your-secret> \
-tun \
-tun-routes 0.0.0.0/0
Это создает TUN-интерфейс и маршрутизирует весь трафик через VPN.
TiredVPN настраивается полностью через флаги CLI. Запустите tiredvpn server -help или
tiredvpn client -help для получения полного списка.
| Флаг | По умолчанию | Описание |
|---|---|---|
-listen |
:443 |
IPv4 адрес прослушивания |
-listen-v6 |
[::]:995 |
IPv6 адрес прослушивания |
-cert |
server.crt |
Файл TLS-сертификата |
-key |
server.key |
Файл закрытого ключа TLS |
-secret |
Общий секрет (одноклиентский режим) | |
-redis |
Адрес Redis для многоклиентского режима | |
-api-addr |
127.0.0.1:8080 |
REST API для управления клиентами |
-ip-pool |
CIDR для назначения IP-адресов клиентам TUN | |
-tun-mtu |
1280 |
MTU интерфейса TUN (1280-9000) |
-port-range |
Многопортовое прослушивание (например, 47000-47100) |
|
-no-quic |
false |
Отключить прослушиватель QUIC/UDP |
-upstream |
Вышестоящий сервер для многохоповой маршрутизации | |
-fake-root |
./www |
Каталог, предоставляемый неаутентифицированным посетителям |
-enable-icmp |
false |
Включить прослушиватель ICMP-туннеля (требует CAP_NET_RAW) |
-debug |
false |
Подробное логирование |
| Флаг | По умолчанию | Описание |
|---|---|---|
-server |
Адрес удаленного сервера (обязательный) | |
-secret |
Общий секрет (обязательный) | |
-listen |
127.0.0.1:1080 |
Локальный адрес SOCKS5/HTTP прокси |
-tun |
false |
Включить режим TUN (полный VPN) |
-tun-routes |
Маршруты для туннелирования (например, 0.0.0.0/0) |
|
-quic |
false |
Включить транспорт QUIC |
-strategy |
Принудительно указать конкретную стратегию | |
-port-hop |
false |
Включить переключение портов |
-ech |
false |
Включить Encrypted Client Hello |
-pq |
false |
Включить постквантовую криптографию |
-rtt-masking |
false |
Скрывать временную сигнатуру прокси |
-prefer-ipv6 |
true |
Предпочтение транспорта IPv6 |
-fallback |
true |
Откат стратегии во время сессии |
-benchmark |
false |
Запустить тестирование задержки стратегий |
# Добавить клиента (многоклиентский режим с Redis)
tiredvpn admin add -api http://127.0.0.1:8080 -server vpn.example.com:443
# Вывести список клиентов
tiredvpn admin list -api http://127.0.0.1:8080
# Удалить клиента
tiredvpn admin delete -api http://127.0.0.1:8080 -id <client-id>
# Сгенерировать QR-код для мобильного приложения
tiredvpn admin qr -server vpn.example.com:443 -secret <secret>
Готовые образы доступны на Docker Hub. Платформы: linux/amd64, linux/arm64.
| Тег | Описание |
|---|---|
latest |
Последний стабильный релиз |
1.3.3 |
Закрепленная версия |
edge |
Последняя сборка из ветки main |
docker run -d \
--name tiredvpn-server \
-p 443:443/tcp \
-p 443:443/udp \
-v /path/to/certs:/certs:ro \
tiredvpn/tiredvpn:latest \
server -listen :443 \
-cert /certs/server.crt \
-key /certs/server.key \
-secret <your-secret>
curl -O https://raw.githubusercontent.com/tiredvpn/tiredvpn/main/docker-compose.yml
TIREDVPN_SECRET=<your-secret> docker compose up -d
Или с пользовательским docker-compose.yml:
version: "3.8"
services:
tiredvpn-server:
image: tiredvpn/tiredvpn:latest
ports:
- "443:443/tcp"
- "443:443/udp"
volumes:
- ./certs:/certs:ro
command:
- "server"
- "-listen"
- ":443"
- "-cert"
- "/certs/server.crt"
- "-key"
- "/certs/server.key"
- "-secret"
- "${TIREDVPN_SECRET}"
- "-redis"
- "redis:6379"
depends_on:
- redis
restart: unless-stopped
redis:
image: redis:7-alpine
volumes:
- redis-data:/data
restart: unless-stopped
volumes:
redis-data:
docker build -t tiredvpn .
Образ по умолчанию представляет собой сборку scratch-прокси без iptables, поэтому серверный TUN (-ip-pool) в нем не работает. Для полного туннелирования TUN используйте цель сборки tun (tiredvpn:tun), которая требует /dev/net/tun, NET_ADMIN и доступа на запись net.ipv4.ip_forward; его точка входа автоматически настраивает NAT. То же самое относится к Helm с параметром server.tun.enabled. Полные рецепты для docker run / compose / Helm приведены в
docs/deployment.md → TUN mode in containers).
git clone https://github.com/tiredvpn/tiredvpn.git
cd tiredvpn
make build
Или напрямую с помощью Go:
go build -o tiredvpn ./cmd/tiredvpn/
make build-linux
make build-android
make test
TiredVPN включает адаптивный стратегический движок, который автоматически выбирает лучший транспорт. Каждая стратегия ориентирована на аспект обхода DPI.
| ID | Название | Описание |
|---|---|---|
quic_salamander |
QUIC Salamander | QUIC поверх UDP с набивкой Salamander (по умолчанию, труднее всего идентифицировать) |
quic |
QUIC Tunnel | Транспорт QUIC с подменой версии (draft-29 для обхода TSPU) |
reality |
Протокол REALITY | Маскируется под легитимные веб-сайты с аутентичными TLS-отпечатками |
http2_stego |
Стеганография HTTP/2 | Скрывает данные внутри фреймов HTTP/2 с набивкой в стиле NaiveProxy |
websocket_padded |
WebSocket Salamander | Транспорт WebSocket с набивкой обфускации Salamander |
http_polling |
HTTP Polling | Кратковременные запросы HTTP/1.1 (стиль meek), обнаруживает обход длительных соединений |
morph_* |
Морфинг трафика | Переформатирует трафик для соответствия профилям видеостриминга (Yandex, VK) |
confusion_* |
Замешательство протоколов | Заставляет пакеты выглядеть как DNS/HTTP/SSH/SMTP поверх TLS |
geneva_* |
Движок Geneva | Манипуляция пакетами для конкретных стран (Россия TSPU, Китай GFW, Иран, Турция) |
antiprobe |
Анти-проба | Сервер маскируется под обычный веб-сайт; раскрывает туннель только аутентифицированным клиентам |
state_exhaustion |
Иссчерпание состояния | Заполняет таблицу состояний DPI обманными пакетами для активации режима fail-open |
mesh_relay |
Mesh Relay | Маршрутизирует через ретрансляционные узлы в регионах с более слабой фильтрацией |
icmp_tunnel |
ICMP-туннель | Резервный туннель поверх ICMP Echo (режим скрытности, требует CAP_NET_RAW) |
ssh_camouflage |
Маскировка SSH | Туннель под трафиком SSH (приоритет 28, требует поддержки сервером) |
imap_camouflage |
Маскировка IMAP | Туннель под почтовым протоколом IMAP (приоритет 29, требует поддержки сервером) |
Движок стратегий поддерживает:
tiredvpn client -benchmark для тестирования всех стратегий.cmd/tiredvpn/ CLI точка входа (сервер, клиент, admin)
internal/
server/ Серверная обработка соединений, прослушиватели TLS/QUIC
client/ Клиентский прокси, TUN, оркестрация стратегий
strategy/ Стратегии обхода DPI и адаптивный движок
tun/ Управление устройствами TUN
mux/ Интеграция мультиплексора smux
tunnel/ Абстракции туннелей
proxy/ SOCKS5 и HTTP прокси
tls/ Утилиты TLS и отпечатки uTLS
evasion/ Примитивы обхода низкого уровня
geneva/ Движок манипуляции пакетами Geneva
porthopping/ Логика переключения портов
multiport/ Многопортовый прослушиватель
pool/ Пул IP-адресов для клиентов TUN
metrics/ Коллектор метрик Prometheus
padding/ Утилиты набивки трафика
protect/ Защита сокетов VpnService на Android
control/ Протокол управляющего сокета Android
config/ Типы конфигурации
log/ Структурированное логирование
benchmark/ Тестирование стратегий
kt offload/ Снятие нагрузки TLS на уровне ядра
Полная документация доступна в каталоге docs/):
Мы приветствуем вклад. Пожалуйста, ознакомьтесь с CONTRIBUTING.md), где описаны руководящие принципы отправки патчей, сообщения об ошибках и рабочий процесс разработки.
Прежде чем отправлять pull request:
make test и убедитесь, что все тесты проходят.make lint, если у вас установлен golangci-lint.TiredVPN лицензирована в соответствии с GNU Affero General Public License v3.0).