oleg_n Posted July 20, 2017 Posted July 20, 2017 Всем привет! Кому-нибудь ещё нужен фильтр трафика по роскомнадзоровским спискам? Есть готовый проект, находящийся на этапе завершающего тестирования. Думаю что с ним делать... Вставить ник Quote
oleg_n Posted July 20, 2017 Author Posted July 20, 2017 :-) Именно так и хотел сделать, но на проект потрачено время, и хотелось бы возместить хотя бы часть затраченных средств. Думал создать проект на boomstarter.ru для этого, но они хотят 5000р за создание проекта и поэтому хотелось бы знать, надо ли это ещё кому-то, вообще. Вставить ник Quote
sanyasi Posted July 20, 2017 Posted July 20, 2017 хотелось бы возместить хотя бы часть затраченных средств Опишите ТТХ. Технологии, возможности, нагрузочные испытания, требования к оборудованию. Чем лучше/хуже ExtFilter. Вставить ник Quote
oleg_n Posted July 20, 2017 Author 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
sanyasi Posted July 20, 2017 Posted July 20, 2017 (edited) Сейчас приступаем к тестированию на 1Гб/с трафика Ну вот когда на 10G протестируете, возможно работу в зеркале трафика, графики ппс/цпу, можете смело предлагать в паблик. Работа через NFQUEUE по очередям, делается и на nfqfilter. Преимуществом будет собирание tcp сессий, правильная обработка загрузки процессора (регулирование максимальной загрузки ЦПУ), отдельный контроль белых списков, перезапуск без пропусков, поддержка форматов файлов extfilter как в генераторе конфигурации, так и в демоне. Возможно модуль ядра, был бы эффективнее. При использовании extfilter в зеркале, так и хочется чего-то связанного с NFQUEUE, но не требовательного к ресурсам, для подстраховки. Edited July 20, 2017 by sanyasi Вставить ник Quote
oleg_n1 Posted July 21, 2017 Posted July 21, 2017 Ну вот когда на 10G протестируете, возможно работу в зеркале трафика, графики ппс/цпу, можете смело предлагать в паблик. К сожалению негде проверить на 10G. Если кто-то имеет возможность, то было бы здорово. Работа через NFQUEUE по очередям, делается и на nfqfilter. Если я не ошибаюсь, то с nfqfilter'ом это делается путём запуска нескольких процессов(по одному на каждую очередь). Это значит расход памяти увеличивается в n-раз, где n кол-во процессов. И управлять кучей процессов не так просто, как с одним, хотя при наличии хорошего обёрточного скрипта не сложно. Преимуществом будет собирание tcp сессий, Этого пока нет, но тут не вижу особых сложностей. правильная обработка загрузки процессора (регулирование максимальной загрузки ЦПУ), А какие тут проблемы? Всё делается через cgroup. отдельный контроль белых списков, Это есть. перезапуск без пропусков, Это есть. Разве в nfqfilter этого нет :-\?.. поддержка форматов файлов extfilter как в генераторе конфигурации, так и в демоне. Этого нет. Если кто-то добавит, то будет. Возможно модуль ядра, был бы эффективнее. Возможно. Но прирост производительности вряд ли будет большой(в сравнению с dpdk, тем более) и думаю этот прирост не перекроет ненадёжность этого варианта. Любой segfault в модуле - kernel panic(повисшая система -> прекращение хождения трафика). В пространстве же пользователя такое приложение перезапускается супервизором и разрыв минимален и не заметен в массе. Вставить ник Quote
oleg_n Posted August 3, 2017 Author Posted August 3, 2017 (edited) Выложил код сюда - github Edited August 3, 2017 by oleg_n Вставить ник Quote
zhenya` Posted August 3, 2017 Posted August 3, 2017 если в правиле стоит bypass то при рестарте пакеты будут пролетать насквозь. Вставить ник Quote
oleg_n Posted August 3, 2017 Author Posted August 3, 2017 если в правиле стоит bypass то при рестарте пакеты будут пролетать насквозь. Не совсем понял, это Вы к чему? Вставить ник Quote
bomberman Posted August 4, 2017 Posted August 4, 2017 1. Проект всё таки бесплатный решил быть? 2. Поменяйте подпись в теме, указав что проект относительно запрета по роскомнадзоровским спискам. Вставить ник Quote
oleg_n Posted August 4, 2017 Author Posted August 4, 2017 (edited) 1. Проект всё таки бесплатный решил быть? Согласно заветам Столлмана скорее открытый/свободный :-), а не бесплатный(и уж точно не бесплатный для заказчика под которого это делалось :-)). Собственно, проект с самого начала планировалось выкладывать в открытый доступ под свободной лицензией. Проект изначально делался под 2-х заказчиков, но где-то после середины разработки выяснилось, что второй заказчик как бы не при делах :-). В итоге, было принято решение проект всё равно завершить, т.к. первый заказчик в ситуации не виноват, в общем-то(более того, в последствии он предложил значительно большую сумму со своей стороны, чем было оговорено вначале; это, правда, всё равно не покрывает всех расходов проекта). Была мысль как-то отбить хотя бы часть расходов, но пока не сложилось :-). Поэтому из вариантов - сгноить исходники на диске компа или выложить всё равно в свободный доступ - был выбран второй. Ибо в первом смысла нет никакого. Так-то в проекте есть возможность сделать ещё как минимум 3 модификации, которые, думаю, ускорят его работу. Но, по понятным причинам, пока эти изменения производиться не будут. Они есть в TODO - если кто-то захочет, то сможет это сделать сам. Проект поделён на модули, в результате чего добавить новый парсер протокола или фильтр не сложно. 2. Поменяйте подпись в теме, указав что проект относительно запрета по роскомнадзоровским спискам. Что-то не могу найти где тему менять. Так-то фильтр не привязан к РКН реестру именно(хотя, конечно, делался с этой целью в первую очередь). Там rknr_get.pl - основное, что связывает их. Edited August 4, 2017 by oleg_n Вставить ник Quote
ne-vlezay80 Posted August 5, 2017 Posted August 5, 2017 (edited) А можно ли фильтровать по ключевым словам, например: Мурад Рагимов пытки мурада рагимова пытки собр мурада рагимова пытали Как это реализовать через iptables или snort? Edited August 5, 2017 by ne-vlezay80 Вставить ник Quote
oleg_n Posted August 7, 2017 Author 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
ne-vlezay80 Posted August 7, 2017 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
oleg_n Posted August 7, 2017 Author 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
ne-vlezay80 Posted August 7, 2017 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
oleg_n Posted August 7, 2017 Author 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
ne-vlezay80 Posted August 7, 2017 Posted August 7, 2017 А как через iptables/ip6tables блокировать openvpn или tor через string? Вставить ник Quote
oleg_n1 Posted August 7, 2017 Posted August 7, 2017 А как через iptables/ip6tables блокировать openvpn или tor через string? Вот тут не в курсе :-). Вставить ник Quote
alibek Posted August 14, 2017 Posted August 14, 2017 А можно ли фильтровать по ключевым словам, Где? И в какой кодовой странице? Вставить ник Quote
ne-vlezay80 Posted August 14, 2017 Posted August 14, 2017 А можно ли фильтровать по ключевым словам, Где? И в какой кодовой странице? utf-8 Вставить ник Quote
alibek Posted August 14, 2017 Posted August 14, 2017 Это был не вопрос. Это была подсказка. Вставить ник Quote
oleg_n Posted August 18, 2017 Author 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
oleg_n Posted September 14, 2017 Author 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
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.