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