Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Добавить новые возможности #485

Open
Fenrir-0xFF opened this issue Oct 11, 2024 · 24 comments
Open

Добавить новые возможности #485

Fenrir-0xFF opened this issue Oct 11, 2024 · 24 comments

Comments

@Fenrir-0xFF
Copy link

Приветствую
В связи с новыми полезными изменениями такими как отдельная конфигурация для конкретных портов и доменов появилась проблема со слишком длинными параметрами для исполняемого файла nfqws, не на всех девайсах такое прокатывает да и неудобно.
Просьба добавить возможность запуска nfqws с внешним файлом конфигурации, к примеру "nfqws -c /etc/zapret.cfg" или "nfqws --config /etc/zapret.cfg" или просто "nfqws start" который запустит nfqws с файлом конфига поумолчянию к примеру nfqws.cfg который будет расположен в тойже папке что и файл nfqws, аналогичная команда "nfqws stop" завершает процесс и удаляет правила iptables/nftables, которые в идеале интегрировать в конфиг с автоматической подстановкой переменных, таких как порт, метка, номер очереди, чтоб в случяе их изменения дважды их не менять сначяла в самом конфиге потом в sh скрипте, при этом следует учесть то что на некоторых девайсах iptables урезанные, самое распространённое это отсутствие опции multiport которая без проблем заменяется вводом портов по одиночке, но также бывают и проблемы с отсутствием connbytes и mark, однако успешно использовать nfqws удавалось и без них.
На данный момент нечто подобное присутствует в текущих sh скриптах, но слишком геморно, с файлом конфига будет гораздо удобней и проще.

Также некоторые предложения по улучшению функционала:

  1. Добавить возможность указания доменов прямо в файл конфига а не во внешний файл списка, пример с темже ютюбом где усиленно блочят только домен .googlevideo.com для которого както излишним создавать отдельный файл списка.
  2. Добавить кастомный выбор условий для добавления доменов в hostlist-auto, щяс речь не о тех настройках которые доступны сейчяс (количество попыток открыть сайт в течении определённого времени) а к примеру на предыдущих версиях домены добавлялись без проблем на всех браузерах и устройствах, начиная с какойто версии на некоторых браузерах домены или вобще перестали добавляться или добавляются лишь с 10-15й попытки, хотя настройки теже самые.
  3. Добавить кастомные методы обхода блокировок помимо готовых методов таких как fake, split, disorder2 и т.д. чтото наподобии скриптов где можно вручную указать что делать с пакетами, на сколько чястей разделять, в каком порядке и сколько раз отправлять, в каком именно месте отправлять фейковые данные, что отправить дальше после ответа с сервера и т.д. чтобы можно было использовать нестандартные методы обхода dpi
  4. Добавить возможность указать список адресов которые будут блокироваться (независимо блокирует их провайдер или нет) так сказать мини AdBlock
@bol-van
Copy link
Owner

bol-van commented Oct 12, 2024

Проблема с длиной команды есть только у ash в интерактивной оболочке.
Ее нет на уровне ОС и ее нет в скриптах, обрабатываемых ash.

На счет autolist. У него есть режим дебага. надо смотреть лог.
Проблема может быть и в другом. В апгрейде броузера или во включении ECH на cloudflare, например.
Надо проверки все начинать с curl. Он более предсказуем по каким протоколам и куда он полезет.

Все остальное это обьемные и сложные изменения, до которых руки вряд ли дойдут в обозримом будущем

@Fenrir-0xFF
Copy link
Author

@bol-van а можно пожалуйста хотябы первый пункт реализовать в новой версии? Добавить к примеру параметр --hosts= где через запятую или пробел будет список сайтов (очень нужно), кастыли через /dev/stdin или fifo не прокатывают на урезанных линуксах

@bol-van
Copy link
Owner

bol-van commented Nov 13, 2024

пока есть более важное, а это не приоритетно

@Fenrir-0xFF Fenrir-0xFF changed the title Добавить файл конфига + некоторые фичи Добавить новые возможности Nov 18, 2024
@Fenrir-0xFF
Copy link
Author

Fenrir-0xFF commented Nov 18, 2024

