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

569 members have voted

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



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

это плохо, нужно явное уведомление - "Доступ запрещен! Вопросы? - смотреть здесь."

по-моему, это невозможно, если в "dpi" попадает только исходящий от клиента трафик.

Это как ? Незапрошенный контент сам приходит ? Это не почтовый спам, это запрос от клиента...

Share this post


Link to post
Share on other sites

это плохо, нужно явное уведомление - "Доступ запрещен! Вопросы? - смотреть здесь."

по-моему, это невозможно, если в "dpi" попадает только исходящий от клиента трафик.

Это как ? Незапрошенный контент сам приходит ? Это не почтовый спам, это запрос от клиента...

что "как"? я не понял вопроса.

 

я говорю о том, что давать клиенту редирект на страничку "а-та-та" при использовании полудуплексной схемы фильтрации (когда на фильтрующую железку попадает только трафик идущий от клиента к http-серверам) не получится, потому что фильтрующая железка не имеет доступа к sequence number удаленной стороны. http://ru.wikipedia.org/wiki/TCP_hijacking

Share this post


Link to post
Share on other sites

фильтрующая железка не имеет доступа к sequence number удаленной стороны.

прошу прощения, я тормоз. =) в ack же содержится sequence number...

Share this post


Link to post
Share on other sites

прошу прощения, я тормоз. =) в ack же содержится sequence number...

Да, я вот собрал пакет с 301 кодом, подставил верные seq и ack (беру из запроса клиента),

по дампам пакетов вроде всё верно выглядит, но чего-то пока не получается.

Может приезжающий через 20мс настоящий ответ сервера мешает.

Завтра продолжу ковырять.

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

Edited by disappointed

Share this post


Link to post
Share on other sites

наверное еще надо RST той стороне сплавить, иначе Вас быстро вычислят и будут блочить, да хоть по размеру пакета (они же как близнецы братья будут выходить), и продолжать работать..

 

Если мне склероз не изменяет, по описанию именно так поначалу работал большой андронный коллайдер китайский фаервол. Слал в обе стороны RST. китайцы нашли способ, тупо стали блочить RST и пользоваться инетом.. (но им приходилось договариваться с принимающей стороной, чтобы она блочила тоже). Говорят китайцы лавочку прикрыли уже.

 

И основное соединение можно в шейпер (нужна только задержка, заведомо большая, чем Ваш скрипт сработает) загнать, чтобы правильный пакет случайно раньше не пришел, а то клиент болт положит на Ваш ответ :) Ну и для полноты счастья, после редиректа плюнуть еще и RST клиенту c небольшой задержкой :)

Share this post


Link to post
Share on other sites

Думаю тем кто способен отфильтровывать такие пакетики никакие преграды не помеха.

Тор поставят с restrictednodes {RU} и без всяких телодвижений всё будет работать.

 

И с урлами тоже вопрос, тот же ютуб может иметь весьма разное следование параметров,

тот же v= можно впихнуть подальше к концу

http://www.youtube.com/watch?feature=g-vrec&v=Ac5Ei5SkxRU

и обойти матчинг.

 

они же как близнецы братья будут выходить

Можно заморочится и выплёвывать самые разнообразные хидеры очень похожие на реальные.

Share this post


Link to post
Share on other sites

Может приезжающий через 20мс настоящий ответ сервера мешает.

если вместо клиентского пакетика заслать на сервер пакет с rst, то он, по идее, должен закрыть соединение безо всякого подтверждения клиенту.

Share this post


Link to post
Share on other sites

Забыл флаг ACK выставить, заработало.

Вот такая штука получилась.

А небольшие комментарии можно увидеть к этой "штуке"?

 

P.S. Кстати, вот -

Filter: ((src net 172.16.0.0/16)) and dst port 80
Matched: opennet.ru (172.16.0.7)
sendto() at /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/Net/RawIP.pm line 630.

Что бы это значило?

Share this post


Link to post
Share on other sites

*напомнило развлечения с utp*

 

 

Основные проблемы:

1. Нужно собирать фрагментированные пакеты;

2. Держать список для данных соединений;

3. Нужно регэкспать;

4. Держать большой список для регэкспа с ип адресами и регэкспами;

5. Всё это делать в ядре.

 

И ещё, если оно ставится "с боку" и видит траф только в одну сторону, то с редиректами могут быть проблемы.

Share this post


Link to post
Share on other sites

 

И с урлами тоже вопрос, тот же ютуб может иметь весьма разное следование параметров,

тот же v= можно впихнуть подальше к концу

http://www.youtube.com/watch?feature=g-vrec&v=Ac5Ei5SkxRU

и обойти матчинг.

 

Ну тут вроде как не Ваша головная боль, урл черным по фону прописан в файлике от реестра. Все что не eq - в сад, по идее.

Share this post


