diff --git a/README.md b/README.md index aa2db74..c428468 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ It handles DPI connected using optical splitter or port mirroring (**Passive DPI # Quick start -* **For Russia**: Download [latest version from Releases page](https://github.com/ValdikSS/GoodbyeDPI/releases), unpack the file and run **1_russia_blacklist_dnsredir.cmd** script. -* For other countries: Download [latest version from Releases page](https://github.com/ValdikSS/GoodbyeDPI/releases), unpack the file and run **2_any_country_dnsredir.cmd**. +* **For Russia**: Download [latest version from Releases page](https://github.com/ValdikSS/GoodbyeDPI/releases), unpack the file and run the **1_russia_blacklist_dnsredir.cmd** script. +* For other countries: Download [latest version from Releases page](https://github.com/ValdikSS/GoodbyeDPI/releases), unpack the file and run the **2_any_country_dnsredir.cmd** script. These scripts launch GoodbyeDPI in recommended mode with DNS resolver redirection to Yandex DNS on non-standard port (to prevent DNS poisoning). If it works — congratulations! You can use it as-is or configure further. @@ -89,8 +89,8 @@ Modern modesets (more stable, more compatible, faster): To check if your ISP's DPI could be circumvented, first make sure that your provider does not poison DNS answers by enabling "Secure DNS (DNS over HTTPS)" option in your browser. -* **Chrome**: Settings → [Privacy and security](chrome://settings/security) → Use secure DNS → With: NextDNS -* **Firefox**: [Settings](about:preferences) → Network Settings → Enable DNS over HTTPS → Use provider: NextDNS +* **Chrome**: Settings → [Privacy and security](chrome://settings/privacy) → [Security](chrome://settings/security) → Use secure DNS → Choose NextDNS option or other +* **Firefox**: [Settings](about:preferences) → [Privacy & Security](about:preferences#privacy) → DNS over HTTPS → Choose "Max Protection" option Then run the `goodbyedpi.exe` executable without any options. If it works — congratulations! You can use it as-is or configure further, for example by using `--blacklist` option if the list of blocked websites is known and available for your country. diff --git a/README.ru.md b/README.ru.md new file mode 100644 index 0000000..1eea1a2 --- /dev/null +++ b/README.ru.md @@ -0,0 +1,163 @@ +GoodbyeDPI — утилита для обхода систем Глубокой Проверки Пакетов (DPI) +========================= + +Это программное обеспечение предназначено для обхода систем глубокой проверки пакетов (DPI), которые используются многими интернет-провайдерами для блокировки доступа к определённым сайтам. + +Оно работает с Пассивным DPI, подключённым с помощью оптического сплиттера или зеркалирования порта, который не блокирует данные, а просто отвечает быстрее, чем запрашиваемый адрес назначения, а также с Активным DPI, подключённым последовательно. + +Требуется **Windows 7, 8, 8.1, 10 или 11** с правами администратора. + +# Быстрый старт + +* **Для России**: Скачайте [последнюю версию со страницы релизов](https://github.com/ValdikSS/GoodbyeDPI/releases), распакуйте файл и запустите скрипт **1_russia_blacklist_dnsredir.cmd**. +* Для других стран: Скачайте [последнюю версию со страницы релизов](https://github.com/ValdikSS/GoodbyeDPI/releases), распакуйте файл и запустите скрипт **2_any_country_dnsredir.cmd**. + +Эти скрипты запускают GoodbyeDPI в рекомендованном режиме с перенаправлением DNS-запросов на Yandex DNS через нестандартный порт (чтобы предотвратить подмену DNS). +Если это работает — поздравляем! Вы можете использовать его как есть или настроить дальше. + +# Как использовать + +Скачайте [последнюю версию со страницы релизов](https://github.com/ValdikSS/GoodbyeDPI/releases) и запустите. + +``` +Usage: goodbyedpi.exe [OPTION...] + -p block passive DPI + -q block QUIC/HTTP3 + -r replace Host with hoSt + -s remove space between host header and its value + -m mix Host header case (test.com -> tEsT.cOm) + -f set HTTP fragmentation to value + -k enable HTTP persistent (keep-alive) fragmentation and set it to value + -n do not wait for first segment ACK when -k is enabled + -e set HTTPS fragmentation to value + -a additional space between Method and Request-URI (enables -s, may break sites) + -w try to find and parse HTTP traffic on all processed ports (not only on port 80) + --port additional TCP port to perform fragmentation on (and HTTP tricks with -w) + --ip-id handle additional IP ID (decimal, drop redirects and TCP RSTs with this ID). + This option can be supplied multiple times. + --dns-addr redirect UDP DNS requests to the supplied IP address (experimental) + --dns-port redirect UDP DNS requests to the supplied port (53 by default) + --dnsv6-addr redirect UDPv6 DNS requests to the supplied IPv6 address (experimental) + --dnsv6-port redirect UDPv6 DNS requests to the supplied port (53 by default) + --dns-verb print verbose DNS redirection messages + --blacklist perform circumvention tricks only to host names and subdomains from + supplied text file (HTTP Host/TLS SNI). + This option can be supplied multiple times. + --allow-no-sni perform circumvention if TLS SNI can't be detected with --blacklist enabled. + --frag-by-sni if SNI is detected in TLS packet, fragment the packet right before SNI value. + --set-ttl activate Fake Request Mode and send it with supplied TTL value. + DANGEROUS! May break websites in unexpected ways. Use with care (or --blacklist). + --auto-ttl [a1-a2-m] activate Fake Request Mode, automatically detect TTL and decrease + it based on a distance. If the distance is shorter than a2, TTL is decreased + by a2. If it's longer, (a1; a2) scale is used with the distance as a weight. + If the resulting TTL is more than m(ax), set it to m. + Default (if set): --auto-ttl 1-4-10. Also sets --min-ttl 3. + DANGEROUS! May break websites in unexpected ways. Use with care (or --blacklist). + --min-ttl minimum TTL distance (128/64 - TTL) for which to send Fake Request + in --set-ttl and --auto-ttl modes. + --wrong-chksum activate Fake Request Mode and send it with incorrect TCP checksum. + May not work in a VM or with some routers, but is safer than set-ttl. + --wrong-seq activate Fake Request Mode and send it with TCP SEQ/ACK in the past. + --native-frag fragment (split) the packets by sending them in smaller packets, without + shrinking the Window Size. Works faster (does not slow down the connection) + and better. + --reverse-frag fragment (split) the packets just as --native-frag, but send them in the + reversed order. Works with the websites which could not handle segmented + HTTPS TLS ClientHello (because they receive the TCP flow "combined"). + --max-payload [value] packets with TCP payload data more than [value] won't be processed. + Use this option to reduce CPU usage by skipping huge amount of data + (like file transfers) in already established sessions. + May skip some huge HTTP requests from being processed. + Default (if set): --max-payload 1200. + + +LEGACY modesets: + -1 -p -r -s -f 2 -k 2 -n -e 2 (most compatible mode) + -2 -p -r -s -f 2 -k 2 -n -e 40 (better speed for HTTPS yet still compatible) + -3 -p -r -s -e 40 (better speed for HTTP and HTTPS) + -4 -p -r -s (best speed) + +Modern modesets (more stable, more compatible, faster): + -5 -f 2 -e 2 --auto-ttl --reverse-frag --max-payload + -6 -f 2 -e 2 --wrong-seq --reverse-frag --max-payload + -7 -f 2 -e 2 --wrong-chksum --reverse-frag --max-payload + -8 -f 2 -e 2 --wrong-seq --wrong-chksum --reverse-frag --max-payload + -9 -f 2 -e 2 --wrong-seq --wrong-chksum --reverse-frag --max-payload -q (this is the default) + + Note: combination of --wrong-seq and --wrong-chksum generates two different fake packets. +``` + +Чтобы проверить, можно ли обойти DPI вашего интернет-провайдера, сначала убедитесь, что ваш провайдер не подделывает ответы DNS, включив опцию "Безопасные DNS (DNS через HTTPS)" в вашем браузере. + +* **Chrome**: Настройки → [Конфиденциальность и безопасность](chrome://settings/privacy) → [Безопасность](chrome://settings/security) → Использовать безопасный DNS-сервер → Выбрать пункт NextDNS или другой +* **Firefox**: [Настройки](about:preferences) → [Приватность и Защита](about:preferences#privacy) → DNS через HTTPS → Выбрать пункт "Максимальную защиту" + +Затем запустите исполняемый файл `goodbyedpi.exe` без каких-либо опций. Если это работает — поздравляю! Вы можете использовать его как есть или настроить дальше, например, используя опцию `--blacklist`, если список заблокированных сайтов известен и доступен для вашей страны. + +Если ваш провайдер перехватывает DNS запросы, возможно, вам стоит использовать опцию `--dns-addr` для публичного DNS-резольвера на нестандартном порте (например, Яндекс DNS `77.88.8.8:1253`) или настроить DNS через HTTPS/TLS с помощью сторонних приложений. + +Проверьте скрипты .cmd и измените их в соответствии с вашими предпочтениями и условиями сети. + +# Как это работает + +### Пассивный DPI + +Большинство пассивных DPI отправляют HTTP 302 Redirect, если вы пытаетесь получить доступ к заблокированному сайту через HTTP, и TCP Reset в случае HTTPS быстрее, чем целевой веб-сайт. Пакеты, отправляемые DPI, обычно имеют поле IP Identification, равное `0x0000` или `0x0001`, как это видно у российских провайдеров. Эти пакеты, если они перенаправляют вас на другой сайт (страницу цензуры), блокируются GoodbyeDPI. + +### Активный DPI + +Активный DPI более сложно обмануть. В настоящее время программное обеспечение использует 7 методов для обхода активного DPI: + +* Фрагментация на уровне TCP для первого пакета данных +* Фрагментация на уровне TCP для постоянных (keep-alive) HTTP-сессий +* Замена заголовка `Host` на `hoSt` +* Удаление пробела между именем заголовка и значением в заголовке `Host` +* Добавление дополнительного пробела между методом HTTP (GET, POST и т.д.) и URI +* Изменение регистра значения заголовка Host +* Отправка поддельных HTTP/HTTPS пакетов с низким значением Time-To-Live, некорректной контрольной суммой или неверными номерами последовательности/подтверждения TCP, чтобы обмануть DPI и предотвратить доставку их к назначению + +Эти методы не должны ломать сайты, так как они полностью совместимы со стандартами TCP и HTTP, однако их достаточно, чтобы предотвратить классификацию данных DPI и обойти цензуру. Дополнительный пробел может сломать некоторые сайты, хотя это допустимо согласно спецификации HTTP/1.1 (см. 19.3 Tolerant Applications). + +Программа загружает драйвер WinDivert, который использует Windows Filtering Platform для установки фильтров и перенаправления пакетов в пользовательское пространство. Она работает до тех пор, пока консольное окно остаётся открытым, и завершает работу при закрытии окна. + +# Как собрать из исходников + +Этот проект можно собрать с помощью **GNU Make** и [**mingw**](https://mingw-w64.org). Единственная зависимость — [WinDivert](https://github.com/basil00/Divert). + +Для сборки x86 exe выполните: + +`make CPREFIX=i686-w64-mingw32- WINDIVERTHEADERS=/path/to/windivert/include WINDIVERTLIBS=/path/to/windivert/x86` + +А для x86_64: + +`make CPREFIX=x86_64-w64-mingw32- BIT64=1 WINDIVERTHEADERS=/path/to/windivert/include WINDIVERTLIBS=/path/to/windivert/amd64` + +# Как установить в качестве Службы Windows + +Ознакомьтесь с примерами в скриптах `service_install_russia_blacklist.cmd`, `service_install_russia_blacklist_dnsredir.cmd` и `service_remove.cmd`. + +Измените их в соответствии с вашими потребностями. + +# Известные проблемы + +* Ужасно устаревшие установки Windows 7 не могут загрузить драйвер WinDivert из-за отсутствия поддержки цифровых подписей SHA256. Установите KB3033929 [x86](https://www.microsoft.com/en-us/download/details.aspx?id=46078)/[x64](https://www.microsoft.com/en-us/download/details.aspx?id=46148), или лучше, обновите всю систему с помощью Windows Update. +* ~~Некоторые SSL/TLS стеки не могут обрабатывать фрагментированные пакеты ClientHello, и HTTPS сайты не открываются. Ошибка: [#4](https://github.com/ValdikSS/GoodbyeDPI/issues/4), [#64](https://github.com/ValdikSS/GoodbyeDPI/issues/64).~~ Проблемы с фрагментацией исправлены в версии v0.1.7. +* ~~Антивирус ESET несовместим с драйвером WinDivert [#91](https://github.com/ValdikSS/GoodbyeDPI/issues/91). Это, вероятно, ошибка антивируса, а не WinDivert.~~ + +# Похожие проекты + +- **[zapret](https://github.com/bol-van/zapret)** от @bol-van (для MacOS, Linux и Windows) +- **[Green Tunnel](https://github.com/SadeghHayeri/GreenTunnel)** от @SadeghHayeri (для MacOS, Linux и Windows) +- **[DPI Tunnel CLI](https://github.com/nomoresat/DPITunnel-cli)** от @zhenyolka (для Linux и маршрутизаторов) +- **[DPI Tunnel for Android](https://github.com/nomoresat/DPITunnel-android)** от @zhenyolka (для Android) +- **[PowerTunnel](https://github.com/krlvm/PowerTunnel)** от @krlvm (для Windows, MacOS и Linux) +- **[PowerTunnel for Android](https://github.com/krlvm/PowerTunnel-Android)** от @krlvm (для Android) +- **[SpoofDPI](https://github.com/xvzc/SpoofDPI)** от @xvzc (для macOS и Linux) +- **[GhosTCP](https://github.com/macronut/ghostcp)** от @macronut (для Windows) +- **[ByeDPI](https://github.com/hufrea/byedpi)** для Linux/Windows + **[ByeDPIAndroid](https://github.com/dovecoteescapee/ByeDPIAndroid/)** для Android (без root) + +# Благодарности + +Спасибо @basil00 за [WinDivert](https://github.com/basil00/Divert). Это основная часть этой программы. + +Спасибо каждому участнику [BlockCheck](https://github.com/ValdikSS/blockcheck). Было бы невозможно понять поведение DPI без этой утилиты.