пока есть более важное, а это не приоритетно

Нее, никто тебя не гонит, просто по мере времени, возможностям и желанию)

Начял разбираться с tpws для тех у кого урезанные iptables не тянут NFQUEUE, и кроме как разделить пакет на чясти и поменять эти чясти местами в tpws больше ничего сделать нельзя, в следствии чего не каждый DPI получиться пробить.
Если будет время и желание можно реализовать програмно в tpws все методы которые есть в nfqws?

Ещё парочка моментов по nfqws/tpws (речь не о fake)
Можно ли добавить опцию модификации SNI?
Также добавить модификацию HTTP заголовков с регулярными выражениями? Те методы которые присутствуют на данный момент не прокатывают, причём судя по тому что никто не использует их в конфигах не только у меня.
Заменить их все на одну опцию к примеру --http-headers, чтобы можно было менять в них что угодно и как угодно, к примеру теже опции --hostdot и --hosttab добавляют точку и tab вконце домена, а ведь туда можно ещё много чего добавить что теоретически может прокатить к примеру поставить точку не в конце домена а в начяле или добавить .localhost вконце домена, или через ; или пробел после домена добавить второй не заблокированный домен, с расчётом что DPI его пропустит а сервер не станет с него блевать.
Да и с темже GET тоже поэксперементировать, щяс возможно только пустую строку перед GET добавить и то только в TPWS, а можно ведь добавить какиенибуть байты чтобы DPI не воспринимал пакет как http что кстати скорей всего прокатит, но то что это нормально прожуёт сервер не факт, такто скорей всего можно будет подобрать то что прожуёт сервер надо эксперементировать.

@bol-van
Copy link
Owner

bol-van commented Nov 20, 2024

tpws умеет tlsrec. тоже неплохое средство, которое в nfqws реализовать невозможно.
но tpws практически беззащитен перед анализом ответа сервера. TLS1.2 он часто пробить не в состоянии.
TLS модицифировать невозможно. только если делать MiTM
да и сервера не примут левый SNI
что конкретно нужно модифицировать в http заголовках, что может чем-то помочь ?
если бы можно было что-то еще добавить, что не сломало бы протокол, об этом бы написали уже.
http к тому же уже мало актуален.
если вам удастся создать запрос, который что-то пробивает и корректно обрабатывается сервером, я рассмотрю

но надо понимать, что nfqws не может добавить ничего в поток, что изменит длину
а tpws не может работать на уровне отдельных пакетов иначе, чем насилуя не предназначенный для этого socket api. возможности ограничены

@Fenrir-0xFF
Copy link
Author

если вам удастся создать запрос, который что-то пробивает и корректно обрабатывается сервером, я рассмотрю но надо понимать, что nfqws не может добавить ничего в поток, что изменит длину

--methodeol; добавить перевод строки перед методом : "GET /" => "\r\nGET /"
в tpws она есть, в nfqws её нету, онако метод прокатывает.
Достаточно байта 0x0A перед GET, чтобы не изменять длинну можно удалить пробел между Host: и доменом
У меня прокатило=)
Время будет ещё поэксперементирую, скину рабочие варианты

P.S. Проблему с длинной разве нельзя решить указанием новой длинны пакета и новой контрольной суммой?

@bol-van
Copy link
Owner

bol-van commented Nov 20, 2024

Да , так можно сделать, но потребуется откуда-то еще выкусить эти 2 байта, чтобы длина осталась такой же.
Суммы поправить можно, но весь последующий поток поедет по sequence. Чтобы его стабилизировать, придется во всех последующих пакетах входящих и исходящих редактировать sequence, что представляется задачей тяжелой и глупой.
Сродни переписыванию части ОС. Зачем, когда есть для этого tpws ?

@bol-van
Copy link
Owner

bol-van commented Nov 20, 2024

Кстати, вариант на http гнать tpws, а на https - nfqws - совершенно нормальный, и легко реализуется под *nix с текущими скриптами запуска

@Fenrir-0xFF
Copy link
Author

Да , так можно сделать, но потребуется откуда-то еще выкусить эти 2 байта, чтобы длина осталась такой же.

