Jump to content
Калькуляторы

Фильтр трафика Фильтр трафика

Всем привет!

 

Кому-нибудь ещё нужен фильтр трафика по роскомнадзоровским спискам?

 

Есть готовый проект, находящийся на этапе завершающего тестирования. Думаю что с ним делать...

Share this post


Link to post
Share on other sites

:-)

 

Именно так и хотел сделать, но на проект потрачено время, и хотелось бы возместить хотя бы часть затраченных средств. Думал создать проект на boomstarter.ru для этого, но они хотят 5000р за создание проекта и поэтому хотелось бы знать, надо ли это ещё кому-то, вообще.

Share this post


Link to post
Share on other sites

хотелось бы возместить хотя бы часть затраченных средств

 

Опишите ТТХ. Технологии, возможности, нагрузочные испытания, требования к оборудованию.

 

Чем лучше/хуже ExtFilter.

Share this post


Link to post
Share on other sites
Опишите ТТХ. Технологии, возможности, нагрузочные испытания, требования к оборудованию.

 

- фильтр является приложением выполняющимся в пространстве пользователя;

- работает в связке с 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 by oleg_n

Share this post


Link to post
Share on other sites

Сейчас приступаем к тестированию на 1Гб/с трафика

 

Ну вот когда на 10G протестируете, возможно работу в зеркале трафика, графики ппс/цпу, можете смело предлагать в паблик. Работа через NFQUEUE по очередям, делается и на nfqfilter. Преимуществом будет собирание tcp сессий, правильная обработка загрузки процессора (регулирование максимальной загрузки ЦПУ), отдельный контроль белых списков, перезапуск без пропусков, поддержка форматов файлов extfilter как в генераторе конфигурации, так и в демоне. Возможно модуль ядра, был бы эффективнее.

 

При использовании extfilter в зеркале, так и хочется чего-то связанного с NFQUEUE, но не требовательного к ресурсам, для подстраховки.

Edited by sanyasi

Share this post


Link to post
Share on other sites

Ну вот когда на 10G протестируете, возможно работу в зеркале трафика, графики ппс/цпу, можете смело предлагать в паблик.

 

К сожалению негде проверить на 10G. Если кто-то имеет возможность, то было бы здорово.

 

Работа через NFQUEUE по очередям, делается и на nfqfilter.

 

Если я не ошибаюсь, то с nfqfilter'ом это делается путём запуска нескольких процессов(по одному на каждую очередь). Это значит расход памяти увеличивается в n-раз, где n кол-во процессов. И управлять кучей процессов не так просто, как с одним, хотя при наличии хорошего обёрточного скрипта не сложно.

 

Преимуществом будет собирание tcp сессий,

 

Этого пока нет, но тут не вижу особых сложностей.

 

правильная обработка загрузки процессора (регулирование максимальной загрузки ЦПУ),

 

А какие тут проблемы? Всё делается через cgroup.

 

отдельный контроль белых списков,

 

Это есть.

 

перезапуск без пропусков,

 

Это есть. Разве в nfqfilter этого нет :-\?..

 

поддержка форматов файлов extfilter как в генераторе конфигурации, так и в демоне.

 

Этого нет. Если кто-то добавит, то будет.

 

Возможно модуль ядра, был бы эффективнее.

 

Возможно. Но прирост производительности вряд ли будет большой(в сравнению с dpdk, тем более) и думаю этот прирост не перекроет ненадёжность этого варианта. Любой segfault в модуле - kernel panic(повисшая система -> прекращение хождения трафика). В пространстве же пользователя такое приложение перезапускается супервизором и разрыв минимален и не заметен в массе.

Share this post


Link to post
Share on other sites

если в правиле стоит bypass то при рестарте пакеты будут пролетать насквозь.

Share this post


Link to post
Share on other sites

если в правиле стоит bypass то при рестарте пакеты будут пролетать насквозь.

 

Не совсем понял, это Вы к чему?

Share this post


Link to post
Share on other sites

1. Проект всё таки бесплатный решил быть?

2. Поменяйте подпись в теме, указав что проект относительно запрета по роскомнадзоровским спискам.

Share this post


Link to post
Share on other sites

1. Проект всё таки бесплатный решил быть?

 

Согласно заветам Столлмана скорее открытый/свободный :-), а не бесплатный(и уж точно не бесплатный для заказчика под которого это делалось :-)).

