Jump to content

Блокировка веб ресурса  

569 members have voted

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



Recommended Posts

  • 2 months later...
  • Replies 6.1k
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

Posted (edited)

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

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

 

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

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

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

Edited by Shiva
  • 1 month later...
Posted (edited)
Вопрос что у нас есть из программного DPI ? напрмер под линукс?
статья была на эту тему - здесь. Как раз про блокировку и система вся на линуксе.
А ценничек так ничего себе... ;) 95 тыщ в месяц, 200 тыщ в месяц...

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

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

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

Edited by Bigmazy
  • 6 months later...
Posted

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

  • 1 month later...
Posted

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

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

 

 

 

  • 2 months later...
Posted

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

 

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

Posted

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

 

Заменить это

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

 

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

Posted

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

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

Posted

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

SCE

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

Posted

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

 

Заменить это

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

 

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

Posted

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

 

Заменить это

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

 

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

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

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

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

 

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

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

Posted

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

 

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

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

 

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

Posted

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

Posted

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

Posted

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

 

-----

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

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.


×
×
  • Create New...