Дак общий размер заголовков же не изменяется, 1 байт \n добавили, другой байт (пробел после Host:) убрали

@bol-van
Copy link
Owner

bol-van commented Nov 20, 2024

2 байта. \r\n там вообще. \n только в варианте unixeol. это дополнительное издевательство.
Можно откуда-нибудь выдернуть. Депробелизировать 2 хедера.
Но зачем ? Вижу смысл только для винды, где tpws нет

@Fenrir-0xFF
Copy link
Author

Fenrir-0xFF commented Nov 20, 2024

2 байта. \r\n там вообще. \n только в варианте unixeol. это дополнительное издевательство.
Можно откуда-нибудь выдернуть. Депробелизировать 2 хедера.
Но зачем ? Вижу смысл только для винды, где tpws нет

Там кстати и только с \r тоже работает
ещё вместо GET прокатывает PRE, но не везде
На cloudflare прокатывает, а через него щяс практически все сайты проходят

@bol-van
Copy link
Owner

bol-van commented Nov 20, 2024

Действительно, прокатывает. Но только на cloudflare. Это что-то не стандартное. Гугл не находит.

@Fenrir-0xFF
Copy link
Author

Fenrir-0xFF commented Nov 20, 2024

Действительно, прокатывает. Но только на cloudflare. Это что-то не стандартное. Гугл не находит.

Дак Я об этом в самом начяле и говорил, что можно нестандартные заголовки использовать и что из того что ещё не проверил в них прокатит можно только гадать и эксперементировать.
Если чтото длинное использовать то можно к примеру будет user-agent по маске сократить чтоб вмещялось
Не только на cloudfare, на duckduckgo.com PRI прокатывает, на других сайтах тоже, но как повезёт

@bol-van
Copy link
Owner

bol-van commented Nov 20, 2024

Есть какая-то инфа о методе PRE ? Откуда он вообще взялся ?
В исходниках nginx ничего такого не находится

@Fenrir-0xFF
Copy link
Author

Есть какая-то инфа о методе PRE ? Откуда он вообще взялся ?
В исходниках nginx ничего такого не находится

Сорри, опечятка PRI

@bol-van
Copy link
Owner

bol-van commented Nov 20, 2024

PRE тоже сработало. а PRI в nginx тоже нет.
По ходу там ни PRI, и не PRE, а что угодно нестандартное считается как GET

@Fenrir-0xFF
Copy link
Author

По ходу там ни PRI, и не PRE, а что угодно нестандартное считается как GET

Да, Я щяс специально от балды туда рандома отправил, хавает всё что заглавными буквами написано

@bol-van
Copy link
Owner

bol-van commented Nov 20, 2024

По ходу это фишка nginx.
lighttpd такое не хавает

@bol-van
Copy link
Owner

bol-van commented Nov 20, 2024

Там в конце, если стандартный метод не найден, идет проверка , что метод содержит буквы A-Z, символы _ или -, и если это так, то возвращает NGX_OK

