Перейти к содержимому
Калькуляторы

Опубликована Процедура блокировки некошерной инфо

Сейчас в лабе дорабатываем напильником следующее решение по организации фильтрации (без мега DPI:))

 

1. берём список с сайта Роскомнадзора.

2. Парсим, получаем пары ip+URL

3. Полученые ip анонсим (кваггой) по бгп в наш транспорт.

4. В результате аплинк-трафик на данные адреса отправляется на фильтрующий сервер. Даунлинк при этом идёт мимо.

5. На сервере с помошью iptables (string matсh) перекидываем пакетики, в которых есть соответствующий URL (из п.2) в NFQUEUE. tcp handshake и другой трафик на эти адреса пролетает насквозь. Т.е. матчится только GET запрос.

6. из NFQUEUE их ловит перловый (пока) скрипт, который делает tcp hijacking (т.е. отвечает от имени удалённого сервера двумя пакетами: АСК-ом, и 301 редиректом на страницу блокировки.

7. для трафика на 443й порт, делаем редирект на локальный nginx, опять же отдающий редирект на страницу блокировки.

 

П.п. 3,4,5,6 уже работают, остальное - думаю, также скоро допилим.

 

Покритикуйте, может быть есть более интересные идеи.

 

Присоединюсь к просьбе: скриптом и iptables-частью не поделитесь? (п.п. 5-6)

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

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


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

C помощью выше приведенных перловых скриптов получаем реестр, разгрызаем его на ip и url, из url берем доменные имена и через dns блокируем их.

решили пока так сделать.

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


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

C помощью выше приведенных перловых скриптов получаем реестр, разгрызаем его на ip и url, из url берем доменные имена и через dns блокируем их.

url через DNS вроде не заблокировать, только домен целиком.

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


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

я и написал

C помощью выше приведенных перловых скриптов получаем реестр, разгрызаем его на ip и url, из url берем доменные имена и через dns блокируем их.

решили пока так сделать.

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


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

Прошу прощения, если пропустил где-то уже эту мысль.

Но мне кажется блокировать по IP лучше тем, что мы даем ресурсу возможность поменять за полчаса DNS-запись и продолжить работу... При этом не нарушая закон.

А по URL - мы потеряем привычные сайты, типа либрусека.

 

//Спасибо за внимание.

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


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

А кто-нибудь уже посчитал, сколько трафика идет на не заблокированные сайты на заблокированных IP-ах? И есть ли он вообще :)).

За пару часов при общем трафике 7-8г, с заблокированных ипов в среднем ~250 кбит, редкие пики до 1.5 мбит

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


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

Небольшой оффтопик..

 

