Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions .github/workflows/windows.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
name: windows

on:
push:
tags:
- "v*windows*"
- "v*win*"
workflow_dispatch:

permissions:
contents: write

jobs:
dist:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- uses: actions/setup-go@v5
with:
go-version: "1.24"
cache: true

- name: Установить mingw-w64 кросс-тулчейн
run: sudo apt-get update && sudo apt-get install -y gcc-mingw-w64-x86-64 g++-mingw-w64-x86-64 zip

- name: Собрать движок winws2.exe
run: ./scripts/build-engine-windows.sh

- name: Проверка Go-кода
run: |
test -z "$(gofmt -l cmd internal)"
go vet ./...
go test ./...
GOOS=windows go vet ./...

- name: Собрать fdpi.exe и дистрибутив
run: make dist-windows

- name: Отладочные артефакты в CI
if: github.event_name == 'workflow_dispatch' && !startsWith(github.ref, 'refs/tags/')
uses: actions/upload-artifact@v4
with:
name: fdpi-windows-amd64
path: build/fdpi-windows-amd64.zip

- name: Создать релиз
if: startsWith(github.ref, 'refs/tags/')
env:
GH_TOKEN: ${{ github.token }}
run: |
gh release create "${{ github.ref_name }}" \
build/fdpi-windows-amd64.zip \
--title "${{ github.ref_name }} — Windows" \
--generate-notes
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/build/
build/
/fdpi
*.test
11 changes: 10 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
.PHONY: build check engine install uninstall netns bench dist
.PHONY: build check engine engine-windows install uninstall netns bench dist dist-windows
build:
mkdir -p build
go build -trimpath -o build/fdpi ./cmd/fdpi
Expand All @@ -9,6 +9,8 @@ check:
go test -race ./...
engine:
./scripts/build-engine.sh
engine-windows:
./scripts/build-engine-windows.sh
install:
./scripts/install.sh
uninstall:
Expand All @@ -20,3 +22,10 @@ bench:
dist:
mkdir -p build
tar --exclude=./build --exclude=./.git -czf build/fdpi-0.4.0.tar.gz --transform='s,^\.,fdpi-0.4.0,' .
dist-windows: engine-windows
GOOS=windows GOARCH=amd64 CGO_ENABLED=0 go build -trimpath -ldflags "-s -w" -o build/windows/fdpi.exe ./cmd/fdpi
cp third_party/windivert/x64/WinDivert64.sys build/windows/
cp configs/default.json build/windows/config.json
rm -f build/fdpi-windows-amd64.zip
cd build/windows && { command -v zip >/dev/null && zip -qr ../fdpi-windows-amd64.zip fdpi.exe winws2.exe WinDivert.dll WinDivert64.sys config.json lua ZAPRET-LICENSE engine.commit ../../README_WINDOWS.md || 7z a -tzip -r ../fdpi-windows-amd64.zip fdpi.exe winws2.exe WinDivert.dll WinDivert64.sys config.json lua ZAPRET-LICENSE engine.commit ../../README_WINDOWS.md >/dev/null; }
@echo "Готово: build/fdpi-windows-amd64.zip"
44 changes: 35 additions & 9 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
<div align="center">

![FDPI — Fast DPI Bypass](docs/assets/banner.png)

