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

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

Выложил новую версию - 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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.