А кто-нибудь знает где можно брать обновляемую бд с категориями сайтов? А то есть задумка родительский контроль сделать на базе ДНС. Сам механизм уже реализован, дело за малым - категории в дефиците ((

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


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

А вот еще такие ссылки:

http://запретный.сайт:666/isp_sucks

https://запретный.сайт:80/isp_sucks_again

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


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

Небольшой оффтопик..

 

А кто-нибудь знает где можно брать обновляемую бд с категориями сайтов? А то есть задумка родительский контроль сделать на базе ДНС. Сам механизм уже реализован, дело за малым - категории в дефиците ((

Ну начни поиск отсюда - http://netpolice.ru/

Они делают свою систему на основе какой-то подобной БД - вообщем по ссылкам на их сайте найдешь.

А вообще это больная тема... Более 10-ти лет назад было предложение вносить категории непосредственно в ТХТ-записи DNS-ов, но... защитники прав и свобод, противники цензуры и правоверные либерасты с дерьмократами зарезали идею на корню. :(

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


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

Для решения проблемы мелких пакетов и keep-alive-ов вместо string matсh можно использовать l7-filter.

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


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

http://webdoska.msk.ru/бла-бла.html

 

у трансов и РТ этой сетки нет в BGP

через анонимайзер получаем страничку билайна где выпилен весь IP

это какой-то фееричный ***ец господа

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

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


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

А кто-нибудь знает где можно брать обновляемую бд с категориями сайтов? А то есть задумка родительский контроль сделать на базе ДНС. Сам механизм уже реализован, дело за малым - категории в дефиците ((

Поищите коммерческую обновляемую базу, их навалом продают. Лет наверное 8 назад покупал cyberpatrol, были ежесуточные обновления, десяток категорий сайтов, для того времени база была очень неплохая (но софт был кривущий). Нормальных некоммерческих баз не видел. Ну и все нормальные сайты для взрослых имеют метки RTA, только механизм фильтрации на DNS уже не применишь - нужен контент-фильтр.

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


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

Кто там просил iptables конфигурацию для матча по строке? Она тривиальная:

 

*mangle 
:PREROUTING ACCEPT [515896:28987359] 
:INPUT ACCEPT [514357:28806292] 
:FORWARD ACCEPT [1374:147744] 
:OUTPUT ACCEPT [1066767:144759434] 
:POSTROUTING ACCEPT [1067940:144880593] 
-A PREROUTING -p tcp -m string --string "/art/01/03" --algo bm --to 65535 -j NFQUEUE --queue-num 0 COMMIT 

 

Скрипт для отсылки редиректа (пока это просто маленький грязный хак, без оптимизации):

 

#!/usr/bin/perl 
# 
# see http://search.cpan.org/~atrak/NetPacket-0.04/ 

#use strict; 

BEGIN { 
push @INC,"perl"; 
push @INC,"build/perl"; 
push @INC,"NetPacket-0.04"; 
}; 

use nfqueue; 

use NetPacket::IP qw(IP_PROTO_TCP); 
use NetPacket::TCP; 
use Socket qw(AF_INET AF_INET6); 
use Data::Dumper; 
use Net::RawIP; 

use CGI; 
my $cgi = CGI->new(); 


my $q; 

sub cleanup() 
{ 
print "unbind\n"; 
$q->unbind(AF_INET); 
print "close\n"; 
$q->close(); 
} 

sub swap_values { 

my ( $src, $dst ) = @_; 

my $old_dst = $dst; 
$dst = $src; 
$src = $old_dst;	 

return ( $src, $dst ); 

} 

sub create_packet { 

my ( $payload ) = @_; 

my $ip_obj = NetPacket::IP->decode($payload->get_data()); 

if($ip_obj->{proto} == IP_PROTO_TCP) { 
# decode the TCP header 
	my $tcp_obj = NetPacket::TCP->decode($ip_obj->{data}); 
	my $data_len = 0; 

	if ($tcp_obj->{flags} & NetPacket::TCP::PSH && 
			length($tcp_obj->{data})) { 

		$data_len = length( $tcp_obj->{data} ); 

	} 

	$tcp_obj->{data} = $cgi->redirect( 
		-uri => 'http://zapret-info.gov.ru/', 
		-status => 301, 
		-nph => 1, 
	);  

	$tcp_obj->{checksum} = 0; 
	$ip_obj->{checksum} = 0; 

	( $tcp_obj->{seqnum}, $tcp_obj->{acknum} ) = swap_values( $tcp_obj->{seqnum}, $tcp_obj->{acknum} ); 
	$tcp_obj->{acknum} =  $tcp_obj->{acknum} + $data_len; 

	( $ip_obj->{src_ip}, $ip_obj->{dest_ip} ) = swap_values( $ip_obj->{src_ip}, $ip_obj->{dest_ip} ); 

	( $tcp_obj->{src_port}, $tcp_obj->{dest_port} ) = swap_values( $tcp_obj->{src_port}, $tcp_obj->{dest_port} ); 

	$ip_obj->{data} = $tcp_obj->encode($ip_obj); 

	my $modified_payload = $ip_obj->encode(); 

	my $packet = new Net::RawIP; 

	$packet->set({ 
			ip => {  
				saddr => $ip_obj->{src_ip}, 
				daddr => $ip_obj->{dest_ip}, 
				}, 
			tcp => {  
				source => $tcp_obj->{src_port}, 
				dest => $tcp_obj->{dest_port}, 
				seq => $tcp_obj->{seqnum}, 
				ack_seq => $tcp_obj->{acknum}, 
				ack => 1, 
				syn => 0, 
				fin => 0, 
				psh => 0, 
				} 
			}); 

	$packet->send; 

	my $ip2 = NetPacket::IP->decode($modified_payload); 

	my $tcp2 = NetPacket::TCP->decode($ip2->{data}); 

	my $ret = $payload->set_verdict_modified($nfqueue::NF_ACCEPT,$modified_payload,length($modified_payload)); 
	return; 
} 

$payload->set_verdict($nfqueue::NF_ACCEPT); 
return; 


} 

sub cb() 
{ 
my ($dummy,$payload) = @_; 
print "Perl callback called!\n"; 
print "dummy is $dummy\n" if $dummy; 
if ($payload) { 


	create_packet( $payload );  

} 
$payload->set_verdict($nfqueue::NF_ACCEPT); 
} 


$q = new nfqueue::queue(); 


$SIG{INT} = "cleanup"; 

print "setting callback\n"; 
$q->set_callback(\&cb); 

print "open\n"; 
$q->fast_open(0, AF_INET); 

print "trying to run\n"; 
$q->try_run(); 

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


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

7. для трафика на 443й порт, делаем редирект на локальный nginx, опять же отдающий редирект на страницу блокировки.

А что будет, когда клиенты увидят поддельный сертификат? И чем это лучше бана по IP ?

Они не увидят поддельного сертификата. Это тупо блокировка https на данные ip, с показом forbidden-странички.

 

5. На сервере с помошью iptables (string matсh) перекидываем пакетики, в которых есть соответствующий URL (из п.2) в NFQUEUE. tcp handshake и другой трафик на эти адреса пролетает насквозь. Т.е. матчится только GET запрос.

6. из NFQUEUE их ловит перловый (пока) скрипт, который делает tcp hijacking (т.е. отвечает от имени удалённого сервера двумя пакетами: АСК-ом, и 301 редиректом на страницу блокировки.

 

А как оно будет работать для HTTP/1.1 с keepalive, когда GET /blabla будет не в начале TCP соединения, а на несколько мегабайт "глубже" ? Ну и новая мода с протоколом http://ru.wikipedia.org/wiki/SPDY ...

Точно также оно будет работать. iptables ищет матч строки в теле всех tcp пакетов c dport 80 , которые попали на этот сервер. И кидаеет их в NFQUEUE.

А по поводу SPDY - если без шифрования - то редеректа не покажет, но и на сайт не пустит. А если шифрованный - будем блокировать, как и https. Или есть другие предложения?

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


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

Кто там просил iptables конфигурацию для матча по строке? Она тривиальная:

 

// skip code

 

 

Премного благодарен. Никогда с этой возможностью iptables не работал.

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


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

Сейчас в лабе дорабатываем напильником следующее решение по организации фильтрации (без мега DPI:))

 

<skip>

3. Полученые ip анонсим (кваггой) по бгп в наш транспорт.

4. В результате аплинк-трафик на данные адреса отправляется на фильтрующий сервер. Даунлинк при этом идёт мимо.

5. На сервере с помошью iptables (string matсh) перекидываем пакетики, в которых есть соответствующий URL (из п.2) в NFQUEUE. tcp handshake и другой трафик на эти адреса пролетает насквозь.

<skip>

Наверное, я тормоз, но никак не могу понять, как в таком случае избежать маршрутной петли.

Квагга анонсит more specific, транспорт кидает пакет серверу; тот, к примеру, решает, что ничего в пакете трогать не надо и отдает его обратно в транспорт; транспорт получает пакет от сервера и по идее должен снова вернуть его серверу согласно таблице роутинга.

Петля, не?

Или на серверном SVI висит роут-мап?

 

Остальное более или менее понятно.

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

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


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

5. На сервере с помошью iptables (string matсh) перекидываем пакетики, в которых есть соответствующий URL (из п.2) в NFQUEUE. tcp handshake и другой трафик на эти адреса пролетает насквозь. Т.е. матчится только GET запрос.

А что произойдет, если на какой-то странице на том же 'плохом' IP прямо в тексте страницы (а не в http обмене) будет "GET <плохой URL>"?

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


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

Они там что, сами себе трафик нагнетают?

Только что сливал реестр, до этого слил в полночь. Абсолютно идентичные за исключением времени обновления.

Перед закачкой, конечно выполнял SOAP-запрос на проверку времени, оно тоже было новое, скачал, сравнил - зря качал..

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


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

А что произойдет, если на какой-то странице на том же 'плохом' IP прямо в тексте страницы (а не в http обмене) будет "GET <плохой URL>"?

 

Кстати, не обязательно GET. Может быть и POST, и еще куча вариантов...

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


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

Сейчас в лабе дорабатываем напильником следующее решение по организации фильтрации (без мега DPI:))

 

<skip>

3. Полученые ip анонсим (кваггой) по бгп в наш транспорт.

4. В результате аплинк-трафик на данные адреса отправляется на фильтрующий сервер. Даунлинк при этом идёт мимо.

5. На сервере с помошью iptables (string matсh) перекидываем пакетики, в которых есть соответствующий URL (из п.2) в NFQUEUE. tcp handshake и другой трафик на эти адреса пролетает насквозь.

<skip>

Наверное, я тормоз, но никак не могу понять, как в таком случае избежать маршрутной петли.

Квагга анонсит more specific, транспорт кидает пакет серверу; тот, к примеру, решает, что ничего в пакете трогать не надо и отдает его обратно в транспорт; транспорт получает пакет от сервера и по идее должен снова вернуть его серверу согласно таблице роутинга.

Петля, не?

Или на серверном SVI висит роут-мап?

 

Остальное более или менее понятно.

 

Зависит от топологии сети, могут быть разные варианты.

У нас например, входной и выходной интерфейсы сервера в разных vrf. Cоответственно, на внутреннюю ногу принимаем по бгп абонентские сети, а анонсим плохие ип, на внешнюю - принимаем дефолт, и ничего не анонсируем.

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


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

5. На сервере с помошью iptables (string matсh) перекидываем пакетики, в которых есть соответствующий URL (из п.2) в NFQUEUE. tcp handshake и другой трафик на эти адреса пролетает насквозь. Т.е. матчится только GET запрос.

А что произойдет, если на какой-то странице на том же 'плохом' IP прямо в тексте страницы (а не в http обмене) будет "GET <плохой URL>"?

 

Вы забыли, что смотрим мы только аплинк трафик (от абонента к серверу).

Хотя могу предположить прикольную ситуацию - абонент пытается, к примеру, запостить на форум, размещённый на том "же плохом ip", некий текст с искомым URL, а его редиректит на сайт надзора :)

 

P/S: кстати, string в iptables max.128 символов. Хотя вроде бы при сборке можно задать больше.

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


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

Небольшой оффтопик..

 

А кто-нибудь знает где можно брать обновляемую бд с категориями сайтов? А то есть задумка родительский контроль сделать на базе ДНС. Сам механизм уже реализован, дело за малым - категории в дефиците ((

Ну начни поиск отсюда - http://netpolice.ru/

Они делают свою систему на основе какой-то подобной БД - вообщем по ссылкам на их сайте найдешь.

А вообще это больная тема... Более 10-ти лет назад было предложение вносить категории непосредственно в ТХТ-записи DNS-ов, но... защитники прав и свобод, противники цензуры и правоверные либерасты с дерьмократами зарезали идею на корню. :(

Давно всем известно: всё порно в зоне .XXX, что в других зонах - не порно.

Аналогично и со спамом: то, что в сабже помечено как "Ad: ..." - спам, что без этой пометки - не спам.

 

Эта схема даже должна работать в стране непуганных эльфов... наверное...

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


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

vIv

вот шутки - шутками, а глаза ты мне открыл. Внатуре, какая нафиг категоризация в наши дни, пожалуй откажусь от этого, и оставлю только индивидуальные блэклисты для родителей, пусть в личном кабинете сами вносят куда ходить, а куда нет.

 

Тогда вопрос в зал.

Если надо на уровне DNS ввести запреты, кто как решает?

У меня самописная DNS-прокладка типа прокси. Проверяются хосты на наличие в глобальном и индивидуальном блэклисте запрашивающего. При запрете вываливается статичекий ип, при разрешении перезапрашивается на нормальном ДНС и отдается абоненту.

Кто-то тут упоминал про "бэкенд" для PowerDNS, что за зверь и с чем его едят?

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


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

Это тогда только вайтлисты, так как самостоятельно составлять блэк это как-то слабо реально.

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


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

vIv

вот шутки - шутками, а глаза ты мне открыл. Внатуре, какая нафиг категоризация в наши дни, пожалуй откажусь от этого, и оставлю только индивидуальные блэклисты для родителей, пусть в личном кабинете сами вносят куда ходить, а куда нет.

 

Тогда вопрос в зал.

Если надо на уровне DNS ввести запреты, кто как решает?

У меня самописная DNS-прокладка типа прокси. Проверяются хосты на наличие в глобальном и индивидуальном блэклисте запрашивающего. При запрете вываливается статичекий ип, при разрешении перезапрашивается на нормальном ДНС и отдается абоненту.

Кто-то тут упоминал про "бэкенд" для PowerDNS, что за зверь и с чем его едят?

Интересно. А кого вы хотите ДНС фильтром остановить? Пионеры в отличии от родителей уже давно умеют прописывать ДНС типа 8.8.8.8 8.8.4.4 и спокойно правят hosts. Не говоря уж о торе, анонимайзерах и прочем.

Или лавры SkyDNS покоя не дают? Так есть альтернативный бесплатный rejector.ru.

Есть еще фильтр (бесплатный) icensor.ru разработчики которого говорят о готовности на коммерческой основе поделиться базой сайтов и по их же заверениям услугой пользуется Мегафон.

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


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

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 смайлов.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.