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

565 пользователей проголосовало

  1. 1. Для блокировка используем



Блокировка сайтов провайдерами маневры с DNS

А на MIkrotik ктонибуть реализовывал автоматическую блокировку запрещенных сайтов ?
Полный скрипт описан здесь

http://forum.nag.ru/forum/index.php?showtopic=79836&view=findpost&p=776576

Работает в автомате.

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


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

Вопрос что у нас есть из программного DPI ?

напрмер под линукс?

 

статья была на эту тему - здесь. Как раз про блокировку и система вся на линуксе.

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

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


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

Вопрос что у нас есть из программного DPI ? напрмер под линукс?
статья была на эту тему - здесь. Как раз про блокировку и система вся на линуксе.
А ценничек так ничего себе... ;) 95 тыщ в месяц, 200 тыщ в месяц...

Эт чо, попил откатов уже пошел от "аффилированных" к сему закону "сколиков"?

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

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


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

Вопрос что у нас есть из программного DPI ? напрмер под линукс?
статья была на эту тему - здесь. Как раз про блокировку и система вся на линуксе.
А ценничек так ничего себе... ;) 95 тыщ в месяц, 200 тыщ в месяц...

Эт чо, попил откатов уже пошел от "аффилированных" к сему закону "сколиков"?

Жестко с ценником :), а в не "аффилированных" это сколько?

DPI с бесплатной опцией фильтрации, не аффилированный :) даже если вдруг акция закончится пишите что с НАГ всегда договоримся о включении.

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

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


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

Согласно государственным законам нашей необъятной страны блокировка трафика должна осуществлятся как по доменному имени так и по IP, так что опрос конечно интересный но нашим законотворцам без разницы наше мнение, они хотят и так и так, столкнулся с данной проблемой при написании модуля для автоматического обновления запрещённых ресурсов согласно реестра, для traffpro. Изначально для traffpro из реестра выгружались только домены и подсовывались в виде *blabla.ru, но пришли из контролирующих органов, забили ip и сказали всё исправить, теперь в список загружается ещё и ip.

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


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

Согласно государственным законам нашей необъятной страны блокировка трафика должна осуществлятся как по доменному имени так и по IP

Да щаззз! Нет такого в законе, лапшу на уши не вешайте и сами не ведитесь. Есть лишь рекомендации Роскомнадзора, и то оформленные в виде "лучше только по доменному имени".

 

 

 

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


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

Согласно государственным законам нашей необъятной страны блокировка трафика должна может осуществлятся как по доменному имени так и по IP

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


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

Забыл флаг 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();
}

 

Подскажите, как можно указать чтение из файла со списком урлов?

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


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

Подскажите, как можно указать чтение из файла со списком урлов?

 

Заменить это

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}) {

 

У меня кстати эта задумка с редиректорм так и осталась брошенной.

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


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

У меня кстати эта задумка с редиректорм так и осталась брошенной.

А не подскажите как в процессе работы данного скрипта очистить память? А то несколько дней мучаемся чтобы добавить очистку памяти, но ничего пока не получается. А ребутать скрипт каждые 15 минут как сжирается память не интересно.

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


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

Кто и как фильтрует по URL? Думаем купить железку или решение на pc. Посоветуйте

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


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

Кто и как фильтрует по URL? Думаем купить железку или решение на pc. Посоветуйте

SCE

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


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

Кто и как фильтрует по URL? Думаем купить железку или решение на pc. Посоветуйте

SCE

Бюджетнее нечего? Просто все купили себе SCE или рубят по IP/домену?

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


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

Подскажите, как можно указать чтение из файла со списком урлов?

 

Заменить это

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

 

Подскажите пожалуйста, что я сделал не так?

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


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

Подскажите, как можно указать чтение из файла со списком урлов?

 

Заменить это

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

 

Подскажите пожалуйста, что я сделал не так?

Аналогичная ошибка вываливается

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


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

Разобрались не коменти my %URL_ARR = ();

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


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

С файла читает только последнию строку.

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

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


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

Подскажите, как можно указать чтение из файла со списком урлов?

 

Заменить это

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?

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

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


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

Разобрались не коменти my %URL_ARR = ();

 

Это первое что я пробовал. Скрипт запускается, но эффекта нет.

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


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

Разобрались не коменти my %URL_ARR = ();

 

Это первое что я пробовал. Скрипт запускается, но эффекта нет.

Как я писал выше, читает только последнию строку. Проверьте у себя

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


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

Разобрались не коменти my %URL_ARR = ();

 

Это первое что я пробовал. Скрипт запускается, но эффекта нет.

Как я писал выше, читает только последнию строку. Проверьте у себя

 

неа ни одну из страниц не перенаправляет. И в консоле не видно чтобы что-то писал.

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


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

В пятницу какие-то редиски срезолвили что-то в 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".

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


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

[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]# 

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


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

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);

 

-----

з.ы. Интересны отзывы, если кто будет использовать... А если кто будет добавлять фичи / кроссплатформенность - делайте заодно пулл реквесты на гитхабе :)

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


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

Заюзай autotools для сборки, с их помощью как то можно и версию либы детектить автоматом.

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


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

Join the conversation

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

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

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

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

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

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

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