Когда малолетние скрипт-киддисы и другие нехорошие личности совсем достают попытками подбора пароля к SSH, сканированием портов и прочей гадостью, бывает совсем неплохо сообщить об их действиях их провайдеру. Здесь возникает вопрос получения контактной информации технической поддержки провайдера/хостера нарушителя по его IP-адресу. И хотя данная информация является общедоступной (её можно извлечь из данных whois), на практике автоматизировать разбор записей whois не всегда тривиально (abuse-контакт может находиться как в e-mail, remarks, так и в любой другой секции, причём правильным может быть только один адрес).
К счастью, есть два сервиса, позволяющие получить контактную информацию техподдержки по IP-адресу или имени домена:
- Network Abuse Clearinghouse — определение контактной информации по домену нарушителя. В основном используется для сообщений о спаме. Проблема в том, что если контактный адрес не зарегистрирован, будут предложены контакты
abuse@и/илиpostmaster@, что не эффективно, если нарушителю принадлежит весь домен. - Abuse Contact DB — определение контактной информации по IP-адресу нарушителя. Данный сервис «назначает ответственным» не владельца домена, соответствующего IP-адресу, а его провайдера или хостера, что во многих случаях предпочтительнее.
Оба сервиса поддерживают DNS-запросы в стиле RHSBL (abuse.net) и DNSBL (abusix.org).
Ниже приведён простой скрипт на Perl, который извлекает контактную информацию из базы данных Abusix по IP-адресу нарушителя. Скрипт можно использовать вместе с Login Failure Daemon — LFD отправляет отчёты в формате X-ARF пользователю root; используя контактную информацию из Abusix отчеты можно перенаправлять в техподдержку в отдел жалоб и нарушений.
#! /usr/bin/perl
use strict;
use warnings;
use Net::DNS;
my $ip = $ARGV[0] or die("Usage: abusix ip_address");
$ip = join('.', reverse(split(/\./, $ip))) . '.abuse-contacts.abusix.org';
my $res = Net::DNS::Resolver->new;
my $query = $res->query($ip, 'TXT');
if ($query) {
foreach my $rr ($query->answer) {
next unless $rr->type eq 'TXT';
my $s = $rr->rdatastr;
$s =~ s/^"//;
$s =~ s/"$//;
print $s, "\n";
}
}
else {
die('Query failed: ' . $res->errorstring . "\n");
}
