Ansy Posted December 12, 2012 А на MIkrotik ктонибуть реализовывал автоматическую блокировку запрещенных сайтов ?Полный скрипт описан здесьhttp://forum.nag.ru/forum/index.php?showtopic=79836&view=findpost&p=776576 Работает в автомате. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
dvk Posted February 21, 2013 (edited) Вопрос что у нас есть из программного DPI ? напрмер под линукс? статья была на эту тему - здесь. Как раз про блокировку и система вся на линуксе. Edited April 2, 2013 by Shiva Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Ansy Posted February 22, 2013 (edited) Вопрос что у нас есть из программного DPI ? напрмер под линукс?статья была на эту тему - здесь. Как раз про блокировку и система вся на линуксе.А ценничек так ничего себе... ;) 95 тыщ в месяц, 200 тыщ в месяц...Эт чо, попил откатов уже пошел от "аффилированных" к сему закону "сколиков"? Edited April 2, 2013 by Shiva Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Bigmazy Posted April 16, 2013 (edited) Вопрос что у нас есть из программного DPI ? напрмер под линукс?статья была на эту тему - здесь. Как раз про блокировку и система вся на линуксе.А ценничек так ничего себе... ;) 95 тыщ в месяц, 200 тыщ в месяц...Эт чо, попил откатов уже пошел от "аффилированных" к сему закону "сколиков"? Жестко с ценником :), а в не "аффилированных" это сколько? DPI с бесплатной опцией фильтрации, не аффилированный :) даже если вдруг акция закончится пишите что с НАГ всегда договоримся о включении. Edited October 18, 2013 by Bigmazy Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
gavru Posted October 21, 2013 Согласно государственным законам нашей необъятной страны блокировка трафика должна осуществлятся как по доменному имени так и по IP, так что опрос конечно интересный но нашим законотворцам без разницы наше мнение, они хотят и так и так, столкнулся с данной проблемой при написании модуля для автоматического обновления запрещённых ресурсов согласно реестра, для traffpro. Изначально для traffpro из реестра выгружались только домены и подсовывались в виде *blabla.ru, но пришли из контролирующих органов, забили ip и сказали всё исправить, теперь в список загружается ещё и ip. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Dyr Posted December 13, 2013 Согласно государственным законам нашей необъятной страны блокировка трафика должна осуществлятся как по доменному имени так и по IP Да щаззз! Нет такого в законе, лапшу на уши не вешайте и сами не ведитесь. Есть лишь рекомендации Роскомнадзора, и то оформленные в виде "лучше только по доменному имени". Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
yegorov-p Posted December 16, 2013 Согласно государственным законам нашей необъятной страны блокировка трафика должна может осуществлятся как по доменному имени так и по IP Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
roysbike Posted March 14, 2014 Забыл флаг ACK выставить, заработало. Вот такая штука получилась. #!/usr/bin/perl use strict; use Net::Pcap; use NetPacket::Ethernet qw(:strip); use NetPacket::IP qw(:strip); use NetPacket::TCP; use Net::RawIP; $|=1; my $dev='eth1'; my $filter_str='((src net 1.2.3.0/23) or (src net 2.3.4.0/21) or (src net 3.4.5.0/22)) and dst port 80'; my $promisc=0; my $to_ms=1000; my $pcap_t; my $err; my $count = -1; $SIG{CHLD} = 'IGNORE'; my $optimize=0; my $netmask=0; my $snaplen = 4096; my @URL = ("www.ya.ru/test6","www.youtube.com/watch?v=1234567"); my %URL_ARR = (); foreach (@URL) { $URL_ARR{$_} = 1; } print "Filter: $filter_str\n"; $pcap_t=Net::Pcap::open_live($dev, $snaplen, $promisc, $to_ms, \$err) || die "Error opening pcap: $err\n"; my $filter_t; my $result=Net::Pcap::compile($pcap_t, \$filter_t, $filter_str,$optimize,$netmask); Net::Pcap::setfilter($pcap_t, $filter_t); Net::Pcap::loop($pcap_t, $count, \&process_pkt,"xyz"); sub process_pkt { my($pktuser, $hdr, $pkt) = @_; my $ip_obj=NetPacket::IP->decode(eth_strip($pkt)); my $srcip=$ip_obj->{src_ip}; my $dstip=$ip_obj->{dest_ip}; my $proto=$ip_obj->{proto}; my ($tcp_obj, $srcport, $dstport, $dataset, $seqnum, $acknum); if($proto==6){ $tcp_obj=NetPacket::TCP->decode(ip_strip(eth_strip($pkt))); $srcport=$tcp_obj->{src_port}; $dstport=$tcp_obj->{dest_port}; $dataset=$tcp_obj->{data}; $seqnum=$tcp_obj->{seqnum}; $acknum=$tcp_obj->{acknum}; http_handler($dataset, $srcip, $dstip, $srcport, $dstport, $seqnum, $acknum); } } sub http_handler { my ($dataset, $srcip, $dstip, $srcport, $dstport, $seqnum, $acknum) = @_; my ($dataportion, $query, $host); $dataportion = unpack("A*", $dataset); # print "\nDEBUG\n" . unpack("A*",$dataset); if ($dataportion =~ s/^GET\s(.+)\sHTTP\/1\.\d\r\n//) { $query = unpack("A*",$1); $query =~ s/^\/$//; if ($dataportion =~ s/Host:\s(.+)\r\n//) { $host = unpack("A*",$1); if ($URL_ARR{$host . $query}) { print "Matched: $host$query ($srcip)\n"; send_answer($srcip, $dstip, $srcport, $dstport, $seqnum, $acknum); } } } } sub send_answer { my ($srcip, $dstip, $srcport, $dstport, $seqnum, $acknum) = @_; my $header = "HTTP/1.1 301 Moved Permanently Location: http://google.com Connection: close "; my $packet = new Net::RawIP; $packet->set({ip => { saddr => $dstip, daddr => $srcip }, tcp => { source => $dstport, dest => $srcport, seq => $acknum, ack_seq => $seqnum+1, ack => 1, data => $header } }); $packet->send(); } Подскажите, как можно указать чтение из файла со списком урлов? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
disappointed Posted March 17, 2014 Подскажите, как можно указать чтение из файла со списком урлов? Заменить это my @URL = ("www.ya.ru/test6","www.youtube.com/watch?v=1234567"); my %URL_ARR = (); foreach (@URL) { $URL_ARR{$_} = 1; } на это open(URLFILE,"< path_to_file_with_urls"); while (<URLFILE>) { $URL_ARR{$_} = 1; } Если урлы в файле начинаются с http:// то заменить if ($URL_ARR{$host . $query}) { на if ($URL_ARR{"http://" . $host . $query}) { У меня кстати эта задумка с редиректорм так и осталась брошенной. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
holyspirit Posted March 18, 2014 У меня кстати эта задумка с редиректорм так и осталась брошенной. А не подскажите как в процессе работы данного скрипта очистить память? А то несколько дней мучаемся чтобы добавить очистку памяти, но ничего пока не получается. А ребутать скрипт каждые 15 минут как сжирается память не интересно. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
roysbike Posted March 19, 2014 Кто и как фильтрует по URL? Думаем купить железку или решение на pc. Посоветуйте Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Antares Posted March 19, 2014 Кто и как фильтрует по URL? Думаем купить железку или решение на pc. Посоветуйте SCE Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
roysbike Posted March 19, 2014 Кто и как фильтрует по URL? Думаем купить железку или решение на pc. Посоветуйте SCE Бюджетнее нечего? Просто все купили себе SCE или рубят по IP/домену? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
shaggy_ Posted March 26, 2014 Подскажите, как можно указать чтение из файла со списком урлов? Заменить это my @URL = ("www.ya.ru/test6","www.youtube.com/watch?v=1234567"); my %URL_ARR = (); foreach (@URL) { $URL_ARR{$_} = 1; } на это open(URLFILE,"< path_to_file_with_urls"); while (<URLFILE>) { $URL_ARR{$_} = 1; } Если урлы в файле начинаются с http:// то заменить if ($URL_ARR{$host . $query}) { на if ($URL_ARR{"http://" . $host . $query}) { Извеняюсь за глупость, но у меня при замене 2е ошибки выдает Global symbol "%URL_ARR" requires explicit package name at ./block.py line 39. Global symbol "%URL_ARR" requires explicit package name at ./block.py line 86. где есть $URL_ARR{$_} = 1; (в цикле wile и if ($URL_ARR{"http://" . $host . $query}) ). Что сделал: поменял #my @URL = ("http://yandex.ru/test6","www.youtube.com/watch?v=1234567"); #my %URL_ARR = (); #foreach (@URL) { # $URL_ARR{$_} = 1; #} open(URL,"< /media/500Gb/tmp/URLFILE"); while (my $row = <URL>) { chomp $row; $URL_ARR{$_} = 1; print "$row\n"; } и #if ($URL_ARR{$host . $query}) { if ($URL_ARR{"http://" . $host . $query}) { URLFILE вида : http://yandex.ru/test6 www.youtube.com/watch?v=1234567 Подскажите пожалуйста, что я сделал не так? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
roysbike Posted March 26, 2014 Подскажите, как можно указать чтение из файла со списком урлов? Заменить это my @URL = ("www.ya.ru/test6","www.youtube.com/watch?v=1234567"); my %URL_ARR = (); foreach (@URL) { $URL_ARR{$_} = 1; } на это open(URLFILE,"< path_to_file_with_urls"); while (<URLFILE>) { $URL_ARR{$_} = 1; } Если урлы в файле начинаются с http:// то заменить if ($URL_ARR{$host . $query}) { на if ($URL_ARR{"http://" . $host . $query}) { Извеняюсь за глупость, но у меня при замене 2е ошибки выдает Global symbol "%URL_ARR" requires explicit package name at ./block.py line 39. Global symbol "%URL_ARR" requires explicit package name at ./block.py line 86. где есть $URL_ARR{$_} = 1; (в цикле wile и if ($URL_ARR{"http://" . $host . $query}) ). Что сделал: поменял #my @URL = ("http://yandex.ru/test6","www.youtube.com/watch?v=1234567"); #my %URL_ARR = (); #foreach (@URL) { # $URL_ARR{$_} = 1; #} open(URL,"< /media/500Gb/tmp/URLFILE"); while (my $row = <URL>) { chomp $row; $URL_ARR{$_} = 1; print "$row\n"; } и #if ($URL_ARR{$host . $query}) { if ($URL_ARR{"http://" . $host . $query}) { URLFILE вида : http://yandex.ru/test6 www.youtube.com/watch?v=1234567 Подскажите пожалуйста, что я сделал не так? Аналогичная ошибка вываливается Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
roysbike Posted March 26, 2014 Разобрались не коменти my %URL_ARR = (); Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
roysbike Posted March 26, 2014 (edited) С файла читает только последнию строку. Edited March 26, 2014 by roysbike Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
roysbike Posted March 26, 2014 (edited) Подскажите, как можно указать чтение из файла со списком урлов? Заменить это my @URL = ("www.ya.ru/test6","www.youtube.com/watch?v=1234567"); my %URL_ARR = (); foreach (@URL) { $URL_ARR{$_} = 1; } на это open(URLFILE,"< path_to_file_with_urls"); while (<URLFILE>) { $URL_ARR{$_} = 1; } Если урлы в файле начинаются с http:// то заменить if ($URL_ARR{$host . $query}) { на if ($URL_ARR{"http://" . $host . $query}) { У меня кстати эта задумка с редиректорм так и осталась брошенной. Спасибо за помощь, пробуем закрывать вашим скриптом . Идея хорошая. Есть проблема, с файла читает только последнию строку. В файл заносим url в таком виде ya.ru/test1 ya.ru/test2 ya.ru/test3 Возможно ли блокировать url https? Edited March 26, 2014 by roysbike Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
shaggy_ Posted March 26, 2014 Разобрались не коменти my %URL_ARR = (); Это первое что я пробовал. Скрипт запускается, но эффекта нет. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
roysbike Posted March 26, 2014 Разобрались не коменти my %URL_ARR = (); Это первое что я пробовал. Скрипт запускается, но эффекта нет. Как я писал выше, читает только последнию строку. Проверьте у себя Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
shaggy_ Posted March 26, 2014 Разобрались не коменти my %URL_ARR = (); Это первое что я пробовал. Скрипт запускается, но эффекта нет. Как я писал выше, читает только последнию строку. Проверьте у себя неа ни одну из страниц не перенаправляет. И в консоле не видно чтобы что-то писал. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Wingman Posted March 30, 2014 В пятницу какие-то редиски срезолвили что-то в cname vk.com (и мой squid/tproxy жутко затупил), а вслед за этим у меня выдались скучные выходные... Решил тоже попробовать написать программку для фильтрации через nfqueue, и что-то даже получилось :) Софтина крутится на сервере, через который зарулен трафик от юзеров на фильтрующиеся IP-адреса. Через nfqueue пакеты с 80 порта попадают ей на вход, она их парсит, если это get/post запрос - парсит домен и урл, и сверяет со своим списком. Если нужно блокировать -- пакет дальше не пускает, юзеру шлёт соспуфленный пакет с 301 moved, серверу - tcp rst. Пока вроде работает :) Как-то так: # wget http://navalny.zta.lk --2014-03-30 20:53:19-- http://navalny.zta.lk/ Resolving navalny.zta.lk... 46.4.98.148, 2a01:4f8:140:9001::2 Connecting to navalny.zta.lk|46.4.98.148|:80... connected. HTTP request sent, awaiting response... 301 Moved Permanently Location: http://zapret.ip-home.net [following] --2014-03-30 20:53:19-- http://zapret.ip-home.net/ Resolving zapret.ip-home.net... 109.206.159.40 Connecting to zapret.ip-home.net|109.206.159.40|:80... connected. HTTP request sent, awaiting response... 200 OK Length: unspecified [text/html] Saving to: ‘index.html’ [ <=> ] 704 --.-K/s in 0s 2014-03-30 20:53:19 (77,6 MB/s) - ‘index.html’ saved [704] Если кому интересно, доступно для тестирования тут: http://ip-home.net/files/nfq_filter.tar.gz Требования для сборки - в системе должны быть: - cmake - netfilter_queue - boost, boost_regex, boost_program_options - более-менее свежий gcc Сборка: # cd nfq_filter/build # cmake ../ -- The C compiler identification is GNU 4.7.3 ............ -- Found the following Boost libraries: ............ -- Configuring done # make Scanning dependencies of target sender [ 50%] Building CXX object CMakeFiles/sender.dir/sender.cpp.o [ 50%] Built target sender [100%] Building CXX object CMakeFiles/nfq_filter.dir/nfq.cpp.o [100%] Built target nfq_filter Возможна проблема: не знаю, на какой версии, но в libnetfilter в какой-то момент изменлся дефайн функции nfq_get_payload. Если вылезет ошибка вида nfq.cpp: In function ‘int nfqueue_cb(nfq_q_handle*, nfgenmsg*, nfq_data*, void*)’: nfq.cpp:466: error: invalid conversion from ‘unsigned char**’ to ‘char**’ попробуйте обновить пакет libnetfilter_queue (в разных дистрах, очевидно, по-разному); у меня всё ок с net-libs/libnetfilter_queue 1.0.1 Использование (Трафик в сторону интернета идёт через данный сервер, например, нужные ипы анонсируются nas`ам по бгп): Трафик на 80 порт с нужных сетей заруливаем в очередь №0 iptables -t mangle -A PREROUTING -s нужная_сеть/24 -p tcp -m tcp --dport 80 -j NFQUEUE --queue-num 0 --queue-bypass в /etc/nfq/nfq_filter.cfg указываем `queue = 0` и указываем нужный redirect_url Запускаем `nfq_filter -c /etc/nfq/nfq_filter.cfg` - пока не демонизируется, можно запустить в скрине, можно просто так И смотрим `tail -f /tmp/nfq_filter.log` Например: 30.03.2014 20:42:18: Packet (size 977): 109.206.xxx.yy:49934 -> 87.252.216.112:80 Header:*AP**F Seq: 0xdbf51709 Ack: 0x9d4ac577 Win: 0x200a TcpLen: 32 Method: 'GET', Host: 'www.eurogrand.com',URL: '/geo/?var6=Ptier2HP&var5=15451303' Domain found! Blocking. 30.03.2014 20:42:24: Packet (size 262): 109.206.xxx.yy:45391 -> 46.229.165.138:80 Header:*AP*** Seq: 0xf861a316 Ack: 0x6c7b5779 Win: 0xe5 TcpLen: 32 Method: 'GET', Host: 'stop-sex.com',URL: '/ru/' Full url: stop-sex.com/ru/ URL match! hash: 8954467087673850458, url: stop-sex.com/ru/, blocking! Сейчас через сервер летает ~15 мбит/с, сквиду было очень плохо, а этой хреновинке пофиг, изредка вылазит в топе 2-3% загрузки. К тому же, в iptables можно задавать рейнж очередей ( --queue-balance 0:3 ), и натравить несколько копий программки на разные очереди. Дописал её только сегодня - может крешится, может течь, может взорвать вам серверную :) as is, то есть. И вообще, пейсатель на сях из меня так себе :) В списках url/domain всего по несколько записей - сами себе заполните. Ах да - для правильной фильтрации русских url, нужно их записывать в точности так, как передаёт браузер - типа "%D0%B5%D0%BA%D0%B0%D1%82%D". Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
metalsoft Posted April 3, 2014 [root@zapret build]# cmake ../ -- The C compiler identification is GNU 4.7.2 -- The CXX compiler identification is GNU 4.7.2 -- Check for working C compiler: /usr/bin/cc -- Check for working C compiler: /usr/bin/cc -- works -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ -- Check for working CXX compiler: /usr/bin/c++ -- works -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Checking for C++11 compiler -- Checking for C++11 compiler - available -- Boost version: 1.53.0 -- Found the following Boost libraries: -- regex -- program_options -- Configuring done -- Generating done -- Build files have been written to: /root/nfq_filter/build [root@zapret build]# make Scanning dependencies of target sender [ 50%] Building CXX object CMakeFiles/sender.dir/sender.cpp.o Linking CXX static library libsender.a [ 50%] Built target sender Scanning dependencies of target nfq_filter [100%] Building CXX object CMakeFiles/nfq_filter.dir/nfq.cpp.o Linking CXX executable nfq_filter /usr/bin/ld: CMakeFiles/nfq_filter.dir/nfq.cpp.o: неопределённая ссылка на символ «nfnl_fd» /usr/lib64/libnfnetlink.so.0: error adding symbols: DSO missing from command line collect2: error: ld returned 1 exit status make[2]: *** [nfq_filter] Ошибка 1 make[1]: *** [CMakeFiles/nfq_filter.dir/all] Ошибка 2 make: *** [all] Ошибка 2 [root@zapret build]# Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Wingman Posted April 3, 2014 metalsoft Попробуйте версию посвежее отсюда: https://github.com/ircop/nfq_filter # git clone https://github.com/ircop/nfq_filter.git # cd nfq_filter/ # mkdir build && cd build # cmake ../ # make "Причесал" софтину, добавил фич, избавился от пары багов. - нормально логирует события, 4 уровня дебага - возможность полного дебага запросов с конкретного IP-адреса в отдельный файл - демонизируется - не требует рестарта, раз в полчаса перечитывает файлы доменов и урлов - Не взрывает серверные :D В "contrib" лежит пример конфигов и инит-скрипта ------------------- Для тех, у кого libnetfilter-queue < 1.0.1 ( например, debian 6 ), и у кого вываливается ошибка компиляции: nfq.cpp: In function ‘int nfqueue_cb(nfq_q_handle*, nfgenmsg*, nfq_data*, void*)’: nfq.cpp:524: error: invalid conversion from ‘unsigned char**’ to ‘char**’ nfq.cpp:524: error: initializing argument 2 of ‘int nfq_get_payload(nfq_data*, char**)’ nfq.cpp:525: error: invalid conversion from ‘unsigned char**’ to ‘char**’ nfq.cpp:525: error: initializing argument 2 of ‘int nfq_get_payload(nfq_data*, char**)’ Достаточно просто поправить руками. В файле nfq.cpp находим и меняем строки: -- size = nfq_get_payload(nfa, (unsigned char **)&full_packet); -- len = nfq_get_payload(nfa, &data); ++ size = nfq_get_payload(nfa, (char **)&full_packet); ++ len = nfq_get_payload(nfa, (char **)&data); ----- з.ы. Интересны отзывы, если кто будет использовать... А если кто будет добавлять фичи / кроссплатформенность - делайте заодно пулл реквесты на гитхабе :) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Ivan_83 Posted April 3, 2014 Заюзай autotools для сборки, с их помощью как то можно и версию либы детектить автоматом. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...