Доступна (http://nest.ahome.ru/ng_grep/index.html) тестовая версия NetGraph-модуля ng_grep, созданного для решения задачи анализа и фильтрации содержимого транзитных http-запросов при исполнении решений Роскомнадзора. Работа фильтра протестирована во FreeBSD 10.0. Полный список блокировки (http://reestr.rublacklist.net/) Роскомнадзора ng_grep обрабатывает без проблем, но нагрузочного тестирования еще не проводилось.Пример условий, которые понимает и обрабатывает модуль:
<font color="#461b7e">
# ngctl msg grep: add {raw=\"http://www.sample.ru/sample\"}
Rec'd response "add" (2) from "[3836]:":
Args: { i_c=1 raw="http://www.sample.ru/sample" }
</font>URL: http://nest.ahome.ru/ng_grep/index.html
Новость: http://www.opennet.me/opennews/art.shtml?num=39626
Нужен модуль для фильтрации интернета от Роскомнадзора.
В последнее время всё больше и больше стал замечать, что безобидные сайты блокируют ни за что. Причём не только на русском и англ языках.Ещё полно всяких неадекватов, которые специально ищут сайты, и пишут заяву на их закрытие. Потом, в своих блогах красуются, статейки с фотками об проделанной работе.
Развлекаются так, короче.
Потомственное стукачество + синдром вахтера дают ядреную смесь.
> В последнее время всё больше и больше стал замечать, что безобидные сайты
> блокируют ни за что. Причём не только на русском и англ языках.Спасибо, капитан. Эти (beep!) заблочили, например, сервера cloudflare. Гении! О том что это CDN и плашка будет вываливаться при посещении 100500 рандомных сайтов - эти с... в роскомпозоре, разумеется не в курсе. Офигительно.
Знает и рекомендует не использовать CF.
> Нужен модуль для фильтрации интернета от Роскомнадзора.
ipfw add deny from роспатрёпнадзор to any
ipfw add deny from any to роспатрёпнадзор
Нужен интернет без надзора
> Нужен интернет без надзораНачинай отделять коммуникации (на 5 с + -- "связи, информационных технологий и массовых коммуникаций") от интернета, потом переходи к отделению Роскомнадзора от.
i2p тебе в руки.
ng_roskomnadzor
> ng_roskomnadzorng_1984 ;-) Была такая мысль... Один коллега предложил ng_f451, но тут я был не согласен в принципе.
ng_f451 это пять
--- ng_grep.c.orig 2014-04-17 02:11:36.000000000 +0300
+++ ng_grep.c 2014-04-23 10:39:17.000000000 +0300
@@ -280,7 +280,7 @@
if(hook==priv->miss || hook==priv->meet){
log(LOG_ERR,"ng_grep::rcvdata from out-only hook, discard!\n");
NG_FREE_ITEM(item);
- error=EINVAL;
+ return(EINVAL);
}
m=item->body.da_m;
Спасибо!
return - не функция, позорище.
Похоже человек на всякий случай макрос в скобки поставил, а то с макросами всякие казусы бывают.
> Похоже человек на всякий случай макрос в скобки поставил, а то с
> макросами всякие казусы бывают.Имхо, это даже не так важно -- человек показал ошибку в логике, и спасибо ему за это еще раз. Я все равно исправил по-другому...
> Похоже человек на всякий случай макрос в скобки поставил, а то с макросами всякие казусы бывают.Хоть EINVAL и макроопределение, скобки в данном случае необязательны (т.к. лишь одна лексема: 22), но так диктует man style(9) FreeBSD (видимо, ради consistency с if, while, for).
В не ANSI C, return могла быть (и была) функцией или иным не ключевым словом, ноги оттуда
Вас не затруднит указать параграф стандарта ANSI C, где это описано?В любом случае, если бы return был функцией, то скобки не должны отбиваться пробелом согласно man 9 style, а весь код фрибсд кричит об обратном.
>В не ANSI C
>не
>не
> Полный список блокировки Роскомнадзора ng_grep обрабатывает без проблемХотелось бы узнать, каким таким образом "без проблем" удается обрабатывать HTTPS URL?
для людей у, которых проблема со зрением: попробуйте навести большую лупу на последнее слово в следующей строке:>для решения задачи анализа и фильтрации содержимого транзитных >>>>http<<<-запросов
> для людей у, которых проблема со зрением: попробуйте навести большую лупу на
> последнее слово в следующей строке:
>>для решения задачи анализа и фильтрации содержимого транзитных >>>>http<<<-запросовВообще говоря, основная цель данного поделия -- стейтлесс-фильтрация, дабы не заморачиваться обработкой обратного трафика. С https такой подход не работает в принципе.
В файлике my_pattern.c не обрабатываются ошибки аллокации памяти.
В частности:
pattern->next = malloc(sizeof(*pattern->next), M_NETGRAPH_GREP, M_ZERO|M_NOWAIT);
и т.п.
Для сравнения строк желательно задавать ограничение на количество сравниваемых символов
Неправда ваша, дяденька... Буквально 3 строками ниже
if((pattern->next && pattern->precomp)Про ограничения -- согласен, а что, просмотрел где-то? Поищу, поправлю.
> if((pattern->next && pattern->precomp)Не очень хорошая практика, на мой взгляд. Лучше явно сравнивать с NULL, ибо согласно стандарту он необязательно равен нулю.
>> if((pattern->next && pattern->precomp)
> Не очень хорошая практика, на мой взгляд. Лучше явно сравнивать с NULL,
> ибо согласно стандарту он необязательно равен нулю.А кто тебе сказал, сто если не указывать "явно сравнивать с NULL", то компилятор будет сравнивать указатель с нулём?
Я не понял твоего вопроса. Компилятор сравнивать ничего не будет, во-первых. А во-вторых, в языке Си истинным считается любое ненулевое значение. Запись вида "if((pattern->next != 0 && pattern->precomp != 0)" избыточна.
> Я не понял твоего вопроса. Компилятор сравнивать ничего не будет, во-первых. А
> во-вторых, в языке Си истинным считается любое ненулевое значение. Запись вида
> "if((pattern->next != 0 && pattern->precomp != 0)" избыточна.Ну, такая-то запись попросту некорректна... Речь шла о
if((pattern->next != NULL && pattern->precomp != NULL)
> Я не понял твоего вопроса. Компилятор сравнивать ничего не будет, во-первых. А
> во-вторых, в языке Си истинным считается любое ненулевое значение.Ок, и что же является "ненулевым значением" для указателя?
Не ноль.
> Не ноль.Уверен?
Ну что за дурацкие вопросы? Как маленький, ей-богу! Посмотри в стандарте, если мне на слово не веришь:> Constraints
> Each of the operands shall have scalar type.
> Semantics
> The && operator shall yield 1 if both of its operands compare unequal to 0; otherwise, it
> yields 0. The result has type int.
> Ну что за дурацкие вопросы? Как маленький, ей-богу! Посмотри в стандарте, если
> мне на слово не веришь:
>> Constraints
>> Each of the operands shall have scalar type.
>> Semantics
>> The && operator shall yield 1 if both of its operands compare unequal to 0; otherwise, it
>> yields 0. The result has type int.При чём тут '&&'?
Почитай вот это, внимательно:
http://c-faq.com/null/ptrtest.html
Роскомнадзор ничего хорошего в этой жизни не сделал.
> Роскомнадзор ничего хорошего в этой жизни не сделал.А должен был?
Как следует из самоназвания - это всеобщий полицейский всея Руси. Надзирающий за всем и вся.
Следует ли вообще в принципе удивляться его существованию?
Кстати, в качестве девиза Роскомнадзору предлагаю старинную фразу - "Кто устережет сторожей?"
>> Роскомнадзор ничего хорошего в этой жизни не сделал.
> А должен был?
> Как следует из самоназвания - это всеобщий полицейский всея Руси. Надзирающий за
> всем и вся.
> Следует ли вообще в принципе удивляться его существованию?
> Кстати, в качестве девиза Роскомнадзору предлагаю старинную фразу - "Кто устережет сторожей?"Нацлидер денно и нощно следит за качеством импортируемых огурцов, ты что, не знал, шоли ? :-)
>"Кто устережет сторожей?""Тот кто ворует у воров"
>ngctl msg grep: add {raw=\"http://www.sample.ru/sample\"}Я так понимаю с таким правилом зарежется и текст, где будет присутствовать эта ссылка?
>>ngctl msg grep: add {raw=\"http://www.sample.ru/sample\"}
> Я так понимаю с таким правилом зарежется и текст, где будет присутствовать
> эта ссылка?Сквида с регэкспами вживе видел?
Речь не о сквиде, а об этом конкретном примере. А почему Вы отвечаете вопросом на вопрос?
> Речь не о сквиде, а об этом конкретном примере. А почему Вы
> отвечаете вопросом на вопрос?В данном конкретном примере будет искать совпадение строки, без каких-бы то ни было регэкспов. То есть в match попадут пакеты, не "содержащие" строку, а "состоящие" из нее, и только они.
Сосбвенно, пользы от raw особой нет, делалось для url
raw осталась как заготовка для подключения регэкспов.
> а "состоящие" из нее, и только оничорт, а я уже хотел порадоваться, что письмо самого роскомнадзора, например, со следующей версией списка, в котором присутствует этот url, тоже будет зарезано.
>> а "состоящие" из нее, и только они
> чорт, а я уже хотел порадоваться, что письмо самого роскомнадзора, например, со
> следующей версией списка, в котором присутствует этот url, тоже будет зарезано.Я умею стрелять себе в ногу. Но делаю это только когда действительно хочу ;-)
> Я так понимаю с таким правилом зарежется и текст, где будет присутствовать
> эта ссылка?Если дополнительно проверять наличие tcp-флага push, который обычно стоит при запросе get/post, то контент не будет резаться.
для паттерна типа url я все равно http заголовок частино разбираю, потому анализируется только запрос. Потому позволил себе tcp флаги не анализировать. Хотя, может, и не прав, подумаю.
инструменты на базе регулярок известны своей "отзывчивостью" вложенным и сложным выражениям...
> инструменты на базе регулярок известны своей "отзывчивостью" вложенным и сложным выражениям...Регулярками там пока не пахнет, хотя может быть по настроению и добавлю, благо есть куда.
Http заголовок частино парсится, и ищется строгое соответствие полей. Именно по указанной вами причине ;-) А кроме того, это еще и быстрее.
>> инструменты на базе регулярок известны своей "отзывчивостью" вложенным и сложным выражениям...
> Регулярками там пока не пахнет, хотя может быть по настроению и добавлю,
> благо есть куда.
> Http заголовок частино парсится, и ищется строгое соответствие полей. Именно по указанной
> вами причине ;-) А кроме того, это еще и быстрее.grep в названии это просто маркетинг? как слово java в javascript?
> grep в названии это просто маркетинг? как слово java в javascript?пока, к сожалению, да.
Чтобы не парсить контент типа? А если контент слегка мутирует?
> Чтобы не парсить контент типа? А если контент слегка мутирует?А он не перестанет быть при этом валидным http запросом?
с чего это вдруг?
> с чего это вдруг?с того, что мутирует ;-)
Формат http запроса-ответа, равно как формат tcp и ip, поверх которых оно живет, описаны достаточно жестко. Мы не можем изменить их только с одной стороны, например, использовав вместо GET слово ДАЙ, точнее можем конечно, но сессия не состоится, ибо сервер не поймет. А обновить библиотеки на всех серверах, не отразив это в RFC -- это из разряда фантистики... А буде оно отразится в RFC -- так и в фильтр внести изменения недолго.
Извиняюсь.Это конечно хорошо что предоставляется исходный код. Но все равно такие инструменты противоречат тому, что сервера и окружение предназначены для предоставления людям информации.
Немного не в тему, но не лишне напомнить: те кого блокируют просто найдут другие, более эффективные способы передачи информации.
Как насчет инструментов, технологий, облегчающих и упрощающих передачу информации по каналам с большой зашумленностью?
> Извиняюсь.
> Это конечно хорошо что предоставляется исходный код. Но все равно такие инструменты
> противоречат тому, что сервера и окружение предназначены для предоставления людям информации.Позволю себе не согласиться. Этот инструмент раскидывает пакеты на два хука в зависимости от выполнения/невыполнения некоего условия, не более того, но и не менее. Инструмент не будет дискардить пакеты, если хук куда-то поцеплен надлежащим образом... А то так можно на оператор if начать ругаться.
> Как насчет инструментов, технологий, облегчающих и упрощающих передачу информации по
> каналам с большой зашумленностью?Не люблю согласованные фильтры... Что остается? Коды с коррекцией?
>> Как насчет инструментов, технологий, облегчающих и упрощающих передачу информации по
>> каналам с большой зашумленностью?
> Не люблю согласованные фильтры... Что остается? Коды с коррекцией?Кстати, была мысль, но руки пока не дошли -- рассмотреть входной пакет как набор отсчетов и прокрутить над ним БПУ, посмотреть, сколь быстро сойдется. По идее, операция недолгая, благо бабочка без умножений и поворотов.