Собственно, проект с самого начала планировалось выкладывать в открытый доступ под свободной лицензией. Проект изначально делался под 2-х заказчиков, но где-то после середины разработки выяснилось, что второй заказчик как бы не при делах :-). В итоге, было принято решение проект всё равно завершить, т.к. первый заказчик в ситуации не виноват, в общем-то(более того, в последствии он предложил значительно большую сумму со своей стороны, чем было оговорено вначале; это, правда, всё равно не покрывает всех расходов проекта). Была мысль как-то отбить хотя бы часть расходов, но пока не сложилось :-). Поэтому из вариантов - сгноить исходники на диске компа или выложить всё равно в свободный доступ - был выбран второй. Ибо в первом смысла нет никакого.

 

Так-то в проекте есть возможность сделать ещё как минимум 3 модификации, которые, думаю, ускорят его работу. Но, по понятным причинам, пока эти изменения производиться не будут. Они есть в TODO - если кто-то захочет, то сможет это сделать сам. Проект поделён на модули, в результате чего добавить новый парсер протокола или фильтр не сложно.

 

2. Поменяйте подпись в теме, указав что проект относительно запрета по роскомнадзоровским спискам.

 

Что-то не могу найти где тему менять. Так-то фильтр не привязан к РКН реестру именно(хотя, конечно, делался с этой целью в первую очередь). Там rknr_get.pl - основное, что связывает их.

Edited by oleg_n

Share this post


Link to post
Share on other sites

А можно ли фильтровать по ключевым словам, например:

Мурад Рагимов
пытки мурада рагимова
пытки собр
мурада рагимова пытали

Как это реализовать через iptables или snort?

Edited by ne-vlezay80

Share this post


Link to post
Share on other sites

А можно ли фильтровать по ключевым словам, например:

Мурад Рагимов
пытки мурада рагимова
пытки собр
мурада рагимова пытали

 

Можно добавить такой фильтр, который, например, будет проверять на совпадения всё тело tcp-пакета. Если делать в лоб, то можно за часов 2-5 такой сделать. Но возможно дольше, если хочется избавиться от ложных срабатываний и побольше производительность. Поиск таких фраз крайне не быстрый процесс - надо привести всё к одному регистру, могут быть разные кодировки(cp1251, utf8, koi8-r) и т.п. - если заниматься этим целенаправленно, может получиться придумать как-то быстрый способ.

 

Как это реализовать через iptables или snort?

 

snort - хз.

iptables - возможно какая-то модификация модуля string(модифицированный для приведения к одному регистру, хотя бы).

 

Не очень понятен практический смысл этого. Т.к. одно дело фильтровать uri или домен, другое - содержимое страниц и запросов. Последнее уже будет идти внутри tls-соединения в 70% случаев(если не больше). Поэтому подобное решение грузить машину будет значительно, вносить заметные задержки в трафик и при всём при этом будет крайне не эффективным по результату работы.

Edited by oleg_n

Share this post


Link to post
Share on other sites

Как можно блокировать прокси при помощи 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

Однако при скачивании некоторых файлов соединение начало сбрасываться. В чём проблема?

Закоментированное правило - виновник всех проблем.

Share this post


Link to post
Share on other sites

Как можно блокировать прокси при помощи 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-сессий(сборку пакетов в сессии).

Share this post


Link to post
Share on other sites

Как можно блокировать прокси при помощи 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-сессий(сборку пакетов в сессии).

Изменил, блокировка вообще перестала работать

Share this post


Link to post
Share on other sites

Изменил, блокировка вообще перестала работать

 

Похоже string проверяет не просто нагрузку tcp-пакета, а ещё и заголовки. Поэтому можно попробовать --to 52.

Так же можно добавить --from 20 для уточнения.

 

UPD: Вообще, лучше исходить из того, что теоритический максимум tcp-заголовка 60 байт. Т.е. - --from 20 --to 68.

Edited by oleg_n

Share this post


Link to post
Share on other sites

А как через iptables/ip6tables блокировать openvpn или tor через string?

Share this post


Link to post
Share on other sites

А как через iptables/ip6tables блокировать openvpn или tor через string?

 

Вот тут не в курсе :-).

Share this post


Link to post
Share on other sites

А можно ли фильтровать по ключевым словам,

Где?

И в какой кодовой странице?

Share this post


Link to post
Share on other sites

А можно ли фильтровать по ключевым словам,

Где?

И в какой кодовой странице?

utf-8

Share this post


Link to post
Share on other sites

Выложил новую версию - 0.9.2.

 

Изменения коснулись утилиты rknr_get.pl:

 

- улучшена работа с богомерзким soap

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

- в конфиге можно указать бинарники, которые будут запускаться в случае изменения версий документации, формата реестра и api сервиса(используется для отправки email с уведомлением)

- прочие изменения(подробности можно посмотреть с помощью git-log tags/0.9.1..tags/0.9.2)

Share this post


Link to post
Share on other sites

Версия 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 by oleg_n

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now