YuryD Posted November 8, 2012 это плохо, нужно явное уведомление - "Доступ запрещен! Вопросы? - смотреть здесь." по-моему, это невозможно, если в "dpi" попадает только исходящий от клиента трафик. Это как ? Незапрошенный контент сам приходит ? Это не почтовый спам, это запрос от клиента... Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
boco Posted November 8, 2012 это плохо, нужно явное уведомление - "Доступ запрещен! Вопросы? - смотреть здесь." по-моему, это невозможно, если в "dpi" попадает только исходящий от клиента трафик. Это как ? Незапрошенный контент сам приходит ? Это не почтовый спам, это запрос от клиента... что "как"? я не понял вопроса. я говорю о том, что давать клиенту редирект на страничку "а-та-та" при использовании полудуплексной схемы фильтрации (когда на фильтрующую железку попадает только трафик идущий от клиента к http-серверам) не получится, потому что фильтрующая железка не имеет доступа к sequence number удаленной стороны. http://ru.wikipedia.org/wiki/TCP_hijacking Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
boco Posted November 8, 2012 фильтрующая железка не имеет доступа к sequence number удаленной стороны. прошу прощения, я тормоз. =) в ack же содержится sequence number... Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
disappointed Posted November 8, 2012 прошу прощения, я тормоз. =) в ack же содержится sequence number... Да, я вот собрал пакет с 301 кодом, подставил верные seq и ack (беру из запроса клиента), по дампам пакетов вроде всё верно выглядит, но чего-то пока не получается. Может приезжающий через 20мс настоящий ответ сервера мешает. Завтра продолжу ковырять. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
disappointed Posted November 8, 2012 (edited) Забыл флаг 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 November 8, 2012 by disappointed Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
st_re Posted November 8, 2012 наверное еще надо RST той стороне сплавить, иначе Вас быстро вычислят и будут блочить, да хоть по размеру пакета (они же как близнецы братья будут выходить), и продолжать работать.. Если мне склероз не изменяет, по описанию именно так поначалу работал большой андронный коллайдер китайский фаервол. Слал в обе стороны RST. китайцы нашли способ, тупо стали блочить RST и пользоваться инетом.. (но им приходилось договариваться с принимающей стороной, чтобы она блочила тоже). Говорят китайцы лавочку прикрыли уже. И основное соединение можно в шейпер (нужна только задержка, заведомо большая, чем Ваш скрипт сработает) загнать, чтобы правильный пакет случайно раньше не пришел, а то клиент болт положит на Ваш ответ :) Ну и для полноты счастья, после редиректа плюнуть еще и RST клиенту c небольшой задержкой :) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
disappointed Posted November 8, 2012 Думаю тем кто способен отфильтровывать такие пакетики никакие преграды не помеха. Тор поставят с restrictednodes {RU} и без всяких телодвижений всё будет работать. И с урлами тоже вопрос, тот же ютуб может иметь весьма разное следование параметров, тот же v= можно впихнуть подальше к концу http://www.youtube.com/watch?feature=g-vrec&v=Ac5Ei5SkxRU и обойти матчинг. они же как близнецы братья будут выходить Можно заморочится и выплёвывать самые разнообразные хидеры очень похожие на реальные. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
boco Posted November 9, 2012 Может приезжающий через 20мс настоящий ответ сервера мешает. если вместо клиентского пакетика заслать на сервер пакет с rst, то он, по идее, должен закрыть соединение безо всякого подтверждения клиенту. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
AlKov Posted November 9, 2012 Забыл флаг 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. Что бы это значило? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Ivan_83 Posted November 9, 2012 *напомнило развлечения с utp* Основные проблемы: 1. Нужно собирать фрагментированные пакеты; 2. Держать список для данных соединений; 3. Нужно регэкспать; 4. Держать большой список для регэкспа с ип адресами и регэкспами; 5. Всё это делать в ядре. И ещё, если оно ставится "с боку" и видит траф только в одну сторону, то с редиректами могут быть проблемы. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
st_re Posted November 9, 2012 И с урлами тоже вопрос, тот же ютуб может иметь весьма разное следование параметров, тот же v= можно впихнуть подальше к концу http://www.youtube.com/watch?feature=g-vrec&v=Ac5Ei5SkxRU и обойти матчинг. Ну тут вроде как не Ваша головная боль, урл черным по фону прописан в файлике от реестра. Все что не eq - в сад, по идее. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
disappointed Posted November 9, 2012 Что бы это значило? Вываливается на sendto? Привилегии рута? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Dm1try Posted November 9, 2012 *напомнило развлечения с utp* Основные проблемы: 1. Нужно собирать фрагментированные пакеты; 2. Держать список для данных соединений; 3. Нужно регэкспать; 4. Держать большой список для регэкспа с ип адресами и регэкспами; 5. Всё это делать в ядре. И ещё, если оно ставится "с боку" и видит траф только в одну сторону, то с редиректами могут быть проблемы. ng_bpf ? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
AdmSasha Posted November 9, 2012 Что бы это значило? Вываливается на sendto? Привилегии рута? У меня таже ошибка. Запускаю от root. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
AlKov Posted November 9, 2012 Что бы это значило? Вываливается на sendto? Привилегии рута? Да, запуск от root. Похоже дело не в правах, вываливается как-то странно, без ошибки. В скрипте специально включил "варнинги"(#!/usr/bin/perl -w). Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
disappointed Posted November 9, 2012 AlKov Перед send() воткнуть принт и посмотреть все ли поля заполнены в структуре ($srcip $dstip итд). Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
AdmSasha Posted November 9, 2012 AlKov Перед send() воткнуть принт и посмотреть все ли поля заполнены в структуре ($srcip $dstip итд). У меня. да все. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
YuryD Posted November 9, 2012 Забыл флаг ACK выставить, заработало. Вот такая штука получилась. Штука конечно замечательная, на производительность не тестили ? Хотя бы 100Мбит комп пережуёт ? При 10К записей фильтра ? Не подколка, вопрос практического применения. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
disappointed Posted November 9, 2012 Вероятно косяк где-то в этом 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() ? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
disappointed Posted November 9, 2012 При 10К записей фильтра Так ассоциативный массив же, ему всё равно на кол-во элементов, лишь бы памяти хватило. Сам урл является уникальным ключём, выборка мгновенная. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Ivan_83 Posted November 9, 2012 ng_bpf ? Даже близко нет. бпф - это типа ядерного tcpdump (правила от последнего всовываются в бпф). Самое близкое и простое в реализации решение: написать ноду нетграфа для матчинга по регэкспу, типа как в линуксах есть. Дальше в ипфв поставить чтобы собирал (скруб) пакеты для указанных ип, далее генерить цепочки правил: для каждого ип (или группы) прохождение через свою ноду с матчингом по регэкспу. К моему предыдущему посту +: в таблице с соединениями нужно их поддерживать. И ещё, я тут вспомнил про keepalive, когда в первом запросе можно запросить то что не заблочено, а во втором и последующих то что заблочено и всё это в пределах одного соединения. Короче, не вижу простого решения для работы в ядре, а в юзерспейсе уже есть. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
AlKov Posted November 9, 2012 AlKov Перед send() воткнуть принт и посмотреть все ли поля заполнены в структуре ($srcip $dstip итд). Все переменные имеют значения. А вот как проверить заполнение структуры, не знаю.. Я запускаю на 3.2.0-3-686-pae, может дело в разрядности системы? В dmesg нет никакой ругани в момент блокирования sendto() ? CentOS 5.5 ядро 2.6.34 x86_64, самосборное. В dmesg пусто.. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
disappointed Posted November 9, 2012 AlKov Нука а так, вываливается? http://pastebin.com/M5b0jHnZ Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
AlKov Posted November 9, 2012 (edited) 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 November 10, 2012 by AlKov Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
disappointed Posted November 10, 2012 0 вместо "xyz" Вообщем думаю дело в 64битной версии либы, и корявой реализации модуля под неё, в интернетах молчок на эту тему. Нужно поискать как ещё можно собрать RAW пакет. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...