Перейти к содержимому
Калькуляторы

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

Всем привет!

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

:-)

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

- работает в связке с 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, который качает список роскомнадзора и преобразует его в конфиг программы-фильтра.

Изменено пользователем oleg_n

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

Изменено пользователем sanyasi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

Это есть.

 

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

 

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

 

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Выложил код сюда - github

Изменено пользователем oleg_n

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

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

 

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

 

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

 

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

Изменено пользователем oleg_n

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Изменено пользователем ne-vlezay80

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

 

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

 

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

 

snort - хз.

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

 

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

Изменено пользователем oleg_n

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

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

 

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

Изменено пользователем oleg_n

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Где?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Где?

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

utf-8

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это был не вопрос.

Это была подсказка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

 

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

 

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Изменено пользователем oleg_n

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Join the conversation

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.