Идеи и дальнейшие планы

Мои идеи:

Первая — доработка GoodbyeDPI, реализация новых способов обхода DPI, таких как TCB creation, TCB teardown, data reassembly, tcp state desync, да и просто изменение флагов в TCP SYN так, чтобы можно было менять размер SYN’а. Если интересуют подробности методов, я напишу детально.
Чтобы сделать поддержку новых методов обхода, сначала нужно реализовать отслеживание состояния соединений (tcp conntrack), как минимум.
Сейчас в GoodbyeDPI реализована только по-пакетная обработка, а часто в одном пакете недостаточно данных для корректного определения протокола, либо данных слишком много, чтобы они вместились в один пакет, из-за чего с ними неудобно работать в пакетном режиме. Было бы гораздо удобней писать новые методы обхода в псевдо-потоковом режиме, что-то вроде простого tcp reassembly, чтобы можно было получить данные нескольких предыдущих пакетов, или объединять их в один большой.
Также нужна помощь в добавлении поддержки Linux и macOS, для этого сначала нужно вынести весь платформозависимый код в отдельный модуль, абстрагироваться от WinDivert API для обработки пакетов. Код для этого можно позаимствовать из проекта reqrypt.

Вторая идея — сделать патчи для библиотек шифрования NSS (используется браузерами Firefox и Chrome, и основанными на них) и OpenSSL (широко используется другими программами), в части работы с сетью.
Многие DPI можно обойти, добавив точку в конец домена, или изменив регистр каких-либо букв в имени домена, в TLS-хендшейке (расширение TLS Server Name Indication). Я сделал патчи для NSS, которые добавляют точку и меняют регистр, но не все TLS-стеки такое поддерживают (по стандарту, точки не должно быть). Нужно доделать патчи, сделать так, чтобы, в случае неудачи, происходило автоматическое переподключение и попытка установить соединение как обычно, без патчей, так, чтобы это было прозрачно для программ, использующих библиотеки (чтобы оригинальную библиотеку можно было заменить патченной, без необходимости правки кода самих программ). После чего можно будет выпустить портативные версии программ с патченной библиотекой, например, Firefox (для всех платформ, в т.ч. Android).

Кроме модификации настоящего домена в TLS SNI, можно также передавать случайные популярные домены в SNI, например, google.com, и, если удаленный сервер в ответ на это отдаст какой-то нормальный сертификат на какой-либо домен, валидировать его и разрешать соединение. Это достаточно опасная и спорная функциональность, но в качестве дополнительной возможности — сойдет.

Третья идея — сделать библиотеку “libgoodbyedpi”, в которую можно передавать данные пакетов, а она бы возвращала измененный пакет, чтобы он обходил DPI, либо сама отправляла его в измененном виде в сеть.
Я вижу два подхода к реализации: либо в виде библиотеки и патчей для популярных сетевых библиотек (libcurl, например, который бы с патчами линковался с libgoodbyedpi), либо в виде библиотеки, хукающей сетевые функции, и самостоятельно прозрачно изменяющей пакеты (чтобы можно было загрузить через LD_PRELOAD или аналогичный способ для других ОС).
Что-то вроде GoodbyeDPI, только для конкретных программ, а не на всю систему целиком. Преимущество в том, что можно будет без особых проблем сделать библиотеку кросс-платформенной, и делать байндинги для разных сетевых библиотек разных операционных систем.