static ngx_int_t
ngx_http_v2_parse_method(ngx_http_request_t *r, ngx_str_t *value)
{
    size_t         k, len;
    ngx_uint_t     n;
    const u_char  *p, *m;

    /*
     * This array takes less than 256 sequential bytes,
     * and if typical CPU cache line size is 64 bytes,
     * it is prefetched for 4 load operations.
     */
    static const struct {
        u_char            len;
        const u_char      method[11];
        uint32_t          value;
    } tests[] = {
        { 3, "GET",       NGX_HTTP_GET },
        { 4, "POST",      NGX_HTTP_POST },
        { 4, "HEAD",      NGX_HTTP_HEAD },
        { 7, "OPTIONS",   NGX_HTTP_OPTIONS },
        { 8, "PROPFIND",  NGX_HTTP_PROPFIND },
        { 3, "PUT",       NGX_HTTP_PUT },
        { 5, "MKCOL",     NGX_HTTP_MKCOL },
        { 6, "DELETE",    NGX_HTTP_DELETE },
        { 4, "COPY",      NGX_HTTP_COPY },
        { 4, "MOVE",      NGX_HTTP_MOVE },
        { 9, "PROPPATCH", NGX_HTTP_PROPPATCH },
        { 4, "LOCK",      NGX_HTTP_LOCK },
        { 6, "UNLOCK",    NGX_HTTP_UNLOCK },
        { 5, "PATCH",     NGX_HTTP_PATCH },
        { 5, "TRACE",     NGX_HTTP_TRACE },
        { 7, "CONNECT",   NGX_HTTP_CONNECT }
    }, *test;

    if (r->method_name.len) {
        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
                      "client sent duplicate :method header");

        return NGX_DECLINED;
    }

    if (value->len == 0) {
        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
                      "client sent empty :method header");

        return NGX_DECLINED;
    }

    r->method_name.len = value->len;
    r->method_name.data = value->data;

    len = r->method_name.len;
    n = sizeof(tests) / sizeof(tests[0]);
    test = tests;

    do {
        if (len == test->len) {
            p = r->method_name.data;
            m = test->method;
            k = len;

            do {
                if (*p++ != *m++) {
                    goto next;
                }
            } while (--k);

            r->method = test->value;
            return NGX_OK;
        }

    next:
        test++;

    } while (--n);

    p = r->method_name.data;

    do {
        if ((*p < 'A' || *p > 'Z') && *p != '_' && *p != '-') {
            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,
                          "client sent invalid method: \"%V\"",
                          &r->method_name);

            return NGX_DECLINED;
        }

        p++;

    } while (--len);

    return NGX_OK;
}

@bol-van
Copy link
Owner

bol-van commented Nov 20, 2024

Но все равно польза этого метода очень точечная.
Во-первых, сервер должен работать по http и не редиректить на https. Таких уже мало.
Во-вторых, там должен быть nginx. Их много, но не все. И ддос гуарды наверно не пропустят.
В-третьих, с POST уже ничего не сделать. Любая форма и приехали

@Fenrir-0xFF
Copy link
Author

Fenrir-0xFF commented Nov 20, 2024

В-третьих, с POST уже ничего не сделать. Любая форма и приехали

Значит пока вариант с \n остаётся и удалением пробела после host: чтобы байт освободить, Я рандомные сайты почекал, пока ещё ниодин ошибок не выдал что на GET что на POST, при этом DPI пробивают

@Fenrir-0xFF Fenrir-0xFF closed this as not planned Won't fix, can't repro, duplicate, stale Nov 26, 2024
@Fenrir-0xFF Fenrir-0xFF reopened this Nov 26, 2024
@Fenrir-0xFF
Copy link
Author

Fenrir-0xFF commented Nov 29, 2024

В mdig кастомный DNS не помешал бы, с игнорированием тех которые в resolv.conf если опция задействована.

Возможность устанавливать TTL в nfqws не только для десинхронизирующих пакетов но и для обычных.
А то с изменением TTL средствами системы возникают проблемы
К примеру iptables -t mangle -I POSTROUTING -j TTL --ttl-set 64 независимо добавлено до или после перенаправления на nfqws изменяет TTL для всех пакетов в том числе и фейковых.
На урезанных iptables где отсутствует -j TTL, попытка использовать кастыль nfqttl в связке с nfqws приводит к тому что вобще интернет перестаёт работать

@bol-van
Copy link
Owner

bol-van commented Nov 29, 2024

менять ттл для всего подряд это несвойственная функция, не имеющая отношения к обходу блоков
выделить генерированные пакеты легко
десинк марк
правда он будет не только у фейков, но и всех генеренных
в тч реинжект оригинала
но это тоже решаемо
если надо исключить сет ттл для фейков с ттл
достаточно поставить условие ттл от 1 до 60, например

@Fenrir-0xFF
Copy link
Author

Fenrir-0xFF commented Nov 29, 2024

менять ттл для всего подряд это несвойственная функция, не имеющая отношения к обходу блоков

Косвенно отношение имеет, на недобросовестных мобильных операторах блокируется раздачя интернета через вайфай, лечиться сменой TTL

достаточно поставить условие ттл от 1 до 60, например

Не прокатило, отсутствует -m ttl в iptables

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants