Jump to content
Калькуляторы
Блокировка веб ресурса  

569 members have voted

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



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

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

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

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

Share this post


Link to post
Share on other sites

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

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

 

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

Edited by Shiva

Share this post


Link to post
Share on other sites

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

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

Edited by Shiva

Share this post


Link to post
Share on other sites

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

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

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

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

Edited by Bigmazy

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

 

 

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

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

Share this post


Link to post
Share on other sites

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

 

Заменить это

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

 

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

SCE

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

Share this post


Link to post
Share on other sites

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

 

Заменить это

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

 

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

Share this post


Link to post
Share on other sites

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

 

Заменить это

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

 

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

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

Share this post


Link to post
Share on other sites

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

 

Заменить это

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 by roysbike

Share this post


Link to post
Share on other sites

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

 

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

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

Share this post


Link to post
Share on other sites

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

 

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

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

 

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

 

-----

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

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.