|
| 1 | +GoodbyeDPI — утилита для обхода систем Глубокой Проверки Пакетов (DPI) |
| 2 | +========================= |
| 3 | + |
| 4 | +Это программное обеспечение предназначено для обхода систем глубокой проверки пакетов, которые встречаются у многих интернет-провайдеров и блокируют доступ к определённым сайтам. |
| 5 | + |
| 6 | +Оно работает с DPI, подключёнными с помощью оптического сплиттера или зеркалирования порта (Пассивное DPI), которые не блокируют данные, а просто отвечают быстрее, чем запрашиваемый пункт назначения, а также с Активным DPI, подключённым последовательно. |
| 7 | + |
| 8 | +Требуется **Windows 7, 8, 8.1, 10 или 11** с правами администратора. |
| 9 | + |
| 10 | +# Быстрый старт |
| 11 | + |
| 12 | +* **Для России**: Скачайте [последнюю версию со страницы релизов](https://github.com/ValdikSS/GoodbyeDPI/releases), распакуйте файл и запустите скрипт **1_russia_blacklist_dnsredir.cmd**. |
| 13 | +* Для других стран: Скачайте [последнюю версию со страницы релизов](https://github.com/ValdikSS/GoodbyeDPI/releases), распакуйте файл и запустите скрипт **2_any_country_dnsredir.cmd**. |
| 14 | + |
| 15 | +Эти скрипты запускают GoodbyeDPI в рекомендованном режиме с перенаправлением DNS-запросов на Yandex DNS через нестандартный порт (чтобы предотвратить подмену DNS). |
| 16 | +Если это работает — поздравляем! Вы можете использовать его как есть или настроить дальше. |
| 17 | + |
| 18 | +# Как использовать |
| 19 | + |
| 20 | +Скачайте [последнюю версию со страницы релизов](https://github.com/ValdikSS/GoodbyeDPI/releases) и запустите. |
| 21 | + |
| 22 | +``` |
| 23 | +Usage: goodbyedpi.exe [OPTION...] |
| 24 | + -p block passive DPI |
| 25 | + -q block QUIC/HTTP3 |
| 26 | + -r replace Host with hoSt |
| 27 | + -s remove space between host header and its value |
| 28 | + -m mix Host header case (test.com -> tEsT.cOm) |
| 29 | + -f <value> set HTTP fragmentation to value |
| 30 | + -k <value> enable HTTP persistent (keep-alive) fragmentation and set it to value |
| 31 | + -n do not wait for first segment ACK when -k is enabled |
| 32 | + -e <value> set HTTPS fragmentation to value |
| 33 | + -a additional space between Method and Request-URI (enables -s, may break sites) |
| 34 | + -w try to find and parse HTTP traffic on all processed ports (not only on port 80) |
| 35 | + --port <value> additional TCP port to perform fragmentation on (and HTTP tricks with -w) |
| 36 | + --ip-id <value> handle additional IP ID (decimal, drop redirects and TCP RSTs with this ID). |
| 37 | + This option can be supplied multiple times. |
| 38 | + --dns-addr <value> redirect UDP DNS requests to the supplied IP address (experimental) |
| 39 | + --dns-port <value> redirect UDP DNS requests to the supplied port (53 by default) |
| 40 | + --dnsv6-addr <value> redirect UDPv6 DNS requests to the supplied IPv6 address (experimental) |
| 41 | + --dnsv6-port <value> redirect UDPv6 DNS requests to the supplied port (53 by default) |
| 42 | + --dns-verb print verbose DNS redirection messages |
| 43 | + --blacklist <txtfile> perform circumvention tricks only to host names and subdomains from |
| 44 | + supplied text file (HTTP Host/TLS SNI). |
| 45 | + This option can be supplied multiple times. |
| 46 | + --allow-no-sni perform circumvention if TLS SNI can't be detected with --blacklist enabled. |
| 47 | + --frag-by-sni if SNI is detected in TLS packet, fragment the packet right before SNI value. |
| 48 | + --set-ttl <value> activate Fake Request Mode and send it with supplied TTL value. |
| 49 | + DANGEROUS! May break websites in unexpected ways. Use with care (or --blacklist). |
| 50 | + --auto-ttl [a1-a2-m] activate Fake Request Mode, automatically detect TTL and decrease |
| 51 | + it based on a distance. If the distance is shorter than a2, TTL is decreased |
| 52 | + by a2. If it's longer, (a1; a2) scale is used with the distance as a weight. |
| 53 | + If the resulting TTL is more than m(ax), set it to m. |
| 54 | + Default (if set): --auto-ttl 1-4-10. Also sets --min-ttl 3. |
| 55 | + DANGEROUS! May break websites in unexpected ways. Use with care (or --blacklist). |
| 56 | + --min-ttl <value> minimum TTL distance (128/64 - TTL) for which to send Fake Request |
| 57 | + in --set-ttl and --auto-ttl modes. |
| 58 | + --wrong-chksum activate Fake Request Mode and send it with incorrect TCP checksum. |
| 59 | + May not work in a VM or with some routers, but is safer than set-ttl. |
| 60 | + --wrong-seq activate Fake Request Mode and send it with TCP SEQ/ACK in the past. |
| 61 | + --native-frag fragment (split) the packets by sending them in smaller packets, without |
| 62 | + shrinking the Window Size. Works faster (does not slow down the connection) |
| 63 | + and better. |
| 64 | + --reverse-frag fragment (split) the packets just as --native-frag, but send them in the |
| 65 | + reversed order. Works with the websites which could not handle segmented |
| 66 | + HTTPS TLS ClientHello (because they receive the TCP flow "combined"). |
| 67 | + --max-payload [value] packets with TCP payload data more than [value] won't be processed. |
| 68 | + Use this option to reduce CPU usage by skipping huge amount of data |
| 69 | + (like file transfers) in already established sessions. |
| 70 | + May skip some huge HTTP requests from being processed. |
| 71 | + Default (if set): --max-payload 1200. |
| 72 | +
|
| 73 | +
|
| 74 | +LEGACY modesets: |
| 75 | + -1 -p -r -s -f 2 -k 2 -n -e 2 (most compatible mode) |
| 76 | + -2 -p -r -s -f 2 -k 2 -n -e 40 (better speed for HTTPS yet still compatible) |
| 77 | + -3 -p -r -s -e 40 (better speed for HTTP and HTTPS) |
| 78 | + -4 -p -r -s (best speed) |
| 79 | +
|
| 80 | +Modern modesets (more stable, more compatible, faster): |
| 81 | + -5 -f 2 -e 2 --auto-ttl --reverse-frag --max-payload |
| 82 | + -6 -f 2 -e 2 --wrong-seq --reverse-frag --max-payload |
| 83 | + -7 -f 2 -e 2 --wrong-chksum --reverse-frag --max-payload |
| 84 | + -8 -f 2 -e 2 --wrong-seq --wrong-chksum --reverse-frag --max-payload |
| 85 | + -9 -f 2 -e 2 --wrong-seq --wrong-chksum --reverse-frag --max-payload -q (this is the default) |
| 86 | +
|
| 87 | + Note: combination of --wrong-seq and --wrong-chksum generates two different fake packets. |
| 88 | +``` |
| 89 | + |
| 90 | +Чтобы проверить, можно ли обойти DPI вашего интернет-провайдера, сначала убедитесь, что ваш провайдер не подделывает ответы DNS, включив опцию "Безопасные DNS (DNS через HTTPS)" в вашем браузере. |
| 91 | + |
| 92 | +* **Chrome**: Настройки → [Конфиденциальность и безопасность](chrome://settings/privacy) → [Безопасность](chrome://settings/security) → Использовать безопасный DNS-сервер → Выбрать пункт NextDNS или другой |
| 93 | +* **Firefox**: [Настройки](about:preferences) → [Приватность и Защита](about:preferences#privacy) → DNS через HTTPS → Выбрать пункт "Максимальную защиту" |
| 94 | + |
| 95 | +Затем запустите исполняемый файл `goodbyedpi.exe` без каких-либо опций. Если это работает — поздравляю! Вы можете использовать его как есть или настроить дальше, например, используя опцию `--blacklist`, если список заблокированных сайтов известен и доступен для вашей страны. |
| 96 | + |
| 97 | +Если ваш провайдер перехватывает DNS запросы, возможно, вам стоит использовать опцию `--dns-addr` для публичного DNS-резольвера на нестандартном порте (например, Яндекс DNS `77.88.8.8:1253`) или настроить DNS через HTTPS/TLS с помощью сторонних приложений. |
| 98 | + |
| 99 | +Проверьте скрипты .cmd и измените их в соответствии с вашими предпочтениями и условиями сети. |
| 100 | + |
| 101 | +# Как это работает |
| 102 | + |
| 103 | +### Пассивный DPI |
| 104 | + |
| 105 | +Большинство пассивных DPI отправляют HTTP 302 Redirect, если вы пытаетесь получить доступ к заблокированному сайту через HTTP, и TCP Reset в случае HTTPS быстрее, чем целевой веб-сайт. Пакеты, отправляемые DPI, обычно имеют поле IP Identification, равное `0x0000` или `0x0001`, как это видно у российских провайдеров. Эти пакеты, если они перенаправляют вас на другой сайт (страницу цензуры), блокируются GoodbyeDPI. |
| 106 | + |
| 107 | +### Активный DPI |
| 108 | + |
| 109 | +Активное DPI более сложно обмануть. В настоящее время программное обеспечение использует 7 методов для обхода активного DPI: |
| 110 | + |
| 111 | +* Фрагментация на уровне TCP для первого пакета данных |
| 112 | +* Фрагментация на уровне TCP для постоянных (keep-alive) HTTP-сессий |
| 113 | +* Замена заголовка `Host` на `hoSt` |
| 114 | +* Удаление пробела между именем заголовка и значением в заголовке `Host` |
| 115 | +* Добавление дополнительного пробела между методом HTTP (GET, POST и т.д.) и URI |
| 116 | +* Изменение регистра значения заголовка Host |
| 117 | +* Отправка поддельных HTTP/HTTPS пакетов с низким значением Time-To-Live, некорректной контрольной суммой или неверными номерами последовательности/подтверждения TCP, чтобы обмануть DPI и предотвратить доставку их к назначению |
| 118 | + |
| 119 | +Эти методы не должны ломать сайты, так как они полностью совместимы со стандартами TCP и HTTP, однако их достаточно, чтобы предотвратить классификацию данных DPI и обойти цензуру. Дополнительный пробел может сломать некоторые сайты, хотя это допустимо согласно спецификации HTTP/1.1 (см. 19.3 Tolerant Applications). |
| 120 | + |
| 121 | +Программа загружает драйвер WinDivert, который использует Windows Filtering Platform для установки фильтров и перенаправления пакетов в пользовательское пространство. Она работает до тех пор, пока консольное окно остаётся открытым, и завершает работу при закрытии окна. |
| 122 | + |
| 123 | +# Как собрать из исходников |
| 124 | + |
| 125 | +Этот проект можно собрать с помощью **GNU Make** и [**mingw**](https://mingw-w64.org). Единственная зависимость — [WinDivert](https://github.com/basil00/Divert). |
| 126 | + |
| 127 | +Для сборки x86 exe выполните: |
| 128 | + |
| 129 | +`make CPREFIX=i686-w64-mingw32- WINDIVERTHEADERS=/path/to/windivert/include WINDIVERTLIBS=/path/to/windivert/x86` |
| 130 | + |
| 131 | +А для x86_64: |
| 132 | + |
| 133 | +`make CPREFIX=x86_64-w64-mingw32- BIT64=1 WINDIVERTHEADERS=/path/to/windivert/include WINDIVERTLIBS=/path/to/windivert/amd64` |
| 134 | + |
| 135 | +# Как установить в качестве Службы Windows |
| 136 | + |
| 137 | +Ознакомьтесь с примерами в скриптах `service_install_russia_blacklist.cmd`, `service_install_russia_blacklist_dnsredir.cmd` и `service_remove.cmd`. |
| 138 | + |
| 139 | +Измените их в соответствии с вашими потребностями. |
| 140 | + |
| 141 | +# Известные проблемы |
| 142 | + |
| 143 | +* Ужасно устаревшие установки 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. |
| 144 | +* ~~Некоторые SSL/TLS стеки не могут обрабатывать фрагментированные пакеты ClientHello, и HTTPS сайты не открываются. Ошибка: [#4](https://github.com/ValdikSS/GoodbyeDPI/issues/4), [#64](https://github.com/ValdikSS/GoodbyeDPI/issues/64).~~ Проблемы с фрагментацией исправлены в версии v0.1.7. |
| 145 | +* ~~Антивирус ESET несовместим с драйвером WinDivert [#91](https://github.com/ValdikSS/GoodbyeDPI/issues/91). Это, вероятно, ошибка антивируса, а не WinDivert.~~ |
| 146 | + |
| 147 | +# Похожие проекты |
| 148 | + |
| 149 | +- **[zapret](https://github.com/bol-van/zapret)** от @bol-van (для MacOS, Linux и Windows) |
| 150 | +- **[Green Tunnel](https://github.com/SadeghHayeri/GreenTunnel)** от @SadeghHayeri (для MacOS, Linux и Windows) |
| 151 | +- **[DPI Tunnel CLI](https://github.com/nomoresat/DPITunnel-cli)** от @zhenyolka (для Linux и маршрутизаторов) |
| 152 | +- **[DPI Tunnel for Android](https://github.com/nomoresat/DPITunnel-android)** от @zhenyolka (для Android) |
| 153 | +- **[PowerTunnel](https://github.com/krlvm/PowerTunnel)** от @krlvm (для Windows, MacOS и Linux) |
| 154 | +- **[PowerTunnel for Android](https://github.com/krlvm/PowerTunnel-Android)** от @krlvm (для Android) |
| 155 | +- **[SpoofDPI](https://github.com/xvzc/SpoofDPI)** от @xvzc (для macOS и Linux) |
| 156 | +- **[GhosTCP](https://github.com/macronut/ghostcp)** от @macronut (для Windows) |
| 157 | +- **[ByeDPI](https://github.com/hufrea/byedpi)** для Linux/Windows + **[ByeDPIAndroid](https://github.com/dovecoteescapee/ByeDPIAndroid/)** для Android (без root) |
| 158 | + |
| 159 | +# Благодарности |
| 160 | + |
| 161 | +Спасибо @basil00 за [WinDivert](https://github.com/basil00/Divert). Это основная часть этой программы. |
| 162 | + |
| 163 | +Спасибо каждому участнику [BlockCheck](https://github.com/ValdikSS/blockcheck). Было бы невозможно понять поведение DPI без этой утилиты. |
0 commit comments