[![Linux](https://img.shields.io/badge/Linux-CachyOS%20%2F%20Arch-64d9f2?style=for-the-badge&labelColor=10111b)](docs/INSTALL_RU.md)
[![Go](https://img.shields.io/badge/Go-1.24%2B-ad91ff?style=for-the-badge&labelColor=10111b)](go.mod)
[![License](https://img.shields.io/badge/License-MIT-79ee9a?style=for-the-badge&labelColor=10111b)](LICENSE)
Expand All @@ -19,8 +17,8 @@
╰─────────────────────────────────────────────────────╯
```

FDPI — терминальная утилита для Linux с русским интерфейсом, интерактивной
установкой и отдельной фоновой службой. Локальные изменения применяются явно.
FDPI — терминальная утилита для Linux и Windows с русским интерфейсом,
интерактивной установкой и отдельной фоновой службой. Локальные изменения применяются явно.
В интерфейсе нет выдуманных PASS: выбранный профиль и проверенный доступ —
разные состояния.

Expand All @@ -34,7 +32,7 @@ FDPI — терминальная утилита для Linux с русским
</table>

Изображения интерфейса сняты с работающего TUI в PTY и отрисованы из терминальных
ячеек. Баннер — иллюстрация, созданная с помощью генерации изображений.
ячеек; на Windows отрисовка та же.

## Что такое DPI и зачем нужен FDPI

Expand All @@ -56,6 +54,8 @@ DPI анализирует пакеты и состояние соединени

## Установка

### Linux (CachyOS / Arch)

```bash
git clone https://github.com/futureUnd1ground/fdpi.git
cd fdpi
Expand All @@ -76,6 +76,30 @@ fdpi config enable spotify on
fdpi apply # применить выбранные профили
```

Conntrack, автозапуск systemd, обновление и PKGBUILD —
[полная Linux-инструкция](docs/INSTALL_RU.md).

### Windows 10/11 (x64)

Сборка не нужна: скачайте `fdpi-windows-amd64.zip` из
[релизов](https://github.com/futureUnd1ground/fdpi/releases) и распакуйте в
отдельную папку, например `C:\FDPI`. Внутри — `fdpi.exe`, `winws2.exe`,
подписанный драйвер WinDivert 2.2.2, Lua-библиотеки и конфигурация по умолчанию.

```powershell
Expand-Archive fdpi-windows-amd64.zip -DestinationPath C:\FDPI
cd C:\FDPI
.\fdpi.exe
```

`fdpi.exe` открывает мастер первого запуска: проверка компонентов, выбор
сервисов (YouTube, Discord, Steam, Spotify) и стратегии, затем установка
службы Windows с автозапуском — один запрос UAC — и тест выбранных доменов.
Движок — Windows-вариант nfqws2 (zapret2) поверх WinDivert; интерфейс тот же.
[Требования, управление службой, пути и удаление →](README_WINDOWS.md)

Клавиши TUI одинаковые на обеих платформах:

| Клавиши | Действие |
|---|---|
| `Tab`, `←`, `→` | Разделы |
Expand Down Expand Up @@ -133,12 +157,14 @@ make netns # user/network namespace, настоящий движок
# FDPI — Fast DPI Bypass

**Первый запуск:** выполните `fdpi setup` (интерактивный мастер), нажмите `i` в TUI или откройте
[установку по шагам](docs/INSTALL_RU.md). Интерфейс и основные сообщения — на русском.
[установку по шагам](docs/INSTALL_RU.md); для Windows — [отдельную инструкцию](README_WINDOWS.md).
Интерфейс и основные сообщения — на русском.


FDPI 0.4.0 — Linux-утилита на Go: непривилегированный TUI, CLI и отдельный
сервис управления **настоящим nfqws2**. Основная платформа — CachyOS/Arch Linux.
Обработка пакетов выполняется nfqws2, а не Go. Это первая реализация, ещё не
FDPI 0.4.0 — утилита на Go: на Linux она управляет **настоящим nfqws2**
(NFQUEUE/nftables, systemd), на Windows 10/11 x64 — **winws2** из zapret2
(WinDivert, служба). Основная платформа — CachyOS/Arch Linux. Обработка пакетов
выполняется внешним движком, а не Go. Это первая реализация, ещё не
подтверждённая для ежедневной работы на разных провайдерах.

**Проверено:** сборка, race detector, реальный nftables/NFQUEUE/nfqws2 на ядре
Expand Down
84 changes: 84 additions & 0 deletions README_WINDOWS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
# FDPI для Windows

FDPI управляет доменными стратегиями обхода DPI: выбирает сервисы, подбирает
стратегии и следит за фоновой службой. На Windows вместо nfqueue/nftables
используется движок **winws2** (zapret2, WinDivert) — те же стратегии
(фрагментация, fake-пакеты, QUIC), тот же TUI.

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

1. Скачайте `fdpi-windows-amd64.zip` из [релизов](../../releases) и распакуйте
в отдельную папку, например `C:\FDPI`. Архив уже содержит всё необходимое:
`fdpi.exe`, `winws2.exe`, подписанный драйвер `WinDivert64.sys`,
`WinDivert.dll`, Lua-библиотеки стратегий и конфигурацию по умолчанию.
2. Запустите `fdpi.exe` (двойной клик в `cmd`/Windows Terminal — нужен
терминал). Откроется мастер первого запуска:
- проверка компонентов;
- выбор сервисов (YouTube, Discord, Steam, Spotify) и стратегии;
- установка службы Windows (одно согласие UAC) и её запуск;
- тест доступности выбранных доменов.
3. Дальше — основной TUI: обзор, сервисы, стратегии, **подбор стратегии**,
журнал, настройки. Клавиши: `j`/`k` или стрелки, `Enter`, `q` — выход.

Служба `fdpi` стартует автоматически при входе в систему. Обработка идёт
только для доменов включённых профилей и только первых пакетов соединений
на портах 80/443 — остальной трафик не затрагивается.

## Требования

- Windows 10/11 (x64). Драйвер WinDivert 2.2.2 подписан и ставится
автоматически при первом запуске службы; отдельной установки не требуется.
- Права администратора — только для установки/управления службой (UAC);
сам интерфейс работает без них.

## Управление из командной строки

```
fdpi интерфейс (TUI)
fdpi setup мастер первого запуска заново
fdpi start|stop|restart управление службой (с UAC)
fdpi status [--json] состояние службы и движка
fdpi test ДОМЕН DNS, TCP, TLS, HTTPS
fdpi lab СЕРВИС подбор стратегии (перебор с проверкой домена)
fdpi logs [--follow] журнал движка (engine.log)
fdpi doctor диагностика
fdpi service-install установить службу с автозапуском
fdpi service-remove остановить и удалить службу
```

Настройки пользователя (черновик): `%APPDATA%\fdpi\config.json`.
Системные настройки службы: `%ProgramData%\FDPI\config.json`,
журнал: `%ProgramData%\FDPI\logs\engine.log`.

## Как это работает

1. Служба Windows запускает `fdpi daemon`, тот — `winws2.exe` с фильтром
WinDivert на исходящий TCP/80,443 и UDP/443.
2. Для TLS ClientHello и HTTP-запросов к доменам из включённых профилей
движок применяет выбранную стратегию: подменные пакеты (`fake` с
искажённым sequence/TTL), фрагментация (`multisplit`), фрагментация с
перестановкой (`multidisorder`), QUIC Initial fake (`quic`).
3. Домены второго уровня из hostlist покрывают поддомены автоматически.

Движок winws2 — это Windows-вариант nfq2 из [zapret2](https://github.com/bol-van/zapret2)
(подробности в `docs/ENGINE.md`), собранный кросс-компиляцией mingw-w64
скриптом `scripts/build-engine-windows.sh`. WinDivert — отдельный проект
basil00 (LGPL/GPL), бинарные файлы лежат в `third_party/windivert/`.

## Сборка из исходников (Linux)

```
make dist-windows # build/windows + fdpi-windows-amd64.zip
```

Нужны: Go 1.24+, mingw-w64 (`x86_64-w64-mingw32-gcc`), curl, zip.
Скрипт сам скачает Lua 5.4 и zlib, применит патч к zapret2 на закреплённый
commit и соберёт `winws2.exe`.

## Удаление

```
fdpi service-remove
```
Удалите папку с программой. Пользовательские настройки в `%APPDATA%\fdpi`
и `%ProgramData%\FDPI` можно удалить вручную — они не влияют на систему.
File renamed without changes.
14 changes: 14 additions & 0 deletions cmd/fdpi/logs_common.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package main

import "fmt"

func errGrepArg() error {
return fmt.Errorf("после --grep укажите текст поиска")
}
func errCategoryArg() error { return fmt.Errorf("--category err|warning|info") }
func errBadCategory() error {
return fmt.Errorf("неверная категория журнала: используйте err, warning или info")
}
func errUnknownLogArg() error {
return fmt.Errorf("неизвестный параметр журнала")
}
41 changes: 41 additions & 0 deletions cmd/fdpi/logs_linux.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package main

import (
"context"
"os"
"os/exec"
)

// runLogs показывает журнал службы через journalctl.
func runLogs(ctx context.Context, args []string) error {
a := []string{"-u", "fdpi.service", "--no-pager", "-n", "200"}
for i := 0; i < len(args); i++ {
switch args[i] {
case "--follow":
a = append(a, "--follow")
case "--grep":
i++
if i >= len(args) {
return errGrepArg()
}
a = append(a, "--grep", args[i])
case "--category":
i++
if i >= len(args) {
return errCategoryArg()
}
switch args[i] {
case "err", "warning", "info":
a = append(a, "--priority", args[i])
default:
return errBadCategory()
}
default:
return errUnknownLogArg()
}
}
c := exec.CommandContext(ctx, "/usr/bin/journalctl", a...)
c.Stdout = os.Stdout
c.Stderr = os.Stderr
return c.Run()
}
Loading
Loading