Link to post
Share on other sites

*напомнило развлечения с utp*

 

 

Основные проблемы:

1. Нужно собирать фрагментированные пакеты;

2. Держать список для данных соединений;

3. Нужно регэкспать;

4. Держать большой список для регэкспа с ип адресами и регэкспами;

5. Всё это делать в ядре.

 

И ещё, если оно ставится "с боку" и видит траф только в одну сторону, то с редиректами могут быть проблемы.

 

ng_bpf ?

Share this post


Link to post
Share on other sites

Что бы это значило?

Вываливается на sendto? Привилегии рута?

Да, запуск от root. Похоже дело не в правах, вываливается как-то странно, без ошибки.

В скрипте специально включил "варнинги"(#!/usr/bin/perl -w).

Share this post


Link to post
Share on other sites

Забыл флаг ACK выставить, заработало.

Вот такая штука получилась.

 

 

Штука конечно замечательная, на производительность не тестили ? Хотя бы 100Мбит комп пережуёт ? При 10К записей фильтра ? Не подколка, вопрос практического применения.

Share this post


Link to post
Share on other sites

Вероятно косяк где-то в этом

 

With newer Linux kernels, we are seeing some issues with Net::RawIP. Here is an entry from someone else's FAQ that addresses the issue, but it is not working for me. ;)

Q: I get sendto() at /usr/local/lib/perl/5.8.2/Net/RawIP.pm line 550?

A: You are not allowed to send the constructed packet. Please check if you

are running a packet filtering program (Linux: iptables -L or ipchains -L /

FreeBSD: ipfw list). If that's not the case and you are trying to send an

icmp redirect packet check if your system allows you to send redirect

messages e.g. look at /proc/sys/net/ipv4/conf/all/*redirect or at

sysctl net.ipv4.conf.default.send_redirects.

Try sysctl -w net.inet.icmp.drop_redirect=0 under FreeBSD.

 

Я запускаю на 3.2.0-3-686-pae, может дело в разрядности системы? В dmesg нет никакой ругани в момент блокирования sendto() ?

Share this post


Link to post
Share on other sites

При 10К записей фильтра

Так ассоциативный массив же, ему всё равно на кол-во элементов,

лишь бы памяти хватило. Сам урл является уникальным ключём, выборка мгновенная.

Share this post


Link to post
Share on other sites

ng_bpf ?

Даже близко нет.

бпф - это типа ядерного tcpdump (правила от последнего всовываются в бпф).

Самое близкое и простое в реализации решение: написать ноду нетграфа для матчинга по регэкспу, типа как в линуксах есть. Дальше в ипфв поставить чтобы собирал (скруб) пакеты для указанных ип, далее генерить цепочки правил: для каждого ип (или группы) прохождение через свою ноду с матчингом по регэкспу.

 

К моему предыдущему посту +:

в таблице с соединениями нужно их поддерживать.

 

И ещё, я тут вспомнил про keepalive, когда в первом запросе можно запросить то что не заблочено, а во втором и последующих то что заблочено и всё это в пределах одного соединения.

Короче, не вижу простого решения для работы в ядре, а в юзерспейсе уже есть.

Share this post


Link to post
Share on other sites

AlKov

Перед send() воткнуть принт и посмотреть все ли поля заполнены в структуре ($srcip $dstip итд).

Все переменные имеют значения. А вот как проверить заполнение структуры, не знаю..

Я запускаю на 3.2.0-3-686-pae, может дело в разрядности системы? В dmesg нет никакой ругани в момент блокирования sendto() ?

CentOS 5.5 ядро 2.6.34 x86_64, самосборное. В dmesg пусто..

Share this post


Link to post
Share on other sites

AlKov

Нука а так, вываливается?

http://pastebin.com/M5b0jHnZ

Не вываливается, но... и не матчит даже. Т.е. сюда (print "Matched: $host$query ($srcip)\n";) не попадает..

Кстати, если включить "варнинги", то

Argument "xyz" isn't numeric in subroutine entry at ./deny_sites.pl line 23

 

Добавлено 10.11.12 11:49

Извиняюсь, заснул видимо ночью (не тот урл вводил). :) Вываливается все равно, только теперь ругани больше

Filter: dst port 80
Argument "xyz" isn't numeric in subroutine entry at ./deny_sites.pl line 23.
Matched: opennet.ru (172.16.0.7)
sendto() at /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/Net/RawIP.pm line 630.
       (in cleanup) Not a HASH reference at /usr/lib64/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/Net/RawIP.pm line 691 during global destruction.

Edited by AlKov

Share this post


Link to post
Share on other sites

0 вместо "xyz"

 

Вообщем думаю дело в 64битной версии либы, и корявой реализации модуля под неё,

в интернетах молчок на эту тему. Нужно поискать как ещё можно собрать RAW пакет.

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.