Когда малолетние скрипт-киддисы и другие нехорошие личности совсем достают попытками подбора пароля к 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"); }