Поиск в черном списке для всего Интернета
Поиск в черном списке для всего Интернета
В последнем примере программы на вопрос «Спамер ли это?» мы отвечали, руководствуясь собственным мнением об узле или домене, не принимая во внимание опыт остальных пользователей Интернета. Существуют несколько спорные службы, предлагающие простой доступ к глобальным черным спискам спамеров или известных узлов, открыто допускающих ретрансляцию почты. Две хорошо известные службы такого типа - Realtime Blackhole List (RBL) от Mail Abuse Prevention System и Open Relay Behaviour-modification System (ORBS). Для получения доступа к этим спискам:
- Измените на обратный порядок следования элементов проверяемого IP-адреса. Например, 192.168.1. 34 станет 34.1.168.192.
- Добавьте специальное имя домена к полученному числу. Для проверки адреса в RBL необходимо использовать 34.1.168.192. rbl.
- Выполните запрос к DNS-серверу для данного адреса. Если вы получите положительный ответ (т. е. запись о ресурсах А), это означает, что данный IP-адрес находится в черном списке.
Несколько менее спорным является список Dial-up User List, также поддерживаемый силами специалистов из Mail Abuse Prevention System. Это список диапазонов IP-адресов, динамически присваиваемых модемным пулам. Теоретически, SMTP-соединения не должны исходить от какого-либо из этих узлов. Почта с таких узлов должна отправляться через почтовый сервер провайдера (которого нет в этом списке).
Вот один из способов проверить, находится ли IP-адрес в каком-либо из этих списков:
sub checkaddr{
my($ip,Sdomain) = @_;
return undef unless (defined Sip);
my $lookupip = join('.',reverse split(/\./,$ip));
if (gethostbyname($lookupip.$domain)){
return Sip; } else {
return undef; } }
Очень скоро эта подпрограмма будет добавлена в предпоследний пример этого раздела. А пока, располагая существенно большим объемом информации о каждом из заголовков Received:, попробуем вычислить человека или людей, ответственных за администрирование каждой машины из списка. Модуль Net: ;Whois, уже рассмотренный в главе 6, вероятно, первым будет использоваться для решения этой проблемы.
К сожалению, этот модуль специализируется только на получении информации о связи имен и доменов (name-to-domain information). Кроме того, он «предполагает», что информация будет представлена в виде, используемом InterNIC. Нам могут понадобиться сведения о связи IP-адресов и доменов (IP address-to-domain information) от WHOIS-серверов на http://whois.arin.net (American Registry for Internet Numbers), http://whois.ripe.net (European IP Address Allocations) и http:// whois.apnic.net (Asia Pacific Address Allocations). Отсутствие соответствующего модуля - первое препятствие, которое необходимо преодолеть.
Но даже если бы мы знали, как соединиться со всеми этими реестрами и обработать их различные форматы вывода, было бы неясно, к какому из них нужно обращаться для поиска информации о данном IP-адресе. Нам необходимо определить, к какому серверу нужно обратиться, и это второе препятствие. К счастью, если обратиться к ARIN с запросом по адресу, не принадлежащему его базе данных, он направит нас на нужный реестр. Так что, если мы спросим ARIN об адресе из Японии, он отправит нас на APNIC.
Для преодоления первого препятствия можно использовать модуль общего назначения, подобный Net: :Telnet из главы 6. Другой путь - уже рассмотренный модуль 10: :Socket. Что выбрать- дело личных предпочтений, ну и, конечно, необходима возможность доступа к нему с вашей платформы.
Служба WHOIS работает на порту 43 TCP, хотя ее имя будет использоваться только в целях предосторожности. С WHOIS-сервером очень просто общаться. Необходимо соединиться, выполнить запрос (в нашем случае это IP-адрес) и получить ответ. Программа, запрашивающая произвольный WHOIS-сервер, очень проста:
sub getwhois{
my($ip) = shift; my(Sinfo);
$cn = new Net::Telnet(Host => Swhoishost, Port => 'wliois',
Errmode => "return", Timeout => 30)
or die "Невозможно установить -соединении с
Swhoishost connection:$!\n";
unless ($cn->print($ip."\n")){
$cn->close;
die "Невозможно послать
$ip на Swhoishost: ".$cn->errmsg."Vv }
while ($ret = $cn->get){
Sinfo ,=$ret; };
$cn->close;
return $info; 1
Для преодоления второго препятствия, состоящего в выборе нужного реестра, есть, по крайней мере, две возможности. Можно послать запрос к http://whois.arin.net и проанализировать ответ. Например, вот запись диалога с ARIN по поводу IP-адреса японской машины. Жирный шрифт используется для выделения текста, введенного человеком:
X telnet whois.arin.net 43
Trying 192.149.252.22 ..
Connected to whois. arm. not Escape character is '"] 210.161.92.226
Asia Pacific Network Information Center (NETBLK-APNIC-CIDR-BLK)
Level 1 - 33 Park Roan1 Milton, 4064 AU
Netname: APNIC-CIDR-BLK2
Netblock: 210.0.0.0 - 211.255.255.0
Coordinator;
Administrator, System (SA90-ARIN)
sysadn®APNIC,NET +61-7-3367-0490
Domain System inverse mapping provided by:
SVC01.APNIC.NET 202.12.28.131
NS.TELSTRA.NET 203.50.0.137
NS.KRNIC.NET 202.30.64.21
NS.RIPE.NET 193.0.0.193
-** please refer to whois.apnic.net for more information *«*
*«* before contacting APNIC
*-« use whois -h whois.apnic.net <object> *»*
Record last updated on 04-Mar-99.
Database last updated on 19-Apr-99 16:14:16 EOT.
Подобные результаты означают, что запрос нужно послать к http:// whois.apnic.net.
Другой способ - послать запрос к «умному» WHOIS-серверу, который сделает всю работу сам. Из них мне больше всего нравится сервер -http://whois.geektools.com. «Умник» проанализирует ваш запрос, отправит его на нужный WHOIS-сервер и вернет результаты. Тому, кто пользуется этой службой, не нужно беспокоиться о том, на каком именно сервере хранится информация.
Чтобы код программы сильно не разрастался, а мы не отвлекались от обсуждаемой темы, будем пользоваться вторым (более простым) способом.
Поместим все эти маленькие запросы в одну большую программу и запустим ее. Итак, если нужно выполнить все приведенные выше подпрограммы с нашим примером сообщения:
use Mail:'Header: use Socket; use BerkeleyDB;
use Net::Telnet;
$header = new Mail-Header \*STDIN;
Sheader ->unfold('Received'); @received = $header->get('Received'):
Srbldomain = ".rbl.maps.vix.com" Sorbsdomain = ".relays.orbs.org";
Sduldomain = ".dul.maps.vix.com": Sblacklist = "/etc/mail/blacklist.db":
Swhoishost = "whois.geektools.com";
&loadblist;
for (reverse @received){ chomp;
parseline($_);
if (!defined $ehelo and !defined Svalidname and !defined $validip){ print "$Дп";
>
else {
Sflags = (&checkaddr($validip:$rbldomain) ? "R" : ""):
# в RBI/' $flags .= (&checkaddr($validip,$orbsdomairi) ? "0" : "");
в ORBS9 Sflags ,= (&checkaddr($validip. Sduldomain) ? "D......);
$flags .= (&checkblist($_) 9 "B" : ""): # в нашем спи
$flags .= (&checkrev($validip,$validname) ? "L" "");
(I rev-.;o.;k: push(@iplist,Svalidip);
write; } }
for (@iplist){
print "\nWHOIS info for $_:\n"; print &getwhois($_); >
format STDOUT =
@««««««««<«« @<«««««<'<««««««<«««««
Sehelo.Svalidname.Svalidip.Sflags
то будут получены такие результаты (слегка сокращенные):
login_0246.whynot.net mx.whynot.net 206.212.231 88 ;
extreme host-209-214-9-150 :r.a 209.214.9.150 Or
isiteinc.cori www.isiteinc.com 206,136 243 2
WHOIS info for 206,212.231.88:
WHOIS info for 209.214.9.150;
BellSouth.net Inc. (NETBLK-BELLSNET-BLK4)
1100 Ashwood Parkway
Atlanta. GA 30338
Netname: BELLSNET-BLK4
Netblock: 209.214.0.0 - 209.215.255.255
Maintainer: BELL
Coordinator-...
WHOIS info for 206.136.243.2:
Brainsell Incorporated (NET-ISITEINC)
4105-R Laguna St.
Coral Gaoles, FL 33146
US
Netname: ISITEINC Netnumber: 206.136.243.0
Coordinator:...
Гораздо лучше! Теперь нам известно:
- Спамер дал неверные ответы HELO/EHLO.
- Первый узел, по всей вероятности, фальшивый (не удалась попытка разыменования, и по нему нет информации WHOIS).
- Сообщение, скорее всего, попало в сеть через соединение по телефонным линиям.
- Два из этих адресов уже находятся в нашем черном списке.
- ORBS они тоже не нравятся.
- Кроме того, нам известна контактная информация для связи с провайдером.
Perl помог разобраться с непрошеной коммерческой почтой.
Впрочем, спам это очень неприятная вещь. Лучше перейдем к более приятной теме, например, к взаимодействию пользователей средствами электронной почты.