oleg_n Опубликовано 20 июля, 2017 Всем привет! Кому-нибудь ещё нужен фильтр трафика по роскомнадзоровским спискам? Есть готовый проект, находящийся на этапе завершающего тестирования. Думаю что с ним делать... Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
Antares Опубликовано 20 июля, 2017 ну так выкладывай, поглядим Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
oleg_n Опубликовано 20 июля, 2017 :-) Именно так и хотел сделать, но на проект потрачено время, и хотелось бы возместить хотя бы часть затраченных средств. Думал создать проект на boomstarter.ru для этого, но они хотят 5000р за создание проекта и поэтому хотелось бы знать, надо ли это ещё кому-то, вообще. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
sanyasi Опубликовано 20 июля, 2017 хотелось бы возместить хотя бы часть затраченных средств Опишите ТТХ. Технологии, возможности, нагрузочные испытания, требования к оборудованию. Чем лучше/хуже ExtFilter. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
oleg_n Опубликовано 20 июля, 2017 (изменено) Опишите ТТХ. Технологии, возможности, нагрузочные испытания, требования к оборудованию. - фильтр является приложением выполняющимся в пространстве пользователя; - работает в связке с 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, который качает список роскомнадзора и преобразует его в конфиг программы-фильтра. Изменено 20 июля, 2017 пользователем oleg_n Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
sanyasi Опубликовано 20 июля, 2017 (изменено) Сейчас приступаем к тестированию на 1Гб/с трафика Ну вот когда на 10G протестируете, возможно работу в зеркале трафика, графики ппс/цпу, можете смело предлагать в паблик. Работа через NFQUEUE по очередям, делается и на nfqfilter. Преимуществом будет собирание tcp сессий, правильная обработка загрузки процессора (регулирование максимальной загрузки ЦПУ), отдельный контроль белых списков, перезапуск без пропусков, поддержка форматов файлов extfilter как в генераторе конфигурации, так и в демоне. Возможно модуль ядра, был бы эффективнее. При использовании extfilter в зеркале, так и хочется чего-то связанного с NFQUEUE, но не требовательного к ресурсам, для подстраховки. Изменено 20 июля, 2017 пользователем sanyasi Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
oleg_n1 Опубликовано 21 июля, 2017 Ну вот когда на 10G протестируете, возможно работу в зеркале трафика, графики ппс/цпу, можете смело предлагать в паблик. К сожалению негде проверить на 10G. Если кто-то имеет возможность, то было бы здорово. Работа через NFQUEUE по очередям, делается и на nfqfilter. Если я не ошибаюсь, то с nfqfilter'ом это делается путём запуска нескольких процессов(по одному на каждую очередь). Это значит расход памяти увеличивается в n-раз, где n кол-во процессов. И управлять кучей процессов не так просто, как с одним, хотя при наличии хорошего обёрточного скрипта не сложно. Преимуществом будет собирание tcp сессий, Этого пока нет, но тут не вижу особых сложностей. правильная обработка загрузки процессора (регулирование максимальной загрузки ЦПУ), А какие тут проблемы? Всё делается через cgroup. отдельный контроль белых списков, Это есть. перезапуск без пропусков, Это есть. Разве в nfqfilter этого нет :-\?.. поддержка форматов файлов extfilter как в генераторе конфигурации, так и в демоне. Этого нет. Если кто-то добавит, то будет. Возможно модуль ядра, был бы эффективнее. Возможно. Но прирост производительности вряд ли будет большой(в сравнению с dpdk, тем более) и думаю этот прирост не перекроет ненадёжность этого варианта. Любой segfault в модуле - kernel panic(повисшая система -> прекращение хождения трафика). В пространстве же пользователя такое приложение перезапускается супервизором и разрыв минимален и не заметен в массе. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
oleg_n Опубликовано 3 августа, 2017 (изменено) Выложил код сюда - github Изменено 3 августа, 2017 пользователем oleg_n Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
zhenya` Опубликовано 3 августа, 2017 если в правиле стоит bypass то при рестарте пакеты будут пролетать насквозь. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
oleg_n Опубликовано 3 августа, 2017 если в правиле стоит bypass то при рестарте пакеты будут пролетать насквозь. Не совсем понял, это Вы к чему? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
bomberman Опубликовано 4 августа, 2017 1. Проект всё таки бесплатный решил быть? 2. Поменяйте подпись в теме, указав что проект относительно запрета по роскомнадзоровским спискам. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
oleg_n Опубликовано 4 августа, 2017 (изменено) 1. Проект всё таки бесплатный решил быть? Согласно заветам Столлмана скорее открытый/свободный :-), а не бесплатный(и уж точно не бесплатный для заказчика под которого это делалось :-)). Собственно, проект с самого начала планировалось выкладывать в открытый доступ под свободной лицензией. Проект изначально делался под 2-х заказчиков, но где-то после середины разработки выяснилось, что второй заказчик как бы не при делах :-). В итоге, было принято решение проект всё равно завершить, т.к. первый заказчик в ситуации не виноват, в общем-то(более того, в последствии он предложил значительно большую сумму со своей стороны, чем было оговорено вначале; это, правда, всё равно не покрывает всех расходов проекта). Была мысль как-то отбить хотя бы часть расходов, но пока не сложилось :-). Поэтому из вариантов - сгноить исходники на диске компа или выложить всё равно в свободный доступ - был выбран второй. Ибо в первом смысла нет никакого. Так-то в проекте есть возможность сделать ещё как минимум 3 модификации, которые, думаю, ускорят его работу. Но, по понятным причинам, пока эти изменения производиться не будут. Они есть в TODO - если кто-то захочет, то сможет это сделать сам. Проект поделён на модули, в результате чего добавить новый парсер протокола или фильтр не сложно. 2. Поменяйте подпись в теме, указав что проект относительно запрета по роскомнадзоровским спискам. Что-то не могу найти где тему менять. Так-то фильтр не привязан к РКН реестру именно(хотя, конечно, делался с этой целью в первую очередь). Там rknr_get.pl - основное, что связывает их. Изменено 4 августа, 2017 пользователем oleg_n Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
ne-vlezay80 Опубликовано 5 августа, 2017 (изменено) А можно ли фильтровать по ключевым словам, например: Мурад Рагимов пытки мурада рагимова пытки собр мурада рагимова пытали Как это реализовать через iptables или snort? Изменено 5 августа, 2017 пользователем ne-vlezay80 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
oleg_n Опубликовано 7 августа, 2017 (изменено) А можно ли фильтровать по ключевым словам, например: Мурад Рагимов пытки мурада рагимова пытки собр мурада рагимова пытали Можно добавить такой фильтр, который, например, будет проверять на совпадения всё тело tcp-пакета. Если делать в лоб, то можно за часов 2-5 такой сделать. Но возможно дольше, если хочется избавиться от ложных срабатываний и побольше производительность. Поиск таких фраз крайне не быстрый процесс - надо привести всё к одному регистру, могут быть разные кодировки(cp1251, utf8, koi8-r) и т.п. - если заниматься этим целенаправленно, может получиться придумать как-то быстрый способ. Как это реализовать через iptables или snort? snort - хз. iptables - возможно какая-то модификация модуля string(модифицированный для приведения к одному регистру, хотя бы). Не очень понятен практический смысл этого. Т.к. одно дело фильтровать uri или домен, другое - содержимое страниц и запросов. Последнее уже будет идти внутри tls-соединения в 70% случаев(если не больше). Поэтому подобное решение грузить машину будет значительно, вносить заметные задержки в трафик и при всём при этом будет крайне не эффективным по результату работы. Изменено 7 августа, 2017 пользователем oleg_n Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
ne-vlezay80 Опубликовано 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 Однако при скачивании некоторых файлов соединение начало сбрасываться. В чём проблема? Закоментированное правило - виновник всех проблем. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
oleg_n Опубликовано 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-сессий(сборку пакетов в сессии). Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
ne-vlezay80 Опубликовано 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-сессий(сборку пакетов в сессии). Изменил, блокировка вообще перестала работать Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
oleg_n Опубликовано 7 августа, 2017 (изменено) Изменил, блокировка вообще перестала работать Похоже string проверяет не просто нагрузку tcp-пакета, а ещё и заголовки. Поэтому можно попробовать --to 52. Так же можно добавить --from 20 для уточнения. UPD: Вообще, лучше исходить из того, что теоритический максимум tcp-заголовка 60 байт. Т.е. - --from 20 --to 68. Изменено 7 августа, 2017 пользователем oleg_n Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
ne-vlezay80 Опубликовано 7 августа, 2017 А как через iptables/ip6tables блокировать openvpn или tor через string? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
oleg_n1 Опубликовано 7 августа, 2017 А как через iptables/ip6tables блокировать openvpn или tor через string? Вот тут не в курсе :-). Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
alibek Опубликовано 14 августа, 2017 А можно ли фильтровать по ключевым словам, Где? И в какой кодовой странице? Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
ne-vlezay80 Опубликовано 14 августа, 2017 А можно ли фильтровать по ключевым словам, Где? И в какой кодовой странице? utf-8 Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
alibek Опубликовано 14 августа, 2017 Это был не вопрос. Это была подсказка. Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
oleg_n Опубликовано 18 августа, 2017 Выложил новую версию - 0.9.2. Изменения коснулись утилиты rknr_get.pl: - улучшена работа с богомерзким soap - реестр скачивается либо если появились срочные записи, либо прошло указанное кол-во времени с последней загрузки(6 часов по-умолчанию) - в конфиге можно указать бинарники, которые будут запускаться в случае изменения версий документации, формата реестра и api сервиса(используется для отправки email с уведомлением) - прочие изменения(подробности можно посмотреть с помощью git-log tags/0.9.1..tags/0.9.2) Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...
oleg_n Опубликовано 14 сентября, 2017 (изменено) Версия 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) Изменено 22 февраля, 2018 пользователем oleg_n Вставить ник Цитата Ответить с цитированием Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах More sharing options...