oleg_n Posted July 20, 2017 Всем привет! Кому-нибудь ещё нужен фильтр трафика по роскомнадзоровским спискам? Есть готовый проект, находящийся на этапе завершающего тестирования. Думаю что с ним делать... Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Antares Posted July 20, 2017 ну так выкладывай, поглядим Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
oleg_n Posted July 20, 2017 :-) Именно так и хотел сделать, но на проект потрачено время, и хотелось бы возместить хотя бы часть затраченных средств. Думал создать проект на boomstarter.ru для этого, но они хотят 5000р за создание проекта и поэтому хотелось бы знать, надо ли это ещё кому-то, вообще. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sanyasi Posted July 20, 2017 хотелось бы возместить хотя бы часть затраченных средств Опишите ТТХ. Технологии, возможности, нагрузочные испытания, требования к оборудованию. Чем лучше/хуже ExtFilter. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
oleg_n Posted July 20, 2017 (edited) Опишите ТТХ. Технологии, возможности, нагрузочные испытания, требования к оборудованию. - фильтр является приложением выполняющимся в пространстве пользователя; - работает в связке с linux netfilter через NFQUEUE; - многопоточный(по потоку на каждую очередь nfqueue); - блокировка происходит на основе списков с записями: ip-srv: блокировка ip-префикса с определённым протоколом и портом протокола domain: блокировка домена domain-tree: блокировка домена и поддоменов uri: блокировка uri - записи в памяти располагаются в АВЛ-деревьях, а для ip-srv предварительно хэшируются; - разбирает пакеты ip, tcp, udp, dns, http, tls(выбирая из них нужную для блокировки информацию); - фильтрует по ip, tcp-port, udp-port, domain, uri(исходя из собранной на этапе разбора пакета информации); - написан на Си; По поводу нагрузки и требований пока точно не скажу. В пн наверное. Только закончили отладку и тестирование на небольшой сети. Там не больше 100Мб/с. Сейчас приступаем к тестированию на 1Гб/с трафика. Пока не могу ничего сказать. Чем лучше/хуже ExtFilter. nfqfilter видел, а вот extfilter - нет. Сейчас посмотрел бегло. Он на dpdk сделан - круто. Быстро должен работать. Хотя это только для пакетов, попадающих под блокировку, думаю справедливо. Остальные всё равно должны будут пройти весь путь по ядру, если я правильно понял. Но всё равно круто. UPD: Забыл сказать, что прилагается скрипт на perl, который качает список роскомнадзора и преобразует его в конфиг программы-фильтра. Edited July 20, 2017 by oleg_n Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sanyasi Posted July 20, 2017 (edited) Сейчас приступаем к тестированию на 1Гб/с трафика Ну вот когда на 10G протестируете, возможно работу в зеркале трафика, графики ппс/цпу, можете смело предлагать в паблик. Работа через NFQUEUE по очередям, делается и на nfqfilter. Преимуществом будет собирание tcp сессий, правильная обработка загрузки процессора (регулирование максимальной загрузки ЦПУ), отдельный контроль белых списков, перезапуск без пропусков, поддержка форматов файлов extfilter как в генераторе конфигурации, так и в демоне. Возможно модуль ядра, был бы эффективнее. При использовании extfilter в зеркале, так и хочется чего-то связанного с NFQUEUE, но не требовательного к ресурсам, для подстраховки. Edited July 20, 2017 by sanyasi Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
oleg_n1 Posted July 21, 2017 Ну вот когда на 10G протестируете, возможно работу в зеркале трафика, графики ппс/цпу, можете смело предлагать в паблик. К сожалению негде проверить на 10G. Если кто-то имеет возможность, то было бы здорово. Работа через NFQUEUE по очередям, делается и на nfqfilter. Если я не ошибаюсь, то с nfqfilter'ом это делается путём запуска нескольких процессов(по одному на каждую очередь). Это значит расход памяти увеличивается в n-раз, где n кол-во процессов. И управлять кучей процессов не так просто, как с одним, хотя при наличии хорошего обёрточного скрипта не сложно. Преимуществом будет собирание tcp сессий, Этого пока нет, но тут не вижу особых сложностей. правильная обработка загрузки процессора (регулирование максимальной загрузки ЦПУ), А какие тут проблемы? Всё делается через cgroup. отдельный контроль белых списков, Это есть. перезапуск без пропусков, Это есть. Разве в nfqfilter этого нет :-\?.. поддержка форматов файлов extfilter как в генераторе конфигурации, так и в демоне. Этого нет. Если кто-то добавит, то будет. Возможно модуль ядра, был бы эффективнее. Возможно. Но прирост производительности вряд ли будет большой(в сравнению с dpdk, тем более) и думаю этот прирост не перекроет ненадёжность этого варианта. Любой segfault в модуле - kernel panic(повисшая система -> прекращение хождения трафика). В пространстве же пользователя такое приложение перезапускается супервизором и разрыв минимален и не заметен в массе. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
oleg_n Posted August 3, 2017 (edited) Выложил код сюда - github Edited August 3, 2017 by oleg_n Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
zhenya` Posted August 3, 2017 если в правиле стоит bypass то при рестарте пакеты будут пролетать насквозь. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
oleg_n Posted August 3, 2017 если в правиле стоит bypass то при рестарте пакеты будут пролетать насквозь. Не совсем понял, это Вы к чему? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
bomberman Posted August 4, 2017 1. Проект всё таки бесплатный решил быть? 2. Поменяйте подпись в теме, указав что проект относительно запрета по роскомнадзоровским спискам. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
oleg_n Posted August 4, 2017 (edited) 1. Проект всё таки бесплатный решил быть? Согласно заветам Столлмана скорее открытый/свободный :-), а не бесплатный(и уж точно не бесплатный для заказчика под которого это делалось :-)). Собственно, проект с самого начала планировалось выкладывать в открытый доступ под свободной лицензией. Проект изначально делался под 2-х заказчиков, но где-то после середины разработки выяснилось, что второй заказчик как бы не при делах :-). В итоге, было принято решение проект всё равно завершить, т.к. первый заказчик в ситуации не виноват, в общем-то(более того, в последствии он предложил значительно большую сумму со своей стороны, чем было оговорено вначале; это, правда, всё равно не покрывает всех расходов проекта). Была мысль как-то отбить хотя бы часть расходов, но пока не сложилось :-). Поэтому из вариантов - сгноить исходники на диске компа или выложить всё равно в свободный доступ - был выбран второй. Ибо в первом смысла нет никакого. Так-то в проекте есть возможность сделать ещё как минимум 3 модификации, которые, думаю, ускорят его работу. Но, по понятным причинам, пока эти изменения производиться не будут. Они есть в TODO - если кто-то захочет, то сможет это сделать сам. Проект поделён на модули, в результате чего добавить новый парсер протокола или фильтр не сложно. 2. Поменяйте подпись в теме, указав что проект относительно запрета по роскомнадзоровским спискам. Что-то не могу найти где тему менять. Так-то фильтр не привязан к РКН реестру именно(хотя, конечно, делался с этой целью в первую очередь). Там rknr_get.pl - основное, что связывает их. Edited August 4, 2017 by oleg_n Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
ne-vlezay80 Posted August 5, 2017 (edited) А можно ли фильтровать по ключевым словам, например: Мурад Рагимов пытки мурада рагимова пытки собр мурада рагимова пытали Как это реализовать через iptables или snort? Edited August 5, 2017 by ne-vlezay80 Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
oleg_n Posted August 7, 2017 (edited) А можно ли фильтровать по ключевым словам, например: Мурад Рагимов пытки мурада рагимова пытки собр мурада рагимова пытали Можно добавить такой фильтр, который, например, будет проверять на совпадения всё тело tcp-пакета. Если делать в лоб, то можно за часов 2-5 такой сделать. Но возможно дольше, если хочется избавиться от ложных срабатываний и побольше производительность. Поиск таких фраз крайне не быстрый процесс - надо привести всё к одному регистру, могут быть разные кодировки(cp1251, utf8, koi8-r) и т.п. - если заниматься этим целенаправленно, может получиться придумать как-то быстрый способ. Как это реализовать через iptables или snort? snort - хз. iptables - возможно какая-то модификация модуля string(модифицированный для приведения к одному регистру, хотя бы). Не очень понятен практический смысл этого. Т.к. одно дело фильтровать uri или домен, другое - содержимое страниц и запросов. Последнее уже будет идти внутри tls-соединения в 70% случаев(если не больше). Поэтому подобное решение грузить машину будет значительно, вносить заметные задержки в трафик и при всём при этом будет крайне не эффективным по результату работы. Edited August 7, 2017 by oleg_n Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
ne-vlezay80 Posted August 7, 2017 Как можно блокировать прокси при помощи iptables? Делал: # Generated by iptables-save v1.4.21 on Sun Aug 6 22:01:31 2017 *mangle :PREROUTING ACCEPT [1593459:2305724211] :INPUT ACCEPT [106471:225620613] :FORWARD ACCEPT [1525355:2097124454] :OUTPUT ACCEPT [81512:6491507] :POSTROUTING ACCEPT [1606814:2103556283] -A PREROUTING -m connbytes ! --connbytes 100000 --connbytes-mode bytes --connbytes-dir both -j NFQUEUE --queue-num 20 --queue-bypass COMMIT # Completed on Sun Aug 6 22:01:31 2017 # Generated by iptables-save v1.4.21 on Sun Aug 6 22:01:31 2017 *filter :INPUT ACCEPT [51:3352] :FORWARD ACCEPT [95:6333] :OUTPUT ACCEPT [26:2144] -A FORWARD -m string --string "%D0%9C%D1%83%D1%80%D0%B0%D0%B4+%D0%A0%D0%B0%D0%B3%D0%B8%D0%BC%D0%BE%D0%B2" --algo kmp --to 65535 -j CONNMARK --set-xmark 0x2/0xfe #-A FORWARD -p tcp -m string --string "CONNECT " --algo bm --to 65535 -j CONNMARK --set-xmark 0x2/0xfe -A FORWARD -s 10.194.0.0/16 -p tcp -m set --match-set tor dst -j REJECT --reject-with tcp-reset -A FORWARD -p tcp -m string --string "GET http://" --algo bm --to 65535 -j CONNMARK --set-xmark 0x2/0xfe -A FORWARD -p tcp -m string --string "HTTP/" --algo bm --to 65535 -m connmark --mark 0x2/0xfe -j REJECT --reject-with tcp-reset COMMIT # Completed on Sun Aug 6 22:01:31 2017 Однако при скачивании некоторых файлов соединение начало сбрасываться. В чём проблема? Закоментированное правило - виновник всех проблем. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
oleg_n Posted August 7, 2017 Как можно блокировать прокси при помощи iptables? Делал: # Generated by iptables-save v1.4.21 on Sun Aug 6 22:01:31 2017 *mangle :PREROUTING ACCEPT [1593459:2305724211] :INPUT ACCEPT [106471:225620613] :FORWARD ACCEPT [1525355:2097124454] :OUTPUT ACCEPT [81512:6491507] :POSTROUTING ACCEPT [1606814:2103556283] -A PREROUTING -m connbytes ! --connbytes 100000 --connbytes-mode bytes --connbytes-dir both -j NFQUEUE --queue-num 20 --queue-bypass COMMIT # Completed on Sun Aug 6 22:01:31 2017 # Generated by iptables-save v1.4.21 on Sun Aug 6 22:01:31 2017 *filter :INPUT ACCEPT [51:3352] :FORWARD ACCEPT [95:6333] :OUTPUT ACCEPT [26:2144] -A FORWARD -m string --string "%D0%9C%D1%83%D1%80%D0%B0%D0%B4+%D0%A0%D0%B0%D0%B3%D0%B8%D0%BC%D0%BE%D0%B2" --algo kmp --to 65535 -j CONNMARK --set-xmark 0x2/0xfe #-A FORWARD -p tcp -m string --string "CONNECT " --algo bm --to 65535 -j CONNMARK --set-xmark 0x2/0xfe -A FORWARD -s 10.194.0.0/16 -p tcp -m set --match-set tor dst -j REJECT --reject-with tcp-reset -A FORWARD -p tcp -m string --string "GET http://" --algo bm --to 65535 -j CONNMARK --set-xmark 0x2/0xfe -A FORWARD -p tcp -m string --string "HTTP/" --algo bm --to 65535 -m connmark --mark 0x2/0xfe -j REJECT --reject-with tcp-reset COMMIT # Completed on Sun Aug 6 22:01:31 2017 Однако при скачивании некоторых файлов соединение начало сбрасываться. В чём проблема? Думаю проблема в том, что CONNECT у Вас ищется в любом месте пакета. Замените --to 65535 на --to 9 - так Вы уменьшите кол-во ложных срабатываний почти до 0. Других строк с -m string это тоже касается - странно, что они не вызывали подобные ситуации. Собственно, поэтому мне -m string и не нравится применительно к данной задаче. Для уменьшения ложных срабатываний надо пакет разобрать, а не просто искать фразу в теле. Ещё лучше, для сведения к 0 ложных срабатываний, добавить к разбору отслеживание tcp-сессий(сборку пакетов в сессии). Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
ne-vlezay80 Posted August 7, 2017 Как можно блокировать прокси при помощи iptables? Делал: # Generated by iptables-save v1.4.21 on Sun Aug 6 22:01:31 2017 *mangle :PREROUTING ACCEPT [1593459:2305724211] :INPUT ACCEPT [106471:225620613] :FORWARD ACCEPT [1525355:2097124454] :OUTPUT ACCEPT [81512:6491507] :POSTROUTING ACCEPT [1606814:2103556283] -A PREROUTING -m connbytes ! --connbytes 100000 --connbytes-mode bytes --connbytes-dir both -j NFQUEUE --queue-num 20 --queue-bypass COMMIT # Completed on Sun Aug 6 22:01:31 2017 # Generated by iptables-save v1.4.21 on Sun Aug 6 22:01:31 2017 *filter :INPUT ACCEPT [51:3352] :FORWARD ACCEPT [95:6333] :OUTPUT ACCEPT [26:2144] -A FORWARD -m string --string "%D0%9C%D1%83%D1%80%D0%B0%D0%B4+%D0%A0%D0%B0%D0%B3%D0%B8%D0%BC%D0%BE%D0%B2" --algo kmp --to 65535 -j CONNMARK --set-xmark 0x2/0xfe #-A FORWARD -p tcp -m string --string "CONNECT " --algo bm --to 65535 -j CONNMARK --set-xmark 0x2/0xfe -A FORWARD -s 10.194.0.0/16 -p tcp -m set --match-set tor dst -j REJECT --reject-with tcp-reset -A FORWARD -p tcp -m string --string "GET http://" --algo bm --to 65535 -j CONNMARK --set-xmark 0x2/0xfe -A FORWARD -p tcp -m string --string "HTTP/" --algo bm --to 65535 -m connmark --mark 0x2/0xfe -j REJECT --reject-with tcp-reset COMMIT # Completed on Sun Aug 6 22:01:31 2017 Однако при скачивании некоторых файлов соединение начало сбрасываться. В чём проблема? Думаю проблема в том, что CONNECT у Вас ищется в любом месте пакета. Замените --to 65535 на --to 9 - так Вы уменьшите кол-во ложных срабатываний почти до 0. Других строк с -m string это тоже касается - странно, что они не вызывали подобные ситуации. Собственно, поэтому мне -m string и не нравится применительно к данной задаче. Для уменьшения ложных срабатываний надо пакет разобрать, а не просто искать фразу в теле. Ещё лучше, для сведения к 0 ложных срабатываний, добавить к разбору отслеживание tcp-сессий(сборку пакетов в сессии). Изменил, блокировка вообще перестала работать Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
oleg_n Posted August 7, 2017 (edited) Изменил, блокировка вообще перестала работать Похоже string проверяет не просто нагрузку tcp-пакета, а ещё и заголовки. Поэтому можно попробовать --to 52. Так же можно добавить --from 20 для уточнения. UPD: Вообще, лучше исходить из того, что теоритический максимум tcp-заголовка 60 байт. Т.е. - --from 20 --to 68. Edited August 7, 2017 by oleg_n Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
ne-vlezay80 Posted August 7, 2017 А как через iptables/ip6tables блокировать openvpn или tor через string? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
oleg_n1 Posted August 7, 2017 А как через iptables/ip6tables блокировать openvpn или tor через string? Вот тут не в курсе :-). Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted August 14, 2017 А можно ли фильтровать по ключевым словам, Где? И в какой кодовой странице? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
ne-vlezay80 Posted August 14, 2017 А можно ли фильтровать по ключевым словам, Где? И в какой кодовой странице? utf-8 Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted August 14, 2017 Это был не вопрос. Это была подсказка. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
oleg_n Posted August 18, 2017 Выложил новую версию - 0.9.2. Изменения коснулись утилиты rknr_get.pl: - улучшена работа с богомерзким soap - реестр скачивается либо если появились срочные записи, либо прошло указанное кол-во времени с последней загрузки(6 часов по-умолчанию) - в конфиге можно указать бинарники, которые будут запускаться в случае изменения версий документации, формата реестра и api сервиса(используется для отправки email с уведомлением) - прочие изменения(подробности можно посмотреть с помощью git-log tags/0.9.1..tags/0.9.2) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
oleg_n Posted September 14, 2017 (edited) Версия 0.9.5. Основные изменения: - исправлено зависание одного из потока в многопоточном режиме - обработка http-запроса с нестандартными символами в host теперь происходит корректно(при конструировании uri по запросу, всё, что кривое, преобразуется в %XX, согласно rfc3986) - добавлено удаление повторных '/' и финальных '/' в http uri в rknr_get.pl и trfl(uri http://some.domain//any////path// обрабатывается как http://some.domain/any/path) - исправлена проверка уже запущенных копий rknr_get.pl - исправлена некорректная обработка времени последней загрузки реестра в rknr_get.pl, при использовании ключа -i - добавлено в rknr_get.pl удаление userinfo из uri(на всякий случай, вдруг будут кривые записи подобные текущим http uri с fragment) - обновление документации - прочие изменения(подробности можно посмотреть с помощью git-log tags/0.9.2..tags/0.9.5) Edited February 22, 2018 by oleg_n Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...