Блокировка веб ресурса   467 проголосовавших

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


Пожалуйста, войдите или зарегистрируйтесь для возможности голосования в этом опросе.

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

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

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

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


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

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

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

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

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

 

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

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


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

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

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


Ссылка на сообщение
Поделиться на другие сайты
прошу прощения, я тормоз. =) в ack же содержится sequence number...

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

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

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

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

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


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

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

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

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


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

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

 

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

 

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

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


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

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

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

 

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

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

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

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

 

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

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

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


Ссылка на сообщение
Поделиться на другие сайты
Может приезжающий через 20мс настоящий ответ сервера мешает.

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

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


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

Забыл флаг 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.

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

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


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

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

 

 

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

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

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

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

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

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

 

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

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


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

 

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

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

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

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

 

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

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


Ссылка на сообщение
Поделиться на другие сайты
Что бы это значило?

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

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


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

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

 

 

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

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

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

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

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

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

 

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

 

ng_bpf ?

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


Ссылка на сообщение
Поделиться на другие сайты
Что бы это значило?

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

У меня таже ошибка. Запускаю от root.

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


Ссылка на сообщение
Поделиться на другие сайты
Что бы это значило?

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

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

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

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


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

AlKov

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

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


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

AlKov

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

У меня. да все.

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


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

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

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

 

 

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

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


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

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

 

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() ?

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


Ссылка на сообщение
Поделиться на другие сайты
При 10К записей фильтра

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

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

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


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

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

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

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

 

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

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

 

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

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

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


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

AlKov

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

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

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

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

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


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

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.

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

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


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

0 вместо "xyz"

 